Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
402 BP
Holders
58
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 BPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
BluePenguin
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-15 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex = 1; // 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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex - 1; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * 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) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @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 tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract BluePenguin is ERC721A, Ownable { constructor() ERC721A("BluePenguin", "BP") {} uint public constant maxAmountPerWalletAndTransaction = 50; uint public constant maxSupply = 5555; uint public price = 0.03 ether; mapping(address => uint) public _maxAmountPerWallet; function _baseURI() internal pure override returns (string memory) { return "ipfs://Qma9Kok6oyBiqGWXZ68h8oqFBoy61CA1fV5S5b8SF5cPmQ/"; } function setPrice(uint _price) external onlyOwner { price = _price; } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function ownerMint(uint amount) external onlyOwner { require(currentIndex + amount <= 201, "Not allowed!"); _safeMint(msg.sender, amount); } function saleMint(uint amount) external payable { require(currentIndex > 200, "Sale not active!"); require(amount <= maxAmountPerWalletAndTransaction, "Incorrect amount!"); require(_maxAmountPerWallet[msg.sender] + amount <= maxAmountPerWalletAndTransaction, "Not allowed!"); require(currentIndex + amount <= maxSupply + 1, "Not allowed!"); require(msg.value == price * amount, "Incorrect value!"); _safeMint(msg.sender, amount); _maxAmountPerWallet[msg.sender] += amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_maxAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountPerWalletAndTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600055666a94d74f4300006008553480156200002157600080fd5b506040518060400160405280600b81526020017f426c756550656e6775696e0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f42500000000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000a6929190620001b6565b508060029080519060200190620000bf929190620001b6565b505050620000e2620000d6620000e860201b60201c565b620000f060201b60201c565b620002cb565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c49062000295565b90600052602060002090601f016020900481019282620001e8576000855562000234565b82601f106200020357805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023357825182559160200191906001019062000216565b5b50905062000243919062000247565b5090565b5b808211156200026257600081600090555060010162000248565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ae57607f821691505b60208210811415620002c557620002c462000266565b5b50919050565b613db480620002db6000396000f3fe60806040526004361061019c5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105cb578063e985e9c5146105f6578063f19e75d414610633578063f2fde38b1461065c5761019c565b8063a22cb4651461053c578063b88d4fde14610565578063c87b56dd1461058e5761019c565b806390ea3cfa116100c657806390ea3cfa1461048057806391b7f5ed146104bd57806395d89b41146104e6578063a035b1fe146105115761019c565b8063715018a6146104225780638ca887ca146104395780638da5cb5b146104555761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e146103425780634f6ccce71461036b5780636352211e146103a857806370a08231146103e55761019c565b806323b872dd146102c55780632f745c59146102ee5780633ccfd60b1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631f2da25b1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906127a0565b610685565b6040516101d591906127e8565b60405180910390f35b3480156101ea57600080fd5b506101f36107cf565b604051610200919061289c565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906128f4565b610861565b60405161023d9190612962565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906129a9565b6108e6565b005b34801561027b57600080fd5b506102846109ff565b60405161029191906129f8565b60405180910390f35b3480156102a657600080fd5b506102af610a15565b6040516102bc91906129f8565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612a13565b610a1a565b005b3480156102fa57600080fd5b50610315600480360381019061031091906129a9565b610a2a565b60405161032291906129f8565b60405180910390f35b34801561033757600080fd5b50610340610c1c565b005b34801561034e57600080fd5b5061036960048036038101906103649190612a13565b610ce1565b005b34801561037757600080fd5b50610392600480360381019061038d91906128f4565b610d01565b60405161039f91906129f8565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906128f4565b610d54565b6040516103dc9190612962565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190612a66565b610d6a565b60405161041991906129f8565b60405180910390f35b34801561042e57600080fd5b50610437610e53565b005b610453600480360381019061044e91906128f4565b610edb565b005b34801561046157600080fd5b5061046a611102565b6040516104779190612962565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612a66565b61112c565b6040516104b491906129f8565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906128f4565b611144565b005b3480156104f257600080fd5b506104fb6111ca565b604051610508919061289c565b60405180910390f35b34801561051d57600080fd5b5061052661125c565b60405161053391906129f8565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190612abf565b611262565b005b34801561057157600080fd5b5061058c60048036038101906105879190612c34565b6113e3565b005b34801561059a57600080fd5b506105b560048036038101906105b091906128f4565b61143f565b6040516105c2919061289c565b60405180910390f35b3480156105d757600080fd5b506105e06114e7565b6040516105ed91906129f8565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190612cb7565b6114ed565b60405161062a91906127e8565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906128f4565b611581565b005b34801561066857600080fd5b50610683600480360381019061067e9190612a66565b61165b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c857506107c782611753565b5b9050919050565b6060600180546107de90612d26565b80601f016020809104026020016040519081016040528092919081815260200182805461080a90612d26565b80156108575780601f1061082c57610100808354040283529160200191610857565b820191906000526020600020905b81548152906001019060200180831161083a57829003601f168201915b5050505050905090565b600061086c826117bd565b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290612dca565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f182610d54565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990612e5c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109816117ca565b73ffffffffffffffffffffffffffffffffffffffff1614806109b057506109af816109aa6117ca565b6114ed565b5b6109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e690612eee565b60405180910390fd5b6109fa8383836117d2565b505050565b60006001600054610a109190612f3d565b905090565b603281565b610a25838383611884565b505050565b6000610a3583610d6a565b8210610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90612fe3565b60405180910390fd5b6000610a806109ff565b905060008060005b83811015610bda576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b7a57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bcc5786841415610bc3578195505050505050610c16565b83806001019450505b508080600101915050610a88565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90613075565b60405180910390fd5b92915050565b610c246117ca565b73ffffffffffffffffffffffffffffffffffffffff16610c42611102565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f906130e1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cde573d6000803e3d6000fd5b50565b610cfc838383604051806020016040528060008152506113e3565b505050565b6000610d0b6109ff565b8210610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613173565b60405180910390fd5b819050919050565b6000610d5f82611dc4565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290613205565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610e5b6117ca565b73ffffffffffffffffffffffffffffffffffffffff16610e79611102565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906130e1565b60405180910390fd5b610ed96000611f5e565b565b60c860005411610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613271565b60405180910390fd5b6032811115610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b906132dd565b60405180910390fd5b603281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb191906132fd565b1115610ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe99061339f565b60405180910390fd5b60016115b361100191906132fd565b8160005461100f91906132fd565b1115611050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110479061339f565b60405180910390fd5b8060085461105e91906133bf565b341461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690613465565b60405180910390fd5b6110a93382612024565b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f891906132fd565b9250508190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60096020528060005260406000206000915090505481565b61114c6117ca565b73ffffffffffffffffffffffffffffffffffffffff1661116a611102565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b7906130e1565b60405180910390fd5b8060088190555050565b6060600280546111d990612d26565b80601f016020809104026020016040519081016040528092919081815260200182805461120590612d26565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b60085481565b61126a6117ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906134d1565b60405180910390fd5b80600660006112e56117ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113926117ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d791906127e8565b60405180910390a35050565b6113ee848484611884565b6113fa84848484612042565b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613563565b60405180910390fd5b50505050565b606061144a826117bd565b611489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611480906135f5565b60405180910390fd5b60006114936121ca565b90506000815114156114b457604051806020016040528060008152506114df565b806114be846121ea565b6040516020016114cf92919061369d565b6040516020818303038152906040525b915050919050565b6115b381565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115896117ca565b73ffffffffffffffffffffffffffffffffffffffff166115a7611102565b73ffffffffffffffffffffffffffffffffffffffff16146115fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f4906130e1565b60405180910390fd5b60c98160005461160d91906132fd565b111561164e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116459061339f565b60405180910390fd5b6116583382612024565b50565b6116636117ca565b73ffffffffffffffffffffffffffffffffffffffff16611681611102565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e9061373e565b60405180910390fd5b61175081611f5e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061188f82611dc4565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166118b66117ca565b73ffffffffffffffffffffffffffffffffffffffff16148061191257506118db6117ca565b73ffffffffffffffffffffffffffffffffffffffff166118fa84610861565b73ffffffffffffffffffffffffffffffffffffffff16145b8061192e575061192d82600001516119286117ca565b6114ed565b5b905080611970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611967906137d0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906138f4565b60405180910390fd5b611a5f858585600161234b565b611a6f60008484600001516117d2565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d5457611cb3816117bd565b15611d535782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dbd8585856001612351565b5050505050565b611dcc6126fa565b611dd5826117bd565b611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90613986565b60405180910390fd5b60008290505b60008110611f1d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0e578092505050611f59565b50808060019003915050611e1a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613a18565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61203e828260405180602001604052806000815250612357565b5050565b60006120638473ffffffffffffffffffffffffffffffffffffffff16612369565b156121bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208c6117ca565b8786866040518563ffffffff1660e01b81526004016120ae9493929190613a8d565b6020604051808303816000875af19250505080156120ea57506040513d601f19601f820116820180604052508101906120e79190613aee565b60015b61216d573d806000811461211a576040519150601f19603f3d011682016040523d82523d6000602084013e61211f565b606091505b50600081511415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613563565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c2565b600190505b949350505050565b6060604051806060016040528060368152602001613d4960369139905090565b60606000821415612232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612346565b600082905060005b6000821461226457808061224d90613b1b565b915050600a8261225d9190613b93565b915061223a565b60008167ffffffffffffffff8111156122805761227f612b09565b5b6040519080825280601f01601f1916602001820160405280156122b25781602001600182028036833780820191505090505b5090505b6000851461233f576001826122cb9190612f3d565b9150600a856122da9190613bc4565b60306122e691906132fd565b60f81b8183815181106122fc576122fb613bf5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123389190613b93565b94506122b6565b8093505050505b919050565b50505050565b50505050565b612364838383600161237c565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613c96565b60405180910390fd5b6000841415612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90613d28565b60405180910390fd5b612443600086838761234b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156126dd57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156126c8576126886000888488612042565b6126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be90613563565b60405180910390fd5b5b81806001019250508080600101915050612611565b5080600081905550506126f36000868387612351565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61277d81612748565b811461278857600080fd5b50565b60008135905061279a81612774565b92915050565b6000602082840312156127b6576127b561273e565b5b60006127c48482850161278b565b91505092915050565b60008115159050919050565b6127e2816127cd565b82525050565b60006020820190506127fd60008301846127d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561283d578082015181840152602081019050612822565b8381111561284c576000848401525b50505050565b6000601f19601f8301169050919050565b600061286e82612803565b612878818561280e565b935061288881856020860161281f565b61289181612852565b840191505092915050565b600060208201905081810360008301526128b68184612863565b905092915050565b6000819050919050565b6128d1816128be565b81146128dc57600080fd5b50565b6000813590506128ee816128c8565b92915050565b60006020828403121561290a5761290961273e565b5b6000612918848285016128df565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061294c82612921565b9050919050565b61295c81612941565b82525050565b60006020820190506129776000830184612953565b92915050565b61298681612941565b811461299157600080fd5b50565b6000813590506129a38161297d565b92915050565b600080604083850312156129c0576129bf61273e565b5b60006129ce85828601612994565b92505060206129df858286016128df565b9150509250929050565b6129f2816128be565b82525050565b6000602082019050612a0d60008301846129e9565b92915050565b600080600060608486031215612a2c57612a2b61273e565b5b6000612a3a86828701612994565b9350506020612a4b86828701612994565b9250506040612a5c868287016128df565b9150509250925092565b600060208284031215612a7c57612a7b61273e565b5b6000612a8a84828501612994565b91505092915050565b612a9c816127cd565b8114612aa757600080fd5b50565b600081359050612ab981612a93565b92915050565b60008060408385031215612ad657612ad561273e565b5b6000612ae485828601612994565b9250506020612af585828601612aaa565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4182612852565b810181811067ffffffffffffffff82111715612b6057612b5f612b09565b5b80604052505050565b6000612b73612734565b9050612b7f8282612b38565b919050565b600067ffffffffffffffff821115612b9f57612b9e612b09565b5b612ba882612852565b9050602081019050919050565b82818337600083830152505050565b6000612bd7612bd284612b84565b612b69565b905082815260208101848484011115612bf357612bf2612b04565b5b612bfe848285612bb5565b509392505050565b600082601f830112612c1b57612c1a612aff565b5b8135612c2b848260208601612bc4565b91505092915050565b60008060008060808587031215612c4e57612c4d61273e565b5b6000612c5c87828801612994565b9450506020612c6d87828801612994565b9350506040612c7e878288016128df565b925050606085013567ffffffffffffffff811115612c9f57612c9e612743565b5b612cab87828801612c06565b91505092959194509250565b60008060408385031215612cce57612ccd61273e565b5b6000612cdc85828601612994565b9250506020612ced85828601612994565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d3e57607f821691505b60208210811415612d5257612d51612cf7565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000612db4602d8361280e565b9150612dbf82612d58565b604082019050919050565b60006020820190508181036000830152612de381612da7565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e4660228361280e565b9150612e5182612dea565b604082019050919050565b60006020820190508181036000830152612e7581612e39565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000612ed860398361280e565b9150612ee382612e7c565b604082019050919050565b60006020820190508181036000830152612f0781612ecb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f48826128be565b9150612f53836128be565b925082821015612f6657612f65612f0e565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fcd60228361280e565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061305f602e8361280e565b915061306a82613003565b604082019050919050565b6000602082019050818103600083015261308e81613052565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130cb60208361280e565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061315d60238361280e565b915061316882613101565b604082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006131ef602b8361280e565b91506131fa82613193565b604082019050919050565b6000602082019050818103600083015261321e816131e2565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b600061325b60108361280e565b915061326682613225565b602082019050919050565b6000602082019050818103600083015261328a8161324e565b9050919050565b7f496e636f727265637420616d6f756e7421000000000000000000000000000000600082015250565b60006132c760118361280e565b91506132d282613291565b602082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b6000613308826128be565b9150613313836128be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561334857613347612f0e565b5b828201905092915050565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b6000613389600c8361280e565b915061339482613353565b602082019050919050565b600060208201905081810360008301526133b88161337c565b9050919050565b60006133ca826128be565b91506133d5836128be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561340e5761340d612f0e565b5b828202905092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b600061344f60108361280e565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006134bb601a8361280e565b91506134c682613485565b602082019050919050565b600060208201905081810360008301526134ea816134ae565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061354d60338361280e565b9150613558826134f1565b604082019050919050565b6000602082019050818103600083015261357c81613540565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135df602f8361280e565b91506135ea82613583565b604082019050919050565b6000602082019050818103600083015261360e816135d2565b9050919050565b600081905092915050565b600061362b82612803565b6136358185613615565b935061364581856020860161281f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613687600583613615565b915061369282613651565b600582019050919050565b60006136a98285613620565b91506136b58284613620565b91506136c08261367a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061372860268361280e565b9150613733826136cc565b604082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006137ba60328361280e565b91506137c58261375e565b604082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061384c60268361280e565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138de60258361280e565b91506138e982613882565b604082019050919050565b6000602082019050818103600083015261390d816138d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000613970602a8361280e565b915061397b82613914565b604082019050919050565b6000602082019050818103600083015261399f81613963565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000613a02602f8361280e565b9150613a0d826139a6565b604082019050919050565b60006020820190508181036000830152613a31816139f5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a5f82613a38565b613a698185613a43565b9350613a7981856020860161281f565b613a8281612852565b840191505092915050565b6000608082019050613aa26000830187612953565b613aaf6020830186612953565b613abc60408301856129e9565b8181036060830152613ace8184613a54565b905095945050505050565b600081519050613ae881612774565b92915050565b600060208284031215613b0457613b0361273e565b5b6000613b1284828501613ad9565b91505092915050565b6000613b26826128be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b5957613b58612f0e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b9e826128be565b9150613ba9836128be565b925082613bb957613bb8613b64565b5b828204905092915050565b6000613bcf826128be565b9150613bda836128be565b925082613bea57613be9613b64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c8060218361280e565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000613d1260288361280e565b9150613d1d82613cb6565b604082019050919050565b60006020820190508181036000830152613d4181613d05565b905091905056fe697066733a2f2f516d61394b6f6b366f794269714757585a363868386f7146426f7936314341316656355335623853463563506d512fa264697066735822122092850956d21ac936b19369132cbd1e43e8f9c241e8807ff32949c2b00073b62b64736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063d5abeb0111610064578063d5abeb01146105cb578063e985e9c5146105f6578063f19e75d414610633578063f2fde38b1461065c5761019c565b8063a22cb4651461053c578063b88d4fde14610565578063c87b56dd1461058e5761019c565b806390ea3cfa116100c657806390ea3cfa1461048057806391b7f5ed146104bd57806395d89b41146104e6578063a035b1fe146105115761019c565b8063715018a6146104225780638ca887ca146104395780638da5cb5b146104555761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e146103425780634f6ccce71461036b5780636352211e146103a857806370a08231146103e55761019c565b806323b872dd146102c55780632f745c59146102ee5780633ccfd60b1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631f2da25b1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906127a0565b610685565b6040516101d591906127e8565b60405180910390f35b3480156101ea57600080fd5b506101f36107cf565b604051610200919061289c565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906128f4565b610861565b60405161023d9190612962565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906129a9565b6108e6565b005b34801561027b57600080fd5b506102846109ff565b60405161029191906129f8565b60405180910390f35b3480156102a657600080fd5b506102af610a15565b6040516102bc91906129f8565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612a13565b610a1a565b005b3480156102fa57600080fd5b50610315600480360381019061031091906129a9565b610a2a565b60405161032291906129f8565b60405180910390f35b34801561033757600080fd5b50610340610c1c565b005b34801561034e57600080fd5b5061036960048036038101906103649190612a13565b610ce1565b005b34801561037757600080fd5b50610392600480360381019061038d91906128f4565b610d01565b60405161039f91906129f8565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca91906128f4565b610d54565b6040516103dc9190612962565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190612a66565b610d6a565b60405161041991906129f8565b60405180910390f35b34801561042e57600080fd5b50610437610e53565b005b610453600480360381019061044e91906128f4565b610edb565b005b34801561046157600080fd5b5061046a611102565b6040516104779190612962565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612a66565b61112c565b6040516104b491906129f8565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906128f4565b611144565b005b3480156104f257600080fd5b506104fb6111ca565b604051610508919061289c565b60405180910390f35b34801561051d57600080fd5b5061052661125c565b60405161053391906129f8565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190612abf565b611262565b005b34801561057157600080fd5b5061058c60048036038101906105879190612c34565b6113e3565b005b34801561059a57600080fd5b506105b560048036038101906105b091906128f4565b61143f565b6040516105c2919061289c565b60405180910390f35b3480156105d757600080fd5b506105e06114e7565b6040516105ed91906129f8565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190612cb7565b6114ed565b60405161062a91906127e8565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906128f4565b611581565b005b34801561066857600080fd5b50610683600480360381019061067e9190612a66565b61165b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c857506107c782611753565b5b9050919050565b6060600180546107de90612d26565b80601f016020809104026020016040519081016040528092919081815260200182805461080a90612d26565b80156108575780601f1061082c57610100808354040283529160200191610857565b820191906000526020600020905b81548152906001019060200180831161083a57829003601f168201915b5050505050905090565b600061086c826117bd565b6108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290612dca565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f182610d54565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990612e5c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109816117ca565b73ffffffffffffffffffffffffffffffffffffffff1614806109b057506109af816109aa6117ca565b6114ed565b5b6109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e690612eee565b60405180910390fd5b6109fa8383836117d2565b505050565b60006001600054610a109190612f3d565b905090565b603281565b610a25838383611884565b505050565b6000610a3583610d6a565b8210610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90612fe3565b60405180910390fd5b6000610a806109ff565b905060008060005b83811015610bda576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b7a57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bcc5786841415610bc3578195505050505050610c16565b83806001019450505b508080600101915050610a88565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0d90613075565b60405180910390fd5b92915050565b610c246117ca565b73ffffffffffffffffffffffffffffffffffffffff16610c42611102565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f906130e1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cde573d6000803e3d6000fd5b50565b610cfc838383604051806020016040528060008152506113e3565b505050565b6000610d0b6109ff565b8210610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613173565b60405180910390fd5b819050919050565b6000610d5f82611dc4565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290613205565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610e5b6117ca565b73ffffffffffffffffffffffffffffffffffffffff16610e79611102565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906130e1565b60405180910390fd5b610ed96000611f5e565b565b60c860005411610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613271565b60405180910390fd5b6032811115610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b906132dd565b60405180910390fd5b603281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb191906132fd565b1115610ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe99061339f565b60405180910390fd5b60016115b361100191906132fd565b8160005461100f91906132fd565b1115611050576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110479061339f565b60405180910390fd5b8060085461105e91906133bf565b341461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690613465565b60405180910390fd5b6110a93382612024565b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f891906132fd565b9250508190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60096020528060005260406000206000915090505481565b61114c6117ca565b73ffffffffffffffffffffffffffffffffffffffff1661116a611102565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b7906130e1565b60405180910390fd5b8060088190555050565b6060600280546111d990612d26565b80601f016020809104026020016040519081016040528092919081815260200182805461120590612d26565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b60085481565b61126a6117ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906134d1565b60405180910390fd5b80600660006112e56117ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113926117ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d791906127e8565b60405180910390a35050565b6113ee848484611884565b6113fa84848484612042565b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613563565b60405180910390fd5b50505050565b606061144a826117bd565b611489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611480906135f5565b60405180910390fd5b60006114936121ca565b90506000815114156114b457604051806020016040528060008152506114df565b806114be846121ea565b6040516020016114cf92919061369d565b6040516020818303038152906040525b915050919050565b6115b381565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115896117ca565b73ffffffffffffffffffffffffffffffffffffffff166115a7611102565b73ffffffffffffffffffffffffffffffffffffffff16146115fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f4906130e1565b60405180910390fd5b60c98160005461160d91906132fd565b111561164e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116459061339f565b60405180910390fd5b6116583382612024565b50565b6116636117ca565b73ffffffffffffffffffffffffffffffffffffffff16611681611102565b73ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ce906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e9061373e565b60405180910390fd5b61175081611f5e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061188f82611dc4565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166118b66117ca565b73ffffffffffffffffffffffffffffffffffffffff16148061191257506118db6117ca565b73ffffffffffffffffffffffffffffffffffffffff166118fa84610861565b73ffffffffffffffffffffffffffffffffffffffff16145b8061192e575061192d82600001516119286117ca565b6114ed565b5b905080611970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611967906137d0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906138f4565b60405180910390fd5b611a5f858585600161234b565b611a6f60008484600001516117d2565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d5457611cb3816117bd565b15611d535782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dbd8585856001612351565b5050505050565b611dcc6126fa565b611dd5826117bd565b611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b90613986565b60405180910390fd5b60008290505b60008110611f1d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0e578092505050611f59565b50808060019003915050611e1a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613a18565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61203e828260405180602001604052806000815250612357565b5050565b60006120638473ffffffffffffffffffffffffffffffffffffffff16612369565b156121bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261208c6117ca565b8786866040518563ffffffff1660e01b81526004016120ae9493929190613a8d565b6020604051808303816000875af19250505080156120ea57506040513d601f19601f820116820180604052508101906120e79190613aee565b60015b61216d573d806000811461211a576040519150601f19603f3d011682016040523d82523d6000602084013e61211f565b606091505b50600081511415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613563565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121c2565b600190505b949350505050565b6060604051806060016040528060368152602001613d4960369139905090565b60606000821415612232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612346565b600082905060005b6000821461226457808061224d90613b1b565b915050600a8261225d9190613b93565b915061223a565b60008167ffffffffffffffff8111156122805761227f612b09565b5b6040519080825280601f01601f1916602001820160405280156122b25781602001600182028036833780820191505090505b5090505b6000851461233f576001826122cb9190612f3d565b9150600a856122da9190613bc4565b60306122e691906132fd565b60f81b8183815181106122fc576122fb613bf5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123389190613b93565b94506122b6565b8093505050505b919050565b50505050565b50505050565b612364838383600161237c565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613c96565b60405180910390fd5b6000841415612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90613d28565b60405180910390fd5b612443600086838761234b565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156126dd57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156126c8576126886000888488612042565b6126c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126be90613563565b60405180910390fd5b5b81806001019250508080600101915050612611565b5080600081905550506126f36000868387612351565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61277d81612748565b811461278857600080fd5b50565b60008135905061279a81612774565b92915050565b6000602082840312156127b6576127b561273e565b5b60006127c48482850161278b565b91505092915050565b60008115159050919050565b6127e2816127cd565b82525050565b60006020820190506127fd60008301846127d9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561283d578082015181840152602081019050612822565b8381111561284c576000848401525b50505050565b6000601f19601f8301169050919050565b600061286e82612803565b612878818561280e565b935061288881856020860161281f565b61289181612852565b840191505092915050565b600060208201905081810360008301526128b68184612863565b905092915050565b6000819050919050565b6128d1816128be565b81146128dc57600080fd5b50565b6000813590506128ee816128c8565b92915050565b60006020828403121561290a5761290961273e565b5b6000612918848285016128df565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061294c82612921565b9050919050565b61295c81612941565b82525050565b60006020820190506129776000830184612953565b92915050565b61298681612941565b811461299157600080fd5b50565b6000813590506129a38161297d565b92915050565b600080604083850312156129c0576129bf61273e565b5b60006129ce85828601612994565b92505060206129df858286016128df565b9150509250929050565b6129f2816128be565b82525050565b6000602082019050612a0d60008301846129e9565b92915050565b600080600060608486031215612a2c57612a2b61273e565b5b6000612a3a86828701612994565b9350506020612a4b86828701612994565b9250506040612a5c868287016128df565b9150509250925092565b600060208284031215612a7c57612a7b61273e565b5b6000612a8a84828501612994565b91505092915050565b612a9c816127cd565b8114612aa757600080fd5b50565b600081359050612ab981612a93565b92915050565b60008060408385031215612ad657612ad561273e565b5b6000612ae485828601612994565b9250506020612af585828601612aaa565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b4182612852565b810181811067ffffffffffffffff82111715612b6057612b5f612b09565b5b80604052505050565b6000612b73612734565b9050612b7f8282612b38565b919050565b600067ffffffffffffffff821115612b9f57612b9e612b09565b5b612ba882612852565b9050602081019050919050565b82818337600083830152505050565b6000612bd7612bd284612b84565b612b69565b905082815260208101848484011115612bf357612bf2612b04565b5b612bfe848285612bb5565b509392505050565b600082601f830112612c1b57612c1a612aff565b5b8135612c2b848260208601612bc4565b91505092915050565b60008060008060808587031215612c4e57612c4d61273e565b5b6000612c5c87828801612994565b9450506020612c6d87828801612994565b9350506040612c7e878288016128df565b925050606085013567ffffffffffffffff811115612c9f57612c9e612743565b5b612cab87828801612c06565b91505092959194509250565b60008060408385031215612cce57612ccd61273e565b5b6000612cdc85828601612994565b9250506020612ced85828601612994565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d3e57607f821691505b60208210811415612d5257612d51612cf7565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000612db4602d8361280e565b9150612dbf82612d58565b604082019050919050565b60006020820190508181036000830152612de381612da7565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e4660228361280e565b9150612e5182612dea565b604082019050919050565b60006020820190508181036000830152612e7581612e39565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000612ed860398361280e565b9150612ee382612e7c565b604082019050919050565b60006020820190508181036000830152612f0781612ecb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f48826128be565b9150612f53836128be565b925082821015612f6657612f65612f0e565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000612fcd60228361280e565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061305f602e8361280e565b915061306a82613003565b604082019050919050565b6000602082019050818103600083015261308e81613052565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130cb60208361280e565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061315d60238361280e565b915061316882613101565b604082019050919050565b6000602082019050818103600083015261318c81613150565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006131ef602b8361280e565b91506131fa82613193565b604082019050919050565b6000602082019050818103600083015261321e816131e2565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b600061325b60108361280e565b915061326682613225565b602082019050919050565b6000602082019050818103600083015261328a8161324e565b9050919050565b7f496e636f727265637420616d6f756e7421000000000000000000000000000000600082015250565b60006132c760118361280e565b91506132d282613291565b602082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b6000613308826128be565b9150613313836128be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561334857613347612f0e565b5b828201905092915050565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b6000613389600c8361280e565b915061339482613353565b602082019050919050565b600060208201905081810360008301526133b88161337c565b9050919050565b60006133ca826128be565b91506133d5836128be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561340e5761340d612f0e565b5b828202905092915050565b7f496e636f72726563742076616c75652100000000000000000000000000000000600082015250565b600061344f60108361280e565b915061345a82613419565b602082019050919050565b6000602082019050818103600083015261347e81613442565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006134bb601a8361280e565b91506134c682613485565b602082019050919050565b600060208201905081810360008301526134ea816134ae565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061354d60338361280e565b9150613558826134f1565b604082019050919050565b6000602082019050818103600083015261357c81613540565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006135df602f8361280e565b91506135ea82613583565b604082019050919050565b6000602082019050818103600083015261360e816135d2565b9050919050565b600081905092915050565b600061362b82612803565b6136358185613615565b935061364581856020860161281f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613687600583613615565b915061369282613651565b600582019050919050565b60006136a98285613620565b91506136b58284613620565b91506136c08261367a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061372860268361280e565b9150613733826136cc565b604082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006137ba60328361280e565b91506137c58261375e565b604082019050919050565b600060208201905081810360008301526137e9816137ad565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061384c60268361280e565b9150613857826137f0565b604082019050919050565b6000602082019050818103600083015261387b8161383f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006138de60258361280e565b91506138e982613882565b604082019050919050565b6000602082019050818103600083015261390d816138d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000613970602a8361280e565b915061397b82613914565b604082019050919050565b6000602082019050818103600083015261399f81613963565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000613a02602f8361280e565b9150613a0d826139a6565b604082019050919050565b60006020820190508181036000830152613a31816139f5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a5f82613a38565b613a698185613a43565b9350613a7981856020860161281f565b613a8281612852565b840191505092915050565b6000608082019050613aa26000830187612953565b613aaf6020830186612953565b613abc60408301856129e9565b8181036060830152613ace8184613a54565b905095945050505050565b600081519050613ae881612774565b92915050565b600060208284031215613b0457613b0361273e565b5b6000613b1284828501613ad9565b91505092915050565b6000613b26826128be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b5957613b58612f0e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b9e826128be565b9150613ba9836128be565b925082613bb957613bb8613b64565b5b828204905092915050565b6000613bcf826128be565b9150613bda836128be565b925082613bea57613be9613b64565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c8060218361280e565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000613d1260288361280e565b9150613d1d82613cb6565b604082019050919050565b60006020820190508181036000830152613d4181613d05565b905091905056fe697066733a2f2f516d61394b6f6b366f794269714757585a363868386f7146426f7936314341316656355335623853463563506d512fa264697066735822122092850956d21ac936b19369132cbd1e43e8f9c241e8807ff32949c2b00073b62b64736f6c634300080b0033
Deployed Bytecode Sourcemap
38277:1396:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25144:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27030:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28601:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28122:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23397:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38380:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29477:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24065:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38840:109;;;;;;;;;;;;;:::i;:::-;;29710:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23578:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26839:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25580:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4365:94;;;;;;;;;;;;;:::i;:::-;;39128:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3714:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38532:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38749:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27199:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38491:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28887:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29958:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27374:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38445:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29246:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38957:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4614:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25144:372;25246:4;25298:25;25283:40;;;:11;:40;;;;:105;;;;25355:33;25340:48;;;:11;:48;;;;25283:105;:172;;;;25420:35;25405:50;;;:11;:50;;;;25283:172;:225;;;;25472:36;25496:11;25472:23;:36::i;:::-;25283:225;25263:245;;25144:372;;;:::o;27030:100::-;27084:13;27117:5;27110:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27030:100;:::o;28601:214::-;28669:7;28697:16;28705:7;28697;:16::i;:::-;28689:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28783:15;:24;28799:7;28783:24;;;;;;;;;;;;;;;;;;;;;28776:31;;28601:214;;;:::o;28122:413::-;28195:13;28211:24;28227:7;28211:15;:24::i;:::-;28195:40;;28260:5;28254:11;;:2;:11;;;;28246:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28355:5;28339:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28364:37;28381:5;28388:12;:10;:12::i;:::-;28364:16;:37::i;:::-;28339:62;28317:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28499:28;28508:2;28512:7;28521:5;28499:8;:28::i;:::-;28184:351;28122:413;;:::o;23397:104::-;23450:7;23492:1;23477:12;;:16;;;;:::i;:::-;23470:23;;23397:104;:::o;38380:58::-;38436:2;38380:58;:::o;29477:162::-;29603:28;29613:4;29619:2;29623:7;29603:9;:28::i;:::-;29477:162;;;:::o;24065:1007::-;24154:7;24190:16;24200:5;24190:9;:16::i;:::-;24182:5;:24;24174:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:22;24281:13;:11;:13::i;:::-;24256:38;;24305:19;24335:25;24524:9;24519:466;24539:14;24535:1;:18;24519:466;;;24579:31;24613:11;:14;24625:1;24613:14;;;;;;;;;;;24579:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24676:1;24650:28;;:9;:14;;;:28;;;24646:111;;24723:9;:14;;;24703:34;;24646:111;24800:5;24779:26;;:17;:26;;;24775:195;;;24849:5;24834:11;:20;24830:85;;;24890:1;24883:8;;;;;;;;;24830:85;24937:13;;;;;;;24775:195;24560:425;24555:3;;;;;;;24519:466;;;;25008:56;;;;;;;;;;:::i;:::-;;;;;;;;24065:1007;;;;;:::o;38840:109::-;3945:12;:10;:12::i;:::-;3934:23;;:7;:5;:7::i;:::-;:23;;;3926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38898:10:::1;38890:28;;:51;38919:21;38890:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38840:109::o:0;29710:177::-;29840:39;29857:4;29863:2;29867:7;29840:39;;;;;;;;;;;;:16;:39::i;:::-;29710:177;;;:::o;23578:187::-;23645:7;23681:13;:11;:13::i;:::-;23673:5;:21;23665:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23752:5;23745:12;;23578:187;;;:::o;26839:124::-;26903:7;26930:20;26942:7;26930:11;:20::i;:::-;:25;;;26923:32;;26839:124;;;:::o;25580:221::-;25644:7;25689:1;25672:19;;:5;:19;;;;25664:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25765:12;:19;25778:5;25765:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25757:36;;25750:43;;25580:221;;;:::o;4365:94::-;3945:12;:10;:12::i;:::-;3934:23;;:7;:5;:7::i;:::-;:23;;;3926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4430:21:::1;4448:1;4430:9;:21::i;:::-;4365:94::o:0;39128:542::-;39210:3;39195:12;;:18;39187:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;38436:2;39253:6;:42;;39245:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;38436:2;39370:6;39336:19;:31;39356:10;39336:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:76;;39328:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;39485:1;38478:4;39473:13;;;;:::i;:::-;39463:6;39448:12;;:21;;;;:::i;:::-;:38;;39440:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39543:6;39535:5;;:14;;;;:::i;:::-;39522:9;:27;39514:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39581:29;39591:10;39603:6;39581:9;:29::i;:::-;39656:6;39621:19;:31;39641:10;39621:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;39128:542;:::o;3714:87::-;3760:7;3787:6;;;;;;;;;;;3780:13;;3714:87;:::o;38532:51::-;;;;;;;;;;;;;;;;;:::o;38749:83::-;3945:12;:10;:12::i;:::-;3934:23;;:7;:5;:7::i;:::-;:23;;;3926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38818:6:::1;38810:5;:14;;;;38749:83:::0;:::o;27199:104::-;27255:13;27288:7;27281:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27199:104;:::o;38491:30::-;;;;:::o;28887:288::-;28994:12;:10;:12::i;:::-;28982:24;;:8;:24;;;;28974:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29095:8;29050:18;:32;29069:12;:10;:12::i;:::-;29050:32;;;;;;;;;;;;;;;:42;29083:8;29050:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29148:8;29119:48;;29134:12;:10;:12::i;:::-;29119:48;;;29158:8;29119:48;;;;;;:::i;:::-;;;;;;;;28887:288;;:::o;29958:355::-;30117:28;30127:4;30133:2;30137:7;30117:9;:28::i;:::-;30178:48;30201:4;30207:2;30211:7;30220:5;30178:22;:48::i;:::-;30156:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;29958:355;;;;:::o;27374:344::-;27447:13;27481:16;27489:7;27481;:16::i;:::-;27473:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27562:21;27586:10;:8;:10::i;:::-;27562:34;;27639:1;27620:7;27614:21;:26;;:96;;;;;;;;;;;;;;;;;27667:7;27676:18;:7;:16;:18::i;:::-;27650:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27614:96;27607:103;;;27374:344;;;:::o;38445:37::-;38478:4;38445:37;:::o;29246:164::-;29343:4;29367:18;:25;29386:5;29367:25;;;;;;;;;;;;;;;:35;29393:8;29367:35;;;;;;;;;;;;;;;;;;;;;;;;;29360:42;;29246:164;;;;:::o;38957:163::-;3945:12;:10;:12::i;:::-;3934:23;;:7;:5;:7::i;:::-;:23;;;3926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39052:3:::1;39042:6;39027:12;;:21;;;;:::i;:::-;:28;;39019:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;39083:29;39093:10;39105:6;39083:9;:29::i;:::-;38957:163:::0;:::o;4614:192::-;3945:12;:10;:12::i;:::-;3934:23;;:7;:5;:7::i;:::-;:23;;;3926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4723:1:::1;4703:22;;:8;:22;;;;4695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4779:19;4789:8;4779:9;:19::i;:::-;4614:192:::0;:::o;15316:157::-;15401:4;15440:25;15425:40;;;:11;:40;;;;15418:47;;15316:157;;;:::o;30568:111::-;30625:4;30659:12;;30649:7;:22;30642:29;;30568:111;;;:::o;2590:98::-;2643:7;2670:10;2663:17;;2590:98;:::o;35488:196::-;35630:2;35603:15;:24;35619:7;35603:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35668:7;35664:2;35648:28;;35657:5;35648:28;;;;;;;;;;;;35488:196;;;:::o;33368:2002::-;33483:35;33521:20;33533:7;33521:11;:20::i;:::-;33483:58;;33554:22;33596:13;:18;;;33580:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33655:12;:10;:12::i;:::-;33631:36;;:20;33643:7;33631:11;:20::i;:::-;:36;;;33580:87;:154;;;;33684:50;33701:13;:18;;;33721:12;:10;:12::i;:::-;33684:16;:50::i;:::-;33580:154;33554:181;;33756:17;33748:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33871:4;33849:26;;:13;:18;;;:26;;;33841:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;33951:1;33937:16;;:2;:16;;;;33929:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34008:43;34030:4;34036:2;34040:7;34049:1;34008:21;:43::i;:::-;34116:49;34133:1;34137:7;34146:13;:18;;;34116:8;:49::i;:::-;34491:1;34461:12;:18;34474:4;34461:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34535:1;34507:12;:16;34520:2;34507:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34581:2;34553:11;:20;34565:7;34553:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;34643:15;34598:11;:20;34610:7;34598:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;34911:19;34943:1;34933:7;:11;34911:33;;35004:1;34963:43;;:11;:24;34975:11;34963:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;34959:295;;;35031:20;35039:11;35031:7;:20::i;:::-;35027:212;;;35108:13;:18;;;35076:11;:24;35088:11;35076:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35191:13;:28;;;35149:11;:24;35161:11;35149:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;35027:212;34959:295;34436:829;35301:7;35297:2;35282:27;;35291:4;35282:27;;;;;;;;;;;;35320:42;35341:4;35347:2;35351:7;35360:1;35320:20;:42::i;:::-;33472:1898;;33368:2002;;;:::o;26240:537::-;26301:21;;:::i;:::-;26343:16;26351:7;26343;:16::i;:::-;26335:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26449:12;26464:7;26449:22;;26444:245;26481:1;26473:4;:9;26444:245;;26511:31;26545:11;:17;26557:4;26545:17;;;;;;;;;;;26511:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26611:1;26585:28;;:9;:14;;;:28;;;26581:93;;26645:9;26638:16;;;;;;26581:93;26492:197;26484:6;;;;;;;;26444:245;;;;26712:57;;;;;;;;;;:::i;:::-;;;;;;;;26240:537;;;;:::o;4814:173::-;4870:16;4889:6;;;;;;;;;;;4870:25;;4915:8;4906:6;;:17;;;;;;;;;;;;;;;;;;4970:8;4939:40;;4960:8;4939:40;;;;;;;;;;;;4859:128;4814:173;:::o;30687:104::-;30756:27;30766:2;30770:8;30756:27;;;;;;;;;;;;:9;:27::i;:::-;30687:104;;:::o;36249:804::-;36404:4;36425:15;:2;:13;;;:15::i;:::-;36421:625;;;36477:2;36461:36;;;36498:12;:10;:12::i;:::-;36512:4;36518:7;36527:5;36461:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36457:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36724:1;36707:6;:13;:18;36703:273;;;36750:61;;;;;;;;;;:::i;:::-;;;;;;;;36703:273;36926:6;36920:13;36911:6;36907:2;36903:15;36896:38;36457:534;36594:45;;;36584:55;;;:6;:55;;;;36577:62;;;;;36421:625;37030:4;37023:11;;36249:804;;;;;;;:::o;38592:149::-;38644:13;38670:63;;;;;;;;;;;;;;;;;;;38592:149;:::o;289:723::-;345:13;575:1;566:5;:10;562:53;;;593:10;;;;;;;;;;;;;;;;;;;;;562:53;625:12;640:5;625:20;;656:14;681:78;696:1;688:4;:9;681:78;;714:8;;;;;:::i;:::-;;;;745:2;737:10;;;;;:::i;:::-;;;681:78;;;769:19;801:6;791:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;769:39;;819:154;835:1;826:5;:10;819:154;;863:1;853:11;;;;;:::i;:::-;;;930:2;922:5;:10;;;;:::i;:::-;909:2;:24;;;;:::i;:::-;896:39;;879:6;886;879:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;959:2;950:11;;;;;:::i;:::-;;;819:154;;;997:6;983:21;;;;;289:723;;;;:::o;37541:159::-;;;;;:::o;38112:158::-;;;;;:::o;31154:163::-;31277:32;31283:2;31287:8;31297:5;31304:4;31277:5;:32::i;:::-;31154:163;;;:::o;5675:387::-;5735:4;5943:12;6010:7;5998:20;5990:28;;6053:1;6046:4;:8;6039:15;;;5675:387;;;:::o;31576:1538::-;31715:20;31738:12;;31715:35;;31783:1;31769:16;;:2;:16;;;;31761:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31854:1;31842:8;:13;;31834:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31913:61;31943:1;31947:2;31951:12;31965:8;31913:21;:61::i;:::-;32288:8;32252:12;:16;32265:2;32252:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32353:8;32312:12;:16;32325:2;32312:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32412:2;32379:11;:25;32391:12;32379:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32479:15;32429:11;:25;32441:12;32429:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32512:20;32535:12;32512:35;;32569:9;32564:415;32584:8;32580:1;:12;32564:415;;;32648:12;32644:2;32623:38;;32640:1;32623:38;;;;;;;;;;;;32684:4;32680:249;;;32747:59;32778:1;32782:2;32786:12;32800:5;32747:22;:59::i;:::-;32713:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32680:249;32949:14;;;;;;;32594:3;;;;;;;32564:415;;;;33010:12;32995;:27;;;;32227:807;33046:60;33075:1;33079:2;33083:12;33097:8;33046:20;:60::i;:::-;31704:1410;31576:1538;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:180;7279:77;7276:1;7269:88;7376:4;7373:1;7366:15;7400:4;7397:1;7390:15;7417:281;7500:27;7522:4;7500:27;:::i;:::-;7492:6;7488:40;7630:6;7618:10;7615:22;7594:18;7582:10;7579:34;7576:62;7573:88;;;7641:18;;:::i;:::-;7573:88;7681:10;7677:2;7670:22;7460:238;7417:281;;:::o;7704:129::-;7738:6;7765:20;;:::i;:::-;7755:30;;7794:33;7822:4;7814:6;7794:33;:::i;:::-;7704:129;;;:::o;7839:307::-;7900:4;7990:18;7982:6;7979:30;7976:56;;;8012:18;;:::i;:::-;7976:56;8050:29;8072:6;8050:29;:::i;:::-;8042:37;;8134:4;8128;8124:15;8116:23;;7839:307;;;:::o;8152:154::-;8236:6;8231:3;8226;8213:30;8298:1;8289:6;8284:3;8280:16;8273:27;8152:154;;;:::o;8312:410::-;8389:5;8414:65;8430:48;8471:6;8430:48;:::i;:::-;8414:65;:::i;:::-;8405:74;;8502:6;8495:5;8488:21;8540:4;8533:5;8529:16;8578:3;8569:6;8564:3;8560:16;8557:25;8554:112;;;8585:79;;:::i;:::-;8554:112;8675:41;8709:6;8704:3;8699;8675:41;:::i;:::-;8395:327;8312:410;;;;;:::o;8741:338::-;8796:5;8845:3;8838:4;8830:6;8826:17;8822:27;8812:122;;8853:79;;:::i;:::-;8812:122;8970:6;8957:20;8995:78;9069:3;9061:6;9054:4;9046:6;9042:17;8995:78;:::i;:::-;8986:87;;8802:277;8741:338;;;;:::o;9085:943::-;9180:6;9188;9196;9204;9253:3;9241:9;9232:7;9228:23;9224:33;9221:120;;;9260:79;;:::i;:::-;9221:120;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9478:118;9635:2;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9606:118;9791:2;9780:9;9776:18;9763:32;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:62;10003:7;9994:6;9983:9;9979:22;9949:62;:::i;:::-;9939:72;;9734:287;9085:943;;;;;;;:::o;10034:474::-;10102:6;10110;10159:2;10147:9;10138:7;10134:23;10130:32;10127:119;;;10165:79;;:::i;:::-;10127:119;10285:1;10310:53;10355:7;10346:6;10335:9;10331:22;10310:53;:::i;:::-;10300:63;;10256:117;10412:2;10438:53;10483:7;10474:6;10463:9;10459:22;10438:53;:::i;:::-;10428:63;;10383:118;10034:474;;;;;:::o;10514:180::-;10562:77;10559:1;10552:88;10659:4;10656:1;10649:15;10683:4;10680:1;10673:15;10700:320;10744:6;10781:1;10775:4;10771:12;10761:22;;10828:1;10822:4;10818:12;10849:18;10839:81;;10905:4;10897:6;10893:17;10883:27;;10839:81;10967:2;10959:6;10956:14;10936:18;10933:38;10930:84;;;10986:18;;:::i;:::-;10930:84;10751:269;10700:320;;;:::o;11026:232::-;11166:34;11162:1;11154:6;11150:14;11143:58;11235:15;11230:2;11222:6;11218:15;11211:40;11026:232;:::o;11264:366::-;11406:3;11427:67;11491:2;11486:3;11427:67;:::i;:::-;11420:74;;11503:93;11592:3;11503:93;:::i;:::-;11621:2;11616:3;11612:12;11605:19;;11264:366;;;:::o;11636:419::-;11802:4;11840:2;11829:9;11825:18;11817:26;;11889:9;11883:4;11879:20;11875:1;11864:9;11860:17;11853:47;11917:131;12043:4;11917:131;:::i;:::-;11909:139;;11636:419;;;:::o;12061:221::-;12201:34;12197:1;12189:6;12185:14;12178:58;12270:4;12265:2;12257:6;12253:15;12246:29;12061:221;:::o;12288:366::-;12430:3;12451:67;12515:2;12510:3;12451:67;:::i;:::-;12444:74;;12527:93;12616:3;12527:93;:::i;:::-;12645:2;12640:3;12636:12;12629:19;;12288:366;;;:::o;12660:419::-;12826:4;12864:2;12853:9;12849:18;12841:26;;12913:9;12907:4;12903:20;12899:1;12888:9;12884:17;12877:47;12941:131;13067:4;12941:131;:::i;:::-;12933:139;;12660:419;;;:::o;13085:244::-;13225:34;13221:1;13213:6;13209:14;13202:58;13294:27;13289:2;13281:6;13277:15;13270:52;13085:244;:::o;13335:366::-;13477:3;13498:67;13562:2;13557:3;13498:67;:::i;:::-;13491:74;;13574:93;13663:3;13574:93;:::i;:::-;13692:2;13687:3;13683:12;13676:19;;13335:366;;;:::o;13707:419::-;13873:4;13911:2;13900:9;13896:18;13888:26;;13960:9;13954:4;13950:20;13946:1;13935:9;13931:17;13924:47;13988:131;14114:4;13988:131;:::i;:::-;13980:139;;13707:419;;;:::o;14132:180::-;14180:77;14177:1;14170:88;14277:4;14274:1;14267:15;14301:4;14298:1;14291:15;14318:191;14358:4;14378:20;14396:1;14378:20;:::i;:::-;14373:25;;14412:20;14430:1;14412:20;:::i;:::-;14407:25;;14451:1;14448;14445:8;14442:34;;;14456:18;;:::i;:::-;14442:34;14501:1;14498;14494:9;14486:17;;14318:191;;;;:::o;14515:221::-;14655:34;14651:1;14643:6;14639:14;14632:58;14724:4;14719:2;14711:6;14707:15;14700:29;14515:221;:::o;14742:366::-;14884:3;14905:67;14969:2;14964:3;14905:67;:::i;:::-;14898:74;;14981:93;15070:3;14981:93;:::i;:::-;15099:2;15094:3;15090:12;15083:19;;14742:366;;;:::o;15114:419::-;15280:4;15318:2;15307:9;15303:18;15295:26;;15367:9;15361:4;15357:20;15353:1;15342:9;15338:17;15331:47;15395:131;15521:4;15395:131;:::i;:::-;15387:139;;15114:419;;;:::o;15539:233::-;15679:34;15675:1;15667:6;15663:14;15656:58;15748:16;15743:2;15735:6;15731:15;15724:41;15539:233;:::o;15778:366::-;15920:3;15941:67;16005:2;16000:3;15941:67;:::i;:::-;15934:74;;16017:93;16106:3;16017:93;:::i;:::-;16135:2;16130:3;16126:12;16119:19;;15778:366;;;:::o;16150:419::-;16316:4;16354:2;16343:9;16339:18;16331:26;;16403:9;16397:4;16393:20;16389:1;16378:9;16374:17;16367:47;16431:131;16557:4;16431:131;:::i;:::-;16423:139;;16150:419;;;:::o;16575:182::-;16715:34;16711:1;16703:6;16699:14;16692:58;16575:182;:::o;16763:366::-;16905:3;16926:67;16990:2;16985:3;16926:67;:::i;:::-;16919:74;;17002:93;17091:3;17002:93;:::i;:::-;17120:2;17115:3;17111:12;17104:19;;16763:366;;;:::o;17135:419::-;17301:4;17339:2;17328:9;17324:18;17316:26;;17388:9;17382:4;17378:20;17374:1;17363:9;17359:17;17352:47;17416:131;17542:4;17416:131;:::i;:::-;17408:139;;17135:419;;;:::o;17560:222::-;17700:34;17696:1;17688:6;17684:14;17677:58;17769:5;17764:2;17756:6;17752:15;17745:30;17560:222;:::o;17788:366::-;17930:3;17951:67;18015:2;18010:3;17951:67;:::i;:::-;17944:74;;18027:93;18116:3;18027:93;:::i;:::-;18145:2;18140:3;18136:12;18129:19;;17788:366;;;:::o;18160:419::-;18326:4;18364:2;18353:9;18349:18;18341:26;;18413:9;18407:4;18403:20;18399:1;18388:9;18384:17;18377:47;18441:131;18567:4;18441:131;:::i;:::-;18433:139;;18160:419;;;:::o;18585:230::-;18725:34;18721:1;18713:6;18709:14;18702:58;18794:13;18789:2;18781:6;18777:15;18770:38;18585:230;:::o;18821:366::-;18963:3;18984:67;19048:2;19043:3;18984:67;:::i;:::-;18977:74;;19060:93;19149:3;19060:93;:::i;:::-;19178:2;19173:3;19169:12;19162:19;;18821:366;;;:::o;19193:419::-;19359:4;19397:2;19386:9;19382:18;19374:26;;19446:9;19440:4;19436:20;19432:1;19421:9;19417:17;19410:47;19474:131;19600:4;19474:131;:::i;:::-;19466:139;;19193:419;;;:::o;19618:166::-;19758:18;19754:1;19746:6;19742:14;19735:42;19618:166;:::o;19790:366::-;19932:3;19953:67;20017:2;20012:3;19953:67;:::i;:::-;19946:74;;20029:93;20118:3;20029:93;:::i;:::-;20147:2;20142:3;20138:12;20131:19;;19790:366;;;:::o;20162:419::-;20328:4;20366:2;20355:9;20351:18;20343:26;;20415:9;20409:4;20405:20;20401:1;20390:9;20386:17;20379:47;20443:131;20569:4;20443:131;:::i;:::-;20435:139;;20162:419;;;:::o;20587:167::-;20727:19;20723:1;20715:6;20711:14;20704:43;20587:167;:::o;20760:366::-;20902:3;20923:67;20987:2;20982:3;20923:67;:::i;:::-;20916:74;;20999:93;21088:3;20999:93;:::i;:::-;21117:2;21112:3;21108:12;21101:19;;20760:366;;;:::o;21132:419::-;21298:4;21336:2;21325:9;21321:18;21313:26;;21385:9;21379:4;21375:20;21371:1;21360:9;21356:17;21349:47;21413:131;21539:4;21413:131;:::i;:::-;21405:139;;21132:419;;;:::o;21557:305::-;21597:3;21616:20;21634:1;21616:20;:::i;:::-;21611:25;;21650:20;21668:1;21650:20;:::i;:::-;21645:25;;21804:1;21736:66;21732:74;21729:1;21726:81;21723:107;;;21810:18;;:::i;:::-;21723:107;21854:1;21851;21847:9;21840:16;;21557:305;;;;:::o;21868:162::-;22008:14;22004:1;21996:6;21992:14;21985:38;21868:162;:::o;22036:366::-;22178:3;22199:67;22263:2;22258:3;22199:67;:::i;:::-;22192:74;;22275:93;22364:3;22275:93;:::i;:::-;22393:2;22388:3;22384:12;22377:19;;22036:366;;;:::o;22408:419::-;22574:4;22612:2;22601:9;22597:18;22589:26;;22661:9;22655:4;22651:20;22647:1;22636:9;22632:17;22625:47;22689:131;22815:4;22689:131;:::i;:::-;22681:139;;22408:419;;;:::o;22833:348::-;22873:7;22896:20;22914:1;22896:20;:::i;:::-;22891:25;;22930:20;22948:1;22930:20;:::i;:::-;22925:25;;23118:1;23050:66;23046:74;23043:1;23040:81;23035:1;23028:9;23021:17;23017:105;23014:131;;;23125:18;;:::i;:::-;23014:131;23173:1;23170;23166:9;23155:20;;22833:348;;;;:::o;23187:166::-;23327:18;23323:1;23315:6;23311:14;23304:42;23187:166;:::o;23359:366::-;23501:3;23522:67;23586:2;23581:3;23522:67;:::i;:::-;23515:74;;23598:93;23687:3;23598:93;:::i;:::-;23716:2;23711:3;23707:12;23700:19;;23359:366;;;:::o;23731:419::-;23897:4;23935:2;23924:9;23920:18;23912:26;;23984:9;23978:4;23974:20;23970:1;23959:9;23955:17;23948:47;24012:131;24138:4;24012:131;:::i;:::-;24004:139;;23731:419;;;:::o;24156:176::-;24296:28;24292:1;24284:6;24280:14;24273:52;24156:176;:::o;24338:366::-;24480:3;24501:67;24565:2;24560:3;24501:67;:::i;:::-;24494:74;;24577:93;24666:3;24577:93;:::i;:::-;24695:2;24690:3;24686:12;24679:19;;24338:366;;;:::o;24710:419::-;24876:4;24914:2;24903:9;24899:18;24891:26;;24963:9;24957:4;24953:20;24949:1;24938:9;24934:17;24927:47;24991:131;25117:4;24991:131;:::i;:::-;24983:139;;24710:419;;;:::o;25135:238::-;25275:34;25271:1;25263:6;25259:14;25252:58;25344:21;25339:2;25331:6;25327:15;25320:46;25135:238;:::o;25379:366::-;25521:3;25542:67;25606:2;25601:3;25542:67;:::i;:::-;25535:74;;25618:93;25707:3;25618:93;:::i;:::-;25736:2;25731:3;25727:12;25720:19;;25379:366;;;:::o;25751:419::-;25917:4;25955:2;25944:9;25940:18;25932:26;;26004:9;25998:4;25994:20;25990:1;25979:9;25975:17;25968:47;26032:131;26158:4;26032:131;:::i;:::-;26024:139;;25751:419;;;:::o;26176:234::-;26316:34;26312:1;26304:6;26300:14;26293:58;26385:17;26380:2;26372:6;26368:15;26361:42;26176:234;:::o;26416:366::-;26558:3;26579:67;26643:2;26638:3;26579:67;:::i;:::-;26572:74;;26655:93;26744:3;26655:93;:::i;:::-;26773:2;26768:3;26764:12;26757:19;;26416:366;;;:::o;26788:419::-;26954:4;26992:2;26981:9;26977:18;26969:26;;27041:9;27035:4;27031:20;27027:1;27016:9;27012:17;27005:47;27069:131;27195:4;27069:131;:::i;:::-;27061:139;;26788:419;;;:::o;27213:148::-;27315:11;27352:3;27337:18;;27213:148;;;;:::o;27367:377::-;27473:3;27501:39;27534:5;27501:39;:::i;:::-;27556:89;27638:6;27633:3;27556:89;:::i;:::-;27549:96;;27654:52;27699:6;27694:3;27687:4;27680:5;27676:16;27654:52;:::i;:::-;27731:6;27726:3;27722:16;27715:23;;27477:267;27367:377;;;;:::o;27750:155::-;27890:7;27886:1;27878:6;27874:14;27867:31;27750:155;:::o;27911:400::-;28071:3;28092:84;28174:1;28169:3;28092:84;:::i;:::-;28085:91;;28185:93;28274:3;28185:93;:::i;:::-;28303:1;28298:3;28294:11;28287:18;;27911:400;;;:::o;28317:701::-;28598:3;28620:95;28711:3;28702:6;28620:95;:::i;:::-;28613:102;;28732:95;28823:3;28814:6;28732:95;:::i;:::-;28725:102;;28844:148;28988:3;28844:148;:::i;:::-;28837:155;;29009:3;29002:10;;28317:701;;;;;:::o;29024:225::-;29164:34;29160:1;29152:6;29148:14;29141:58;29233:8;29228:2;29220:6;29216:15;29209:33;29024:225;:::o;29255:366::-;29397:3;29418:67;29482:2;29477:3;29418:67;:::i;:::-;29411:74;;29494:93;29583:3;29494:93;:::i;:::-;29612:2;29607:3;29603:12;29596:19;;29255:366;;;:::o;29627:419::-;29793:4;29831:2;29820:9;29816:18;29808:26;;29880:9;29874:4;29870:20;29866:1;29855:9;29851:17;29844:47;29908:131;30034:4;29908:131;:::i;:::-;29900:139;;29627:419;;;:::o;30052:237::-;30192:34;30188:1;30180:6;30176:14;30169:58;30261:20;30256:2;30248:6;30244:15;30237:45;30052:237;:::o;30295:366::-;30437:3;30458:67;30522:2;30517:3;30458:67;:::i;:::-;30451:74;;30534:93;30623:3;30534:93;:::i;:::-;30652:2;30647:3;30643:12;30636:19;;30295:366;;;:::o;30667:419::-;30833:4;30871:2;30860:9;30856:18;30848:26;;30920:9;30914:4;30910:20;30906:1;30895:9;30891:17;30884:47;30948:131;31074:4;30948:131;:::i;:::-;30940:139;;30667:419;;;:::o;31092:225::-;31232:34;31228:1;31220:6;31216:14;31209:58;31301:8;31296:2;31288:6;31284:15;31277:33;31092:225;:::o;31323:366::-;31465:3;31486:67;31550:2;31545:3;31486:67;:::i;:::-;31479:74;;31562:93;31651:3;31562:93;:::i;:::-;31680:2;31675:3;31671:12;31664:19;;31323:366;;;:::o;31695:419::-;31861:4;31899:2;31888:9;31884:18;31876:26;;31948:9;31942:4;31938:20;31934:1;31923:9;31919:17;31912:47;31976:131;32102:4;31976:131;:::i;:::-;31968:139;;31695:419;;;:::o;32120:224::-;32260:34;32256:1;32248:6;32244:14;32237:58;32329:7;32324:2;32316:6;32312:15;32305:32;32120:224;:::o;32350:366::-;32492:3;32513:67;32577:2;32572:3;32513:67;:::i;:::-;32506:74;;32589:93;32678:3;32589:93;:::i;:::-;32707:2;32702:3;32698:12;32691:19;;32350:366;;;:::o;32722:419::-;32888:4;32926:2;32915:9;32911:18;32903:26;;32975:9;32969:4;32965:20;32961:1;32950:9;32946:17;32939:47;33003:131;33129:4;33003:131;:::i;:::-;32995:139;;32722:419;;;:::o;33147:229::-;33287:34;33283:1;33275:6;33271:14;33264:58;33356:12;33351:2;33343:6;33339:15;33332:37;33147:229;:::o;33382:366::-;33524:3;33545:67;33609:2;33604:3;33545:67;:::i;:::-;33538:74;;33621:93;33710:3;33621:93;:::i;:::-;33739:2;33734:3;33730:12;33723:19;;33382:366;;;:::o;33754:419::-;33920:4;33958:2;33947:9;33943:18;33935:26;;34007:9;34001:4;33997:20;33993:1;33982:9;33978:17;33971:47;34035:131;34161:4;34035:131;:::i;:::-;34027:139;;33754:419;;;:::o;34179:234::-;34319:34;34315:1;34307:6;34303:14;34296:58;34388:17;34383:2;34375:6;34371:15;34364:42;34179:234;:::o;34419:366::-;34561:3;34582:67;34646:2;34641:3;34582:67;:::i;:::-;34575:74;;34658:93;34747:3;34658:93;:::i;:::-;34776:2;34771:3;34767:12;34760:19;;34419:366;;;:::o;34791:419::-;34957:4;34995:2;34984:9;34980:18;34972:26;;35044:9;35038:4;35034:20;35030:1;35019:9;35015:17;35008:47;35072:131;35198:4;35072:131;:::i;:::-;35064:139;;34791:419;;;:::o;35216:98::-;35267:6;35301:5;35295:12;35285:22;;35216:98;;;:::o;35320:168::-;35403:11;35437:6;35432:3;35425:19;35477:4;35472:3;35468:14;35453:29;;35320:168;;;;:::o;35494:360::-;35580:3;35608:38;35640:5;35608:38;:::i;:::-;35662:70;35725:6;35720:3;35662:70;:::i;:::-;35655:77;;35741:52;35786:6;35781:3;35774:4;35767:5;35763:16;35741:52;:::i;:::-;35818:29;35840:6;35818:29;:::i;:::-;35813:3;35809:39;35802:46;;35584:270;35494:360;;;;:::o;35860:640::-;36055:4;36093:3;36082:9;36078:19;36070:27;;36107:71;36175:1;36164:9;36160:17;36151:6;36107:71;:::i;:::-;36188:72;36256:2;36245:9;36241:18;36232:6;36188:72;:::i;:::-;36270;36338:2;36327:9;36323:18;36314:6;36270:72;:::i;:::-;36389:9;36383:4;36379:20;36374:2;36363:9;36359:18;36352:48;36417:76;36488:4;36479:6;36417:76;:::i;:::-;36409:84;;35860:640;;;;;;;:::o;36506:141::-;36562:5;36593:6;36587:13;36578:22;;36609:32;36635:5;36609:32;:::i;:::-;36506:141;;;;:::o;36653:349::-;36722:6;36771:2;36759:9;36750:7;36746:23;36742:32;36739:119;;;36777:79;;:::i;:::-;36739:119;36897:1;36922:63;36977:7;36968:6;36957:9;36953:22;36922:63;:::i;:::-;36912:73;;36868:127;36653:349;;;;:::o;37008:233::-;37047:3;37070:24;37088:5;37070:24;:::i;:::-;37061:33;;37116:66;37109:5;37106:77;37103:103;;;37186:18;;:::i;:::-;37103:103;37233:1;37226:5;37222:13;37215:20;;37008:233;;;:::o;37247:180::-;37295:77;37292:1;37285:88;37392:4;37389:1;37382:15;37416:4;37413:1;37406:15;37433:185;37473:1;37490:20;37508:1;37490:20;:::i;:::-;37485:25;;37524:20;37542:1;37524:20;:::i;:::-;37519:25;;37563:1;37553:35;;37568:18;;:::i;:::-;37553:35;37610:1;37607;37603:9;37598:14;;37433:185;;;;:::o;37624:176::-;37656:1;37673:20;37691:1;37673:20;:::i;:::-;37668:25;;37707:20;37725:1;37707:20;:::i;:::-;37702:25;;37746:1;37736:35;;37751:18;;:::i;:::-;37736:35;37792:1;37789;37785:9;37780:14;;37624:176;;;;:::o;37806:180::-;37854:77;37851:1;37844:88;37951:4;37948:1;37941:15;37975:4;37972:1;37965:15;37992:220;38132:34;38128:1;38120:6;38116:14;38109:58;38201:3;38196:2;38188:6;38184:15;38177:28;37992:220;:::o;38218:366::-;38360:3;38381:67;38445:2;38440:3;38381:67;:::i;:::-;38374:74;;38457:93;38546:3;38457:93;:::i;:::-;38575:2;38570:3;38566:12;38559:19;;38218:366;;;:::o;38590:419::-;38756:4;38794:2;38783:9;38779:18;38771:26;;38843:9;38837:4;38833:20;38829:1;38818:9;38814:17;38807:47;38871:131;38997:4;38871:131;:::i;:::-;38863:139;;38590:419;;;:::o;39015:227::-;39155:34;39151:1;39143:6;39139:14;39132:58;39224:10;39219:2;39211:6;39207:15;39200:35;39015:227;:::o;39248:366::-;39390:3;39411:67;39475:2;39470:3;39411:67;:::i;:::-;39404:74;;39487:93;39576:3;39487:93;:::i;:::-;39605:2;39600:3;39596:12;39589:19;;39248:366;;;:::o;39620:419::-;39786:4;39824:2;39813:9;39809:18;39801:26;;39873:9;39867:4;39863:20;39859:1;39848:9;39844:17;39837:47;39901:131;40027:4;39901:131;:::i;:::-;39893:139;;39620:419;;;:::o
Swarm Source
ipfs://92850956d21ac936b19369132cbd1e43e8f9c241e8807ff32949c2b00073b62b
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.