Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
729 FLWRSHP
Holders
497
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlowerShoppe
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./ERC721A.sol"; import "./ReentrancyGuard.sol"; import "./MerkleProof.sol"; contract FlowerShoppe is ERC721A, Ownable, ReentrancyGuard { IERC721 public Photosynthesis; using Strings for uint256; uint256 public maxPerTx; event gifted(address from, address to, uint256 amount, uint256 flowerIndex); event typeAdded(string name, string uri, uint256 index, uint256 maxSupply, uint256 price, bool PSOnly, bool hasEP, address exclusiveProject); event burned(address from, address to, uint256 id); struct FlowerTypes { string name; string URI; uint256 count; uint256 maxSupply; uint256 price; bool isActive; bool PSOnly; bool hasEP; address exclusiveProject; } FlowerTypes[] public flowertypes; string flowerURI = ""; mapping(uint256 => uint256) tokenToType; constructor( string memory name, // Flower Shoppe string memory symbol, // FLWRSHP uint256 maxSupply, // 115792089237316195423570985008687907853269984665640564039457584007913129639935 uint256 _maxPerTx, // 1 address PS // 0x366e3b64ef9060eb4b2b0908d7cd165c26312a23 ) ERC721A ( name, symbol, 100, maxSupply ) { Photosynthesis = IERC721(PS); maxPerTx = _maxPerTx; } function gift(address recipient, uint256 amount, uint256 flowertype) external payable nonReentrant{ require(flowertype < flowertypes.length, "Flower does not exist"); require(flowertypes[flowertype].count + amount <= flowertypes[flowertype].maxSupply, "Exceeds max supply of flower type"); require(flowertypes[flowertype].isActive, "Flower is not in season"); require(msg.value == flowertypes[flowertype].price * amount, "Incorrect amount of ETH sent"); require(amount <= maxPerTx, "Exceeds maximum per transaction"); if(flowertypes[flowertype].PSOnly) { require(Photosynthesis.balanceOf(_msgSender()) > 0, "Sender must hold a Photosynthesis NFT"); } if(flowertypes[flowertype].hasEP){ IERC721 EP; EP = IERC721(flowertypes[flowertype].exclusiveProject); require(EP.balanceOf(_msgSender()) > 0, "Sender must hold a specific NFT to mint this flower"); } flowertypes[flowertype].count += amount; _safeMint(recipient, amount); emit gifted(_msgSender(), recipient, amount, flowertype); } function burn(uint256 tokenId) external { transferFrom(_msgSender(), address(0), tokenId); emit burned(_msgSender(), address(0), tokenId); } function addFlower(string memory _name, string memory uri, uint256 maxSupply, uint256 _price, bool _PSOnly, bool _hasEP, address _exclusiveProject) external onlyOwner { flowertypes.push(FlowerTypes(_name, uri, 0, maxSupply, _price, true, _PSOnly, _hasEP, _exclusiveProject)); emit typeAdded(_name, uri, flowertypes.length - 1, maxSupply, _price, _PSOnly, _hasEP, _exclusiveProject); } function flowerState(uint256 flowerIndex, bool _isActive) external onlyOwner { flowertypes[flowerIndex].isActive = _isActive; } function changeUri(uint256 index, string memory newuri) external onlyOwner { flowertypes[index].URI = newuri; } function changeSupply(uint256 index, uint256 newSupply) external onlyOwner { flowertypes[index].maxSupply = newSupply; } function changePrice(uint256 index, uint256 _price) external onlyOwner { flowertypes[index].price = _price; } function changePSOnly(uint256 index, bool _PSOnly) external onlyOwner { flowertypes[index].PSOnly = _PSOnly; } function changeMaxPerTx(uint256 _maxPerTx) external onlyOwner { maxPerTx = _maxPerTx; } function setURI(string memory _uri) external onlyOwner { URI = _uri; } function setPS(address _ps) external onlyOwner { Photosynthesis = ERC721A(_ps); } function changeEP(uint256 index, bool _hasEP, address _ep) external onlyOwner { flowertypes[index].hasEP = _hasEP; flowertypes[index].exclusiveProject = _ep; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; (bool success,) = _msgSender().call{value: balance}(""); require(success, "Transfer fail"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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())) : ""; //https://google-project/nft/123 } /** * @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. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; //https://google-project/nft/ } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; //import "@openzeppelin/contracts/utils/Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @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..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ 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 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // 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) private _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; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @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(collectionSize). 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 = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; 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); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; 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())) : ""; } /** * @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. */ string URI; function _baseURI() internal view virtual returns (string memory) { return URI; } /** * @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 Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); 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); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, 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] = TokenOwnership( prevOwnership.addr, 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); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"address","name":"PS","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flowerIndex","type":"uint256"}],"name":"gifted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"PSOnly","type":"bool"},{"indexed":false,"internalType":"bool","name":"hasEP","type":"bool"},{"indexed":false,"internalType":"address","name":"exclusiveProject","type":"address"}],"name":"typeAdded","type":"event"},{"inputs":[],"name":"Photosynthesis","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"bool","name":"_PSOnly","type":"bool"},{"internalType":"bool","name":"_hasEP","type":"bool"},{"internalType":"address","name":"_exclusiveProject","type":"address"}],"name":"addFlower","outputs":[],"stateMutability":"nonpayable","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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"_hasEP","type":"bool"},{"internalType":"address","name":"_ep","type":"address"}],"name":"changeEP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"changeMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"_PSOnly","type":"bool"}],"name":"changePSOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"changeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"string","name":"newuri","type":"string"}],"name":"changeUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flowerIndex","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"flowerState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"flowertypes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"PSOnly","type":"bool"},{"internalType":"bool","name":"hasEP","type":"bool"},{"internalType":"address","name":"exclusiveProject","type":"address"}],"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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"flowertype","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"payable","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":"maxPerTx","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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ps","type":"address"}],"name":"setPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","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
60c060405260008055600060085560405180602001604052806000815250600e90805190602001906200003492919062000288565b503480156200004257600080fd5b506040516200603e3803806200603e833981810160405281019062000068919062000575565b848460648560008111620000b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000aa90620006c2565b60405180910390fd5b60008211620000f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f0906200075a565b60405180910390fd5b83600190805190602001906200011192919062000288565b5082600290805190602001906200012a92919062000288565b508160a081815250508060808181525050505050506200015f62000153620001ba60201b60201c565b620001c260201b60201c565b6001600a8190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c819055505050505050620007e0565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029690620007ab565b90600052602060002090601f016020900481019282620002ba576000855562000306565b82601f10620002d557805160ff191683800117855562000306565b8280016001018555821562000306579182015b8281111562000305578251825591602001919060010190620002e8565b5b50905062000315919062000319565b5090565b5b80821115620003345760008160009055506001016200031a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003a18262000356565b810181811067ffffffffffffffff82111715620003c357620003c262000367565b5b80604052505050565b6000620003d862000338565b9050620003e6828262000396565b919050565b600067ffffffffffffffff82111562000409576200040862000367565b5b620004148262000356565b9050602081019050919050565b60005b838110156200044157808201518184015260208101905062000424565b8381111562000451576000848401525b50505050565b60006200046e6200046884620003eb565b620003cc565b9050828152602081018484840111156200048d576200048c62000351565b5b6200049a84828562000421565b509392505050565b600082601f830112620004ba57620004b96200034c565b5b8151620004cc84826020860162000457565b91505092915050565b6000819050919050565b620004ea81620004d5565b8114620004f657600080fd5b50565b6000815190506200050a81620004df565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200053d8262000510565b9050919050565b6200054f8162000530565b81146200055b57600080fd5b50565b6000815190506200056f8162000544565b92915050565b600080600080600060a0868803121562000594576200059362000342565b5b600086015167ffffffffffffffff811115620005b557620005b462000347565b5b620005c388828901620004a2565b955050602086015167ffffffffffffffff811115620005e757620005e662000347565b5b620005f588828901620004a2565b94505060406200060888828901620004f9565b93505060606200061b88828901620004f9565b92505060806200062e888289016200055e565b9150509295509295909350565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6000620006aa602e836200063b565b9150620006b7826200064c565b604082019050919050565b60006020820190508181036000830152620006dd816200069b565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620007426027836200063b565b91506200074f82620006e4565b604082019050919050565b60006020820190508181036000830152620007758162000733565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007c457607f821691505b602082108103620007da57620007d96200077c565b5b50919050565b60805160a05161582d6200081160003960008181612d6201528181612d8b015261341c01526000505061582d6000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063b97a0f72116100a0578063e985e9c51161006f578063e985e9c51461078e578063f2fde38b146107cb578063f8e378c5146107f4578063f968adbe1461081d578063fb965bcd146108485761020f565b8063b97a0f72146106b8578063c87b56dd146106fd578063d7224ba01461073a578063e168813b146107655761020f565b806395d89b41116100e757806395d89b41146105e9578063a22cb46514610614578063a6a53fe91461063d578063b3de019c14610666578063b88d4fde1461068f5761020f565b80636352211e1461052d57806370a082311461056a578063715018a6146105a75780638da5cb5b146105be5761020f565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461045957806342966c68146104825780634f6ccce7146104ab578063559a7825146104e8578063598d00a9146105115761020f565b806323b872dd146103b35780632517ccb7146103dc5780632f745c59146104055780633ccfd60b146104425761020f565b806306fdde03116101e257806306fdde03146102cc578063081812fc146102f7578063095ea7b3146103345780630a29e04e1461035d57806318160ddd146103885761020f565b806301ffc9a71461021457806302fe5305146102515780630480c7c81461027a57806305846e38146102a3575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613996565b610871565b60405161024891906139de565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613b3f565b6109bb565b005b34801561028657600080fd5b506102a1600480360381019061029c9190613c48565b610a51565b005b3480156102af57600080fd5b506102ca60048036038101906102c59190613d22565b610cb7565b005b3480156102d857600080fd5b506102e1610d77565b6040516102ee9190613dd7565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613df9565b610e09565b60405161032b9190613e35565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613e50565b610e8e565b005b34801561036957600080fd5b50610372610fa6565b60405161037f9190613eef565b60405180910390f35b34801561039457600080fd5b5061039d610fcc565b6040516103aa9190613f19565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613f34565b610fd5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613f87565b610fe5565b005b34801561041157600080fd5b5061042c60048036038101906104279190613e50565b6110a2565b6040516104399190613f19565b60405180910390f35b34801561044e57600080fd5b5061045761129e565b005b34801561046557600080fd5b50610480600480360381019061047b9190613f34565b6113d6565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613df9565b6113f6565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613df9565b61144f565b6040516104df9190613f19565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613df9565b6114a2565b005b61052b60048036038101906105269190613fc7565b611528565b005b34801561053957600080fd5b50610554600480360381019061054f9190613df9565b611a79565b6040516105619190613e35565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613d22565b611a8f565b60405161059e9190613f19565b60405180910390f35b3480156105b357600080fd5b506105bc611b77565b005b3480156105ca57600080fd5b506105d3611bff565b6040516105e09190613e35565b60405180910390f35b3480156105f557600080fd5b506105fe611c29565b60405161060b9190613dd7565b60405180910390f35b34801561062057600080fd5b5061063b6004803603810190610636919061401a565b611cbb565b005b34801561064957600080fd5b50610664600480360381019061065f919061405a565b611e3b565b005b34801561067257600080fd5b5061068d6004803603810190610688919061405a565b611ee5565b005b34801561069b57600080fd5b506106b660048036038101906106b1919061413b565b611f8f565b005b3480156106c457600080fd5b506106df60048036038101906106da9190613df9565b611feb565b6040516106f4999897969594939291906141be565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190613df9565b6121a0565b6040516107319190613dd7565b60405180910390f35b34801561074657600080fd5b5061074f612247565b60405161075c9190613f19565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190614259565b61224d565b005b34801561079a57600080fd5b506107b560048036038101906107b091906142b5565b612307565b6040516107c291906139de565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190613d22565b61239b565b005b34801561080057600080fd5b5061081b60048036038101906108169190613f87565b612492565b005b34801561082957600080fd5b5061083261254f565b60405161083f9190613f19565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906142f5565b612555565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109b457506109b382612677565b5b9050919050565b6109c36126e1565b73ffffffffffffffffffffffffffffffffffffffff166109e1611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90614394565b60405180910390fd5b8060079080519060200190610a4d92919061384d565b5050565b610a596126e1565b73ffffffffffffffffffffffffffffffffffffffff16610a77611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490614394565b60405180910390fd5b600d60405180610120016040528089815260200188815260200160008152602001878152602001868152602001600115158152602001851515815260200184151581526020018373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000019080519060200190610b7292919061384d565b506020820151816001019080519060200190610b8f92919061384d565b5060408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050507f5c345c7d4260531170107ad505f5a5b8694362aab48b21447e13a84e14b909a187876001600d80549050610c8d91906143e3565b8888888888604051610ca6989796959493929190614417565b60405180910390a150505050505050565b610cbf6126e1565b73ffffffffffffffffffffffffffffffffffffffff16610cdd611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614394565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054610d86906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610db2906144d2565b8015610dff5780601f10610dd457610100808354040283529160200191610dff565b820191906000526020600020905b815481529060010190602001808311610de257829003601f168201915b5050505050905090565b6000610e14826126e9565b610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614575565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e9982611a79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614607565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f286126e1565b73ffffffffffffffffffffffffffffffffffffffff161480610f575750610f5681610f516126e1565b612307565b5b610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90614699565b60405180910390fd5b610fa18383836126f6565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054905090565b610fe08383836127a8565b505050565b610fed6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661100b611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890614394565b60405180910390fd5b80600d8381548110611076576110756146b9565b5b906000526020600020906006020160050160016101000a81548160ff0219169083151502179055505050565b60006110ad83611a8f565b82106110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e59061475a565b60405180910390fd5b60006110f8610fcc565b905060008060005b8381101561125c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111f257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361124857868403611239578195505050505050611298565b83806112449061477a565b9450505b5080806112549061477a565b915050611100565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90614834565b60405180910390fd5b92915050565b6112a66126e1565b73ffffffffffffffffffffffffffffffffffffffff166112c4611bff565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614394565b60405180910390fd5b600047905060006113296126e1565b73ffffffffffffffffffffffffffffffffffffffff168260405161134c90614885565b60006040518083038185875af1925050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b50509050806113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906148e6565b60405180910390fd5b5050565b6113f183838360405180602001604052806000815250611f8f565b505050565b6114096114016126e1565b600083610fd5565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a876114326126e1565b60008360405161144493929190614906565b60405180910390a150565b6000611459610fcc565b821061149a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611491906149af565b60405180910390fd5b819050919050565b6114aa6126e1565b73ffffffffffffffffffffffffffffffffffffffff166114c8611bff565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590614394565b60405180910390fd5b80600c8190555050565b6002600a540361156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614a1b565b60405180910390fd5b6002600a81905550600d8054905081106115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614a87565b60405180910390fd5b600d81815481106115d0576115cf6146b9565b5b90600052602060002090600602016003015482600d83815481106115f7576115f66146b9565b5b9060005260206000209060060201600201546116139190614aa7565b1115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614b6f565b60405180910390fd5b600d8181548110611668576116676146b9565b5b906000526020600020906006020160050160009054906101000a900460ff166116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614bdb565b60405180910390fd5b81600d82815481106116db576116da6146b9565b5b9060005260206000209060060201600401546116f79190614bfb565b3414611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90614ca1565b60405180910390fd5b600c5482111561177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490614d0d565b60405180910390fd5b600d8181548110611791576117906146b9565b5b906000526020600020906006020160050160019054906101000a900460ff161561189b576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316117fd6126e1565b6040518263ffffffff1660e01b81526004016118199190613e35565b602060405180830381865afa158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190614d42565b1161189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190614de1565b60405180910390fd5b5b600d81815481106118af576118ae6146b9565b5b906000526020600020906006020160050160029054906101000a900460ff16156119e2576000600d82815481106118e9576118e86146b9565b5b906000526020600020906006020160050160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316119436126e1565b6040518263ffffffff1660e01b815260040161195f9190613e35565b602060405180830381865afa15801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190614d42565b116119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614e73565b60405180910390fd5b505b81600d82815481106119f7576119f66146b9565b5b90600052602060002090600602016002016000828254611a179190614aa7565b92505081905550611a288383612cf0565b7f882b4640daa712fae7f68f7e97ebca54ee1c2eb09ab65c3374b61c93e329c51d611a516126e1565b848484604051611a649493929190614e93565b60405180910390a16001600a81905550505050565b6000611a8482612d0e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af690614f4a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611b7f6126e1565b73ffffffffffffffffffffffffffffffffffffffff16611b9d611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614394565b60405180910390fd5b611bfd6000612f11565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611c38906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c64906144d2565b8015611cb15780601f10611c8657610100808354040283529160200191611cb1565b820191906000526020600020905b815481529060010190602001808311611c9457829003601f168201915b5050505050905090565b611cc36126e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2790614fb6565b60405180910390fd5b8060066000611d3d6126e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dea6126e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2f91906139de565b60405180910390a35050565b611e436126e1565b73ffffffffffffffffffffffffffffffffffffffff16611e61611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614394565b60405180910390fd5b80600d8381548110611ecc57611ecb6146b9565b5b9060005260206000209060060201600301819055505050565b611eed6126e1565b73ffffffffffffffffffffffffffffffffffffffff16611f0b611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890614394565b60405180910390fd5b80600d8381548110611f7657611f756146b9565b5b9060005260206000209060060201600401819055505050565b611f9a8484846127a8565b611fa684848484612fd7565b611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90615048565b60405180910390fd5b50505050565b600d8181548110611ffb57600080fd5b906000526020600020906006020160009150905080600001805461201e906144d2565b80601f016020809104026020016040519081016040528092919081815260200182805461204a906144d2565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b5050505050908060010180546120ac906144d2565b80601f01602080910402602001604051908101604052809291908181526020018280546120d8906144d2565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b5050505050908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b60606121ab826126e9565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e1906150da565b60405180910390fd5b60006121f461315e565b90506000815111612214576040518060200160405280600081525061223f565b8061221e846131f0565b60405160200161222f929190615136565b6040516020818303038152906040525b915050919050565b60085481565b6122556126e1565b73ffffffffffffffffffffffffffffffffffffffff16612273611bff565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090614394565b60405180910390fd5b80600d83815481106122de576122dd6146b9565b5b9060005260206000209060060201600101908051906020019061230292919061384d565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a36126e1565b73ffffffffffffffffffffffffffffffffffffffff166123c1611bff565b73ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90614394565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d906151cc565b60405180910390fd5b61248f81612f11565b50565b61249a6126e1565b73ffffffffffffffffffffffffffffffffffffffff166124b8611bff565b73ffffffffffffffffffffffffffffffffffffffff161461250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614394565b60405180910390fd5b80600d8381548110612523576125226146b9565b5b906000526020600020906006020160050160006101000a81548160ff0219169083151502179055505050565b600c5481565b61255d6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661257b611bff565b73ffffffffffffffffffffffffffffffffffffffff16146125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c890614394565b60405180910390fd5b81600d84815481106125e6576125e56146b9565b5b906000526020600020906006020160050160026101000a81548160ff02191690831515021790555080600d8481548110612623576126226146b9565b5b906000526020600020906006020160050160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127b382612d0e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127da6126e1565b73ffffffffffffffffffffffffffffffffffffffff16148061283657506127ff6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661281e84610e09565b73ffffffffffffffffffffffffffffffffffffffff16145b806128525750612851826000015161284c6126e1565b612307565b5b905080612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b9061525e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd906152f0565b60405180910390fd5b6129138585856001613350565b61292360008484600001516126f6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612991919061532c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a359190615360565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b3b9190614aa7565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c8057612bb0816126e9565b15612c7f576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ce88686866001613356565b505050505050565b612d0a82826040518060200160405280600081525061335c565b5050565b612d166138d3565b612d1f826126e9565b612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590615418565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612dc25760017f000000000000000000000000000000000000000000000000000000000000000084612db591906143e3565b612dbf9190614aa7565b90505b60008390505b818110612ed0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ebc57809350505050612f0c565b508080612ec890615438565b915050612dc8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f03906154d3565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ff88473ffffffffffffffffffffffffffffffffffffffff1661383a565b15613151578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130216126e1565b8786866040518563ffffffff1660e01b81526004016130439493929190615548565b6020604051808303816000875af192505050801561307f57506040513d601f19601f8201168201806040525081019061307c91906155a9565b60015b613101573d80600081146130af576040519150601f19603f3d011682016040523d82523d6000602084013e6130b4565b606091505b5060008151036130f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f090615048565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613156565b600190505b949350505050565b60606007805461316d906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054613199906144d2565b80156131e65780601f106131bb576101008083540402835291602001916131e6565b820191906000526020600020905b8154815290600101906020018083116131c957829003601f168201915b5050505050905090565b606060008203613237576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061334b565b600082905060005b600082146132695780806132529061477a565b915050600a826132629190615605565b915061323f565b60008167ffffffffffffffff81111561328557613284613a14565b5b6040519080825280601f01601f1916602001820160405280156132b75781602001600182028036833780820191505090505b5090505b60008514613344576001826132d091906143e3565b9150600a856132df9190615636565b60306132eb9190614aa7565b60f81b818381518110613301576133006146b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561333d9190615605565b94506132bb565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c8906156d9565b60405180910390fd5b6133da816126e9565b1561341a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341190615745565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561347d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613474906157d7565b60405180910390fd5b61348a6000858386613350565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135879190615360565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135ae9190615360565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561381d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137bd6000888488612fd7565b6137fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f390615048565b60405180910390fd5b81806138079061477a565b92505080806138159061477a565b91505061374c565b50806000819055506138326000878588613356565b505050505050565b600080823b905060008111915050919050565b828054613859906144d2565b90600052602060002090601f01602090048101928261387b57600085556138c2565b82601f1061389457805160ff19168380011785556138c2565b828001600101855582156138c2579182015b828111156138c15782518255916020019190600101906138a6565b5b5090506138cf919061390d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561392657600081600090555060010161390e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139738161393e565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b6000602082840312156139ac576139ab613934565b5b60006139ba84828501613981565b91505092915050565b60008115159050919050565b6139d8816139c3565b82525050565b60006020820190506139f360008301846139cf565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4c82613a03565b810181811067ffffffffffffffff82111715613a6b57613a6a613a14565b5b80604052505050565b6000613a7e61392a565b9050613a8a8282613a43565b919050565b600067ffffffffffffffff821115613aaa57613aa9613a14565b5b613ab382613a03565b9050602081019050919050565b82818337600083830152505050565b6000613ae2613add84613a8f565b613a74565b905082815260208101848484011115613afe57613afd6139fe565b5b613b09848285613ac0565b509392505050565b600082601f830112613b2657613b256139f9565b5b8135613b36848260208601613acf565b91505092915050565b600060208284031215613b5557613b54613934565b5b600082013567ffffffffffffffff811115613b7357613b72613939565b5b613b7f84828501613b11565b91505092915050565b6000819050919050565b613b9b81613b88565b8114613ba657600080fd5b50565b600081359050613bb881613b92565b92915050565b613bc7816139c3565b8114613bd257600080fd5b50565b600081359050613be481613bbe565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c1582613bea565b9050919050565b613c2581613c0a565b8114613c3057600080fd5b50565b600081359050613c4281613c1c565b92915050565b600080600080600080600060e0888a031215613c6757613c66613934565b5b600088013567ffffffffffffffff811115613c8557613c84613939565b5b613c918a828b01613b11565b975050602088013567ffffffffffffffff811115613cb257613cb1613939565b5b613cbe8a828b01613b11565b9650506040613ccf8a828b01613ba9565b9550506060613ce08a828b01613ba9565b9450506080613cf18a828b01613bd5565b93505060a0613d028a828b01613bd5565b92505060c0613d138a828b01613c33565b91505092959891949750929550565b600060208284031215613d3857613d37613934565b5b6000613d4684828501613c33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d89578082015181840152602081019050613d6e565b83811115613d98576000848401525b50505050565b6000613da982613d4f565b613db38185613d5a565b9350613dc3818560208601613d6b565b613dcc81613a03565b840191505092915050565b60006020820190508181036000830152613df18184613d9e565b905092915050565b600060208284031215613e0f57613e0e613934565b5b6000613e1d84828501613ba9565b91505092915050565b613e2f81613c0a565b82525050565b6000602082019050613e4a6000830184613e26565b92915050565b60008060408385031215613e6757613e66613934565b5b6000613e7585828601613c33565b9250506020613e8685828601613ba9565b9150509250929050565b6000819050919050565b6000613eb5613eb0613eab84613bea565b613e90565b613bea565b9050919050565b6000613ec782613e9a565b9050919050565b6000613ed982613ebc565b9050919050565b613ee981613ece565b82525050565b6000602082019050613f046000830184613ee0565b92915050565b613f1381613b88565b82525050565b6000602082019050613f2e6000830184613f0a565b92915050565b600080600060608486031215613f4d57613f4c613934565b5b6000613f5b86828701613c33565b9350506020613f6c86828701613c33565b9250506040613f7d86828701613ba9565b9150509250925092565b60008060408385031215613f9e57613f9d613934565b5b6000613fac85828601613ba9565b9250506020613fbd85828601613bd5565b9150509250929050565b600080600060608486031215613fe057613fdf613934565b5b6000613fee86828701613c33565b9350506020613fff86828701613ba9565b925050604061401086828701613ba9565b9150509250925092565b6000806040838503121561403157614030613934565b5b600061403f85828601613c33565b925050602061405085828601613bd5565b9150509250929050565b6000806040838503121561407157614070613934565b5b600061407f85828601613ba9565b925050602061409085828601613ba9565b9150509250929050565b600067ffffffffffffffff8211156140b5576140b4613a14565b5b6140be82613a03565b9050602081019050919050565b60006140de6140d98461409a565b613a74565b9050828152602081018484840111156140fa576140f96139fe565b5b614105848285613ac0565b509392505050565b600082601f830112614122576141216139f9565b5b81356141328482602086016140cb565b91505092915050565b6000806000806080858703121561415557614154613934565b5b600061416387828801613c33565b945050602061417487828801613c33565b935050604061418587828801613ba9565b925050606085013567ffffffffffffffff8111156141a6576141a5613939565b5b6141b28782880161410d565b91505092959194509250565b60006101208201905081810360008301526141d9818c613d9e565b905081810360208301526141ed818b613d9e565b90506141fc604083018a613f0a565b6142096060830189613f0a565b6142166080830188613f0a565b61422360a08301876139cf565b61423060c08301866139cf565b61423d60e08301856139cf565b61424b610100830184613e26565b9a9950505050505050505050565b600080604083850312156142705761426f613934565b5b600061427e85828601613ba9565b925050602083013567ffffffffffffffff81111561429f5761429e613939565b5b6142ab85828601613b11565b9150509250929050565b600080604083850312156142cc576142cb613934565b5b60006142da85828601613c33565b92505060206142eb85828601613c33565b9150509250929050565b60008060006060848603121561430e5761430d613934565b5b600061431c86828701613ba9565b935050602061432d86828701613bd5565b925050604061433e86828701613c33565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061437e602083613d5a565b915061438982614348565b602082019050919050565b600060208201905081810360008301526143ad81614371565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143ee82613b88565b91506143f983613b88565b92508282101561440c5761440b6143b4565b5b828203905092915050565b6000610100820190508181036000830152614432818b613d9e565b90508181036020830152614446818a613d9e565b90506144556040830189613f0a565b6144626060830188613f0a565b61446f6080830187613f0a565b61447c60a08301866139cf565b61448960c08301856139cf565b61449660e0830184613e26565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144ea57607f821691505b6020821081036144fd576144fc6144a3565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061455f602d83613d5a565b915061456a82614503565b604082019050919050565b6000602082019050818103600083015261458e81614552565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006145f1602283613d5a565b91506145fc82614595565b604082019050919050565b60006020820190508181036000830152614620816145e4565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614683603983613d5a565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614744602283613d5a565b915061474f826146e8565b604082019050919050565b6000602082019050818103600083015261477381614737565b9050919050565b600061478582613b88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b7576147b66143b4565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061481e602e83613d5a565b9150614829826147c2565b604082019050919050565b6000602082019050818103600083015261484d81614811565b9050919050565b600081905092915050565b50565b600061486f600083614854565b915061487a8261485f565b600082019050919050565b600061489082614862565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b60006148d0600d83613d5a565b91506148db8261489a565b602082019050919050565b600060208201905081810360008301526148ff816148c3565b9050919050565b600060608201905061491b6000830186613e26565b6149286020830185613e26565b6149356040830184613f0a565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614999602383613d5a565b91506149a48261493d565b604082019050919050565b600060208201905081810360008301526149c88161498c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a05601f83613d5a565b9150614a10826149cf565b602082019050919050565b60006020820190508181036000830152614a34816149f8565b9050919050565b7f466c6f77657220646f6573206e6f742065786973740000000000000000000000600082015250565b6000614a71601583613d5a565b9150614a7c82614a3b565b602082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b6000614ab282613b88565b9150614abd83613b88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af257614af16143b4565b5b828201905092915050565b7f45786365656473206d617820737570706c79206f6620666c6f7765722074797060008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b59602183613d5a565b9150614b6482614afd565b604082019050919050565b60006020820190508181036000830152614b8881614b4c565b9050919050565b7f466c6f776572206973206e6f7420696e20736561736f6e000000000000000000600082015250565b6000614bc5601783613d5a565b9150614bd082614b8f565b602082019050919050565b60006020820190508181036000830152614bf481614bb8565b9050919050565b6000614c0682613b88565b9150614c1183613b88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4a57614c496143b4565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b6000614c8b601c83613d5a565b9150614c9682614c55565b602082019050919050565b60006020820190508181036000830152614cba81614c7e565b9050919050565b7f45786365656473206d6178696d756d20706572207472616e73616374696f6e00600082015250565b6000614cf7601f83613d5a565b9150614d0282614cc1565b602082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b600081519050614d3c81613b92565b92915050565b600060208284031215614d5857614d57613934565b5b6000614d6684828501614d2d565b91505092915050565b7f53656e646572206d75737420686f6c6420612050686f746f73796e746865736960008201527f73204e4654000000000000000000000000000000000000000000000000000000602082015250565b6000614dcb602583613d5a565b9150614dd682614d6f565b604082019050919050565b60006020820190508181036000830152614dfa81614dbe565b9050919050565b7f53656e646572206d75737420686f6c642061207370656369666963204e46542060008201527f746f206d696e74207468697320666c6f77657200000000000000000000000000602082015250565b6000614e5d603383613d5a565b9150614e6882614e01565b604082019050919050565b60006020820190508181036000830152614e8c81614e50565b9050919050565b6000608082019050614ea86000830187613e26565b614eb56020830186613e26565b614ec26040830185613f0a565b614ecf6060830184613f0a565b95945050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f34602b83613d5a565b9150614f3f82614ed8565b604082019050919050565b60006020820190508181036000830152614f6381614f27565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614fa0601a83613d5a565b9150614fab82614f6a565b602082019050919050565b60006020820190508181036000830152614fcf81614f93565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000615032603383613d5a565b915061503d82614fd6565b604082019050919050565b6000602082019050818103600083015261506181615025565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006150c4602f83613d5a565b91506150cf82615068565b604082019050919050565b600060208201905081810360008301526150f3816150b7565b9050919050565b600081905092915050565b600061511082613d4f565b61511a81856150fa565b935061512a818560208601613d6b565b80840191505092915050565b60006151428285615105565b915061514e8284615105565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151b6602683613d5a565b91506151c18261515a565b604082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615248603283613d5a565b9150615253826151ec565b604082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006152da602683613d5a565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061533782615310565b915061534283615310565b925082821015615355576153546143b4565b5b828203905092915050565b600061536b82615310565b915061537683615310565b9250826fffffffffffffffffffffffffffffffff0382111561539b5761539a6143b4565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615402602a83613d5a565b915061540d826153a6565b604082019050919050565b60006020820190508181036000830152615431816153f5565b9050919050565b600061544382613b88565b915060008203615456576154556143b4565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006154bd602f83613d5a565b91506154c882615461565b604082019050919050565b600060208201905081810360008301526154ec816154b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061551a826154f3565b61552481856154fe565b9350615534818560208601613d6b565b61553d81613a03565b840191505092915050565b600060808201905061555d6000830187613e26565b61556a6020830186613e26565b6155776040830185613f0a565b8181036060830152615589818461550f565b905095945050505050565b6000815190506155a38161396a565b92915050565b6000602082840312156155bf576155be613934565b5b60006155cd84828501615594565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061561082613b88565b915061561b83613b88565b92508261562b5761562a6155d6565b5b828204905092915050565b600061564182613b88565b915061564c83613b88565b92508261565c5761565b6155d6565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156c3602183613d5a565b91506156ce82615667565b604082019050919050565b600060208201905081810360008301526156f2816156b6565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061572f601d83613d5a565b915061573a826156f9565b602082019050919050565b6000602082019050818103600083015261575e81615722565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006157c1602283613d5a565b91506157cc82615765565b604082019050919050565b600060208201905081810360008301526157f0816157b4565b905091905056fea2646970667358221220a6e0d15a2ef86a5e71cdd1c51b4615ef7bce0c3b340a2217966379e3758a22a264736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000366e3b64ef9060eb4b2b0908d7cd165c26312a23000000000000000000000000000000000000000000000000000000000000000d466c6f7765722053686f707065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007464c575253485000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636352211e11610118578063b97a0f72116100a0578063e985e9c51161006f578063e985e9c51461078e578063f2fde38b146107cb578063f8e378c5146107f4578063f968adbe1461081d578063fb965bcd146108485761020f565b8063b97a0f72146106b8578063c87b56dd146106fd578063d7224ba01461073a578063e168813b146107655761020f565b806395d89b41116100e757806395d89b41146105e9578063a22cb46514610614578063a6a53fe91461063d578063b3de019c14610666578063b88d4fde1461068f5761020f565b80636352211e1461052d57806370a082311461056a578063715018a6146105a75780638da5cb5b146105be5761020f565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461045957806342966c68146104825780634f6ccce7146104ab578063559a7825146104e8578063598d00a9146105115761020f565b806323b872dd146103b35780632517ccb7146103dc5780632f745c59146104055780633ccfd60b146104425761020f565b806306fdde03116101e257806306fdde03146102cc578063081812fc146102f7578063095ea7b3146103345780630a29e04e1461035d57806318160ddd146103885761020f565b806301ffc9a71461021457806302fe5305146102515780630480c7c81461027a57806305846e38146102a3575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613996565b610871565b60405161024891906139de565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613b3f565b6109bb565b005b34801561028657600080fd5b506102a1600480360381019061029c9190613c48565b610a51565b005b3480156102af57600080fd5b506102ca60048036038101906102c59190613d22565b610cb7565b005b3480156102d857600080fd5b506102e1610d77565b6040516102ee9190613dd7565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613df9565b610e09565b60405161032b9190613e35565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613e50565b610e8e565b005b34801561036957600080fd5b50610372610fa6565b60405161037f9190613eef565b60405180910390f35b34801561039457600080fd5b5061039d610fcc565b6040516103aa9190613f19565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613f34565b610fd5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613f87565b610fe5565b005b34801561041157600080fd5b5061042c60048036038101906104279190613e50565b6110a2565b6040516104399190613f19565b60405180910390f35b34801561044e57600080fd5b5061045761129e565b005b34801561046557600080fd5b50610480600480360381019061047b9190613f34565b6113d6565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613df9565b6113f6565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613df9565b61144f565b6040516104df9190613f19565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613df9565b6114a2565b005b61052b60048036038101906105269190613fc7565b611528565b005b34801561053957600080fd5b50610554600480360381019061054f9190613df9565b611a79565b6040516105619190613e35565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613d22565b611a8f565b60405161059e9190613f19565b60405180910390f35b3480156105b357600080fd5b506105bc611b77565b005b3480156105ca57600080fd5b506105d3611bff565b6040516105e09190613e35565b60405180910390f35b3480156105f557600080fd5b506105fe611c29565b60405161060b9190613dd7565b60405180910390f35b34801561062057600080fd5b5061063b6004803603810190610636919061401a565b611cbb565b005b34801561064957600080fd5b50610664600480360381019061065f919061405a565b611e3b565b005b34801561067257600080fd5b5061068d6004803603810190610688919061405a565b611ee5565b005b34801561069b57600080fd5b506106b660048036038101906106b1919061413b565b611f8f565b005b3480156106c457600080fd5b506106df60048036038101906106da9190613df9565b611feb565b6040516106f4999897969594939291906141be565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190613df9565b6121a0565b6040516107319190613dd7565b60405180910390f35b34801561074657600080fd5b5061074f612247565b60405161075c9190613f19565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190614259565b61224d565b005b34801561079a57600080fd5b506107b560048036038101906107b091906142b5565b612307565b6040516107c291906139de565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190613d22565b61239b565b005b34801561080057600080fd5b5061081b60048036038101906108169190613f87565b612492565b005b34801561082957600080fd5b5061083261254f565b60405161083f9190613f19565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906142f5565b612555565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109b457506109b382612677565b5b9050919050565b6109c36126e1565b73ffffffffffffffffffffffffffffffffffffffff166109e1611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90614394565b60405180910390fd5b8060079080519060200190610a4d92919061384d565b5050565b610a596126e1565b73ffffffffffffffffffffffffffffffffffffffff16610a77611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490614394565b60405180910390fd5b600d60405180610120016040528089815260200188815260200160008152602001878152602001868152602001600115158152602001851515815260200184151581526020018373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000019080519060200190610b7292919061384d565b506020820151816001019080519060200190610b8f92919061384d565b5060408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050507f5c345c7d4260531170107ad505f5a5b8694362aab48b21447e13a84e14b909a187876001600d80549050610c8d91906143e3565b8888888888604051610ca6989796959493929190614417565b60405180910390a150505050505050565b610cbf6126e1565b73ffffffffffffffffffffffffffffffffffffffff16610cdd611bff565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614394565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054610d86906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610db2906144d2565b8015610dff5780601f10610dd457610100808354040283529160200191610dff565b820191906000526020600020905b815481529060010190602001808311610de257829003601f168201915b5050505050905090565b6000610e14826126e9565b610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614575565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e9982611a79565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0090614607565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f286126e1565b73ffffffffffffffffffffffffffffffffffffffff161480610f575750610f5681610f516126e1565b612307565b5b610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d90614699565b60405180910390fd5b610fa18383836126f6565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054905090565b610fe08383836127a8565b505050565b610fed6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661100b611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890614394565b60405180910390fd5b80600d8381548110611076576110756146b9565b5b906000526020600020906006020160050160016101000a81548160ff0219169083151502179055505050565b60006110ad83611a8f565b82106110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e59061475a565b60405180910390fd5b60006110f8610fcc565b905060008060005b8381101561125c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146111f257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361124857868403611239578195505050505050611298565b83806112449061477a565b9450505b5080806112549061477a565b915050611100565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90614834565b60405180910390fd5b92915050565b6112a66126e1565b73ffffffffffffffffffffffffffffffffffffffff166112c4611bff565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614394565b60405180910390fd5b600047905060006113296126e1565b73ffffffffffffffffffffffffffffffffffffffff168260405161134c90614885565b60006040518083038185875af1925050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b50509050806113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906148e6565b60405180910390fd5b5050565b6113f183838360405180602001604052806000815250611f8f565b505050565b6114096114016126e1565b600083610fd5565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a876114326126e1565b60008360405161144493929190614906565b60405180910390a150565b6000611459610fcc565b821061149a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611491906149af565b60405180910390fd5b819050919050565b6114aa6126e1565b73ffffffffffffffffffffffffffffffffffffffff166114c8611bff565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590614394565b60405180910390fd5b80600c8190555050565b6002600a540361156d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156490614a1b565b60405180910390fd5b6002600a81905550600d8054905081106115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614a87565b60405180910390fd5b600d81815481106115d0576115cf6146b9565b5b90600052602060002090600602016003015482600d83815481106115f7576115f66146b9565b5b9060005260206000209060060201600201546116139190614aa7565b1115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614b6f565b60405180910390fd5b600d8181548110611668576116676146b9565b5b906000526020600020906006020160050160009054906101000a900460ff166116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614bdb565b60405180910390fd5b81600d82815481106116db576116da6146b9565b5b9060005260206000209060060201600401546116f79190614bfb565b3414611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90614ca1565b60405180910390fd5b600c5482111561177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490614d0d565b60405180910390fd5b600d8181548110611791576117906146b9565b5b906000526020600020906006020160050160019054906101000a900460ff161561189b576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316117fd6126e1565b6040518263ffffffff1660e01b81526004016118199190613e35565b602060405180830381865afa158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a9190614d42565b1161189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190614de1565b60405180910390fd5b5b600d81815481106118af576118ae6146b9565b5b906000526020600020906006020160050160029054906101000a900460ff16156119e2576000600d82815481106118e9576118e86146b9565b5b906000526020600020906006020160050160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082316119436126e1565b6040518263ffffffff1660e01b815260040161195f9190613e35565b602060405180830381865afa15801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190614d42565b116119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614e73565b60405180910390fd5b505b81600d82815481106119f7576119f66146b9565b5b90600052602060002090600602016002016000828254611a179190614aa7565b92505081905550611a288383612cf0565b7f882b4640daa712fae7f68f7e97ebca54ee1c2eb09ab65c3374b61c93e329c51d611a516126e1565b848484604051611a649493929190614e93565b60405180910390a16001600a81905550505050565b6000611a8482612d0e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af690614f4a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611b7f6126e1565b73ffffffffffffffffffffffffffffffffffffffff16611b9d611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bea90614394565b60405180910390fd5b611bfd6000612f11565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611c38906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c64906144d2565b8015611cb15780601f10611c8657610100808354040283529160200191611cb1565b820191906000526020600020905b815481529060010190602001808311611c9457829003601f168201915b5050505050905090565b611cc36126e1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2790614fb6565b60405180910390fd5b8060066000611d3d6126e1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dea6126e1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2f91906139de565b60405180910390a35050565b611e436126e1565b73ffffffffffffffffffffffffffffffffffffffff16611e61611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90614394565b60405180910390fd5b80600d8381548110611ecc57611ecb6146b9565b5b9060005260206000209060060201600301819055505050565b611eed6126e1565b73ffffffffffffffffffffffffffffffffffffffff16611f0b611bff565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890614394565b60405180910390fd5b80600d8381548110611f7657611f756146b9565b5b9060005260206000209060060201600401819055505050565b611f9a8484846127a8565b611fa684848484612fd7565b611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90615048565b60405180910390fd5b50505050565b600d8181548110611ffb57600080fd5b906000526020600020906006020160009150905080600001805461201e906144d2565b80601f016020809104026020016040519081016040528092919081815260200182805461204a906144d2565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b5050505050908060010180546120ac906144d2565b80601f01602080910402602001604051908101604052809291908181526020018280546120d8906144d2565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b5050505050908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b60606121ab826126e9565b6121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e1906150da565b60405180910390fd5b60006121f461315e565b90506000815111612214576040518060200160405280600081525061223f565b8061221e846131f0565b60405160200161222f929190615136565b6040516020818303038152906040525b915050919050565b60085481565b6122556126e1565b73ffffffffffffffffffffffffffffffffffffffff16612273611bff565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090614394565b60405180910390fd5b80600d83815481106122de576122dd6146b9565b5b9060005260206000209060060201600101908051906020019061230292919061384d565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a36126e1565b73ffffffffffffffffffffffffffffffffffffffff166123c1611bff565b73ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90614394565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d906151cc565b60405180910390fd5b61248f81612f11565b50565b61249a6126e1565b73ffffffffffffffffffffffffffffffffffffffff166124b8611bff565b73ffffffffffffffffffffffffffffffffffffffff161461250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614394565b60405180910390fd5b80600d8381548110612523576125226146b9565b5b906000526020600020906006020160050160006101000a81548160ff0219169083151502179055505050565b600c5481565b61255d6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661257b611bff565b73ffffffffffffffffffffffffffffffffffffffff16146125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c890614394565b60405180910390fd5b81600d84815481106125e6576125e56146b9565b5b906000526020600020906006020160050160026101000a81548160ff02191690831515021790555080600d8481548110612623576126226146b9565b5b906000526020600020906006020160050160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127b382612d0e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127da6126e1565b73ffffffffffffffffffffffffffffffffffffffff16148061283657506127ff6126e1565b73ffffffffffffffffffffffffffffffffffffffff1661281e84610e09565b73ffffffffffffffffffffffffffffffffffffffff16145b806128525750612851826000015161284c6126e1565b612307565b5b905080612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b9061525e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fd906152f0565b60405180910390fd5b6129138585856001613350565b61292360008484600001516126f6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612991919061532c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a359190615360565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b3b9190614aa7565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c8057612bb0816126e9565b15612c7f576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ce88686866001613356565b505050505050565b612d0a82826040518060200160405280600081525061335c565b5050565b612d166138d3565b612d1f826126e9565b612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590615418565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000648310612dc25760017f000000000000000000000000000000000000000000000000000000000000006484612db591906143e3565b612dbf9190614aa7565b90505b60008390505b818110612ed0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ebc57809350505050612f0c565b508080612ec890615438565b915050612dc8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f03906154d3565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ff88473ffffffffffffffffffffffffffffffffffffffff1661383a565b15613151578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130216126e1565b8786866040518563ffffffff1660e01b81526004016130439493929190615548565b6020604051808303816000875af192505050801561307f57506040513d601f19601f8201168201806040525081019061307c91906155a9565b60015b613101573d80600081146130af576040519150601f19603f3d011682016040523d82523d6000602084013e6130b4565b606091505b5060008151036130f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f090615048565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613156565b600190505b949350505050565b60606007805461316d906144d2565b80601f0160208091040260200160405190810160405280929190818152602001828054613199906144d2565b80156131e65780601f106131bb576101008083540402835291602001916131e6565b820191906000526020600020905b8154815290600101906020018083116131c957829003601f168201915b5050505050905090565b606060008203613237576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061334b565b600082905060005b600082146132695780806132529061477a565b915050600a826132629190615605565b915061323f565b60008167ffffffffffffffff81111561328557613284613a14565b5b6040519080825280601f01601f1916602001820160405280156132b75781602001600182028036833780820191505090505b5090505b60008514613344576001826132d091906143e3565b9150600a856132df9190615636565b60306132eb9190614aa7565b60f81b818381518110613301576133006146b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561333d9190615605565b94506132bb565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036133d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c8906156d9565b60405180910390fd5b6133da816126e9565b1561341a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341190615745565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000006483111561347d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613474906157d7565b60405180910390fd5b61348a6000858386613350565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135879190615360565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135ae9190615360565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561381d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137bd6000888488612fd7565b6137fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f390615048565b60405180910390fd5b81806138079061477a565b92505080806138159061477a565b91505061374c565b50806000819055506138326000878588613356565b505050505050565b600080823b905060008111915050919050565b828054613859906144d2565b90600052602060002090601f01602090048101928261387b57600085556138c2565b82601f1061389457805160ff19168380011785556138c2565b828001600101855582156138c2579182015b828111156138c15782518255916020019190600101906138a6565b5b5090506138cf919061390d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561392657600081600090555060010161390e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139738161393e565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b6000602082840312156139ac576139ab613934565b5b60006139ba84828501613981565b91505092915050565b60008115159050919050565b6139d8816139c3565b82525050565b60006020820190506139f360008301846139cf565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4c82613a03565b810181811067ffffffffffffffff82111715613a6b57613a6a613a14565b5b80604052505050565b6000613a7e61392a565b9050613a8a8282613a43565b919050565b600067ffffffffffffffff821115613aaa57613aa9613a14565b5b613ab382613a03565b9050602081019050919050565b82818337600083830152505050565b6000613ae2613add84613a8f565b613a74565b905082815260208101848484011115613afe57613afd6139fe565b5b613b09848285613ac0565b509392505050565b600082601f830112613b2657613b256139f9565b5b8135613b36848260208601613acf565b91505092915050565b600060208284031215613b5557613b54613934565b5b600082013567ffffffffffffffff811115613b7357613b72613939565b5b613b7f84828501613b11565b91505092915050565b6000819050919050565b613b9b81613b88565b8114613ba657600080fd5b50565b600081359050613bb881613b92565b92915050565b613bc7816139c3565b8114613bd257600080fd5b50565b600081359050613be481613bbe565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c1582613bea565b9050919050565b613c2581613c0a565b8114613c3057600080fd5b50565b600081359050613c4281613c1c565b92915050565b600080600080600080600060e0888a031215613c6757613c66613934565b5b600088013567ffffffffffffffff811115613c8557613c84613939565b5b613c918a828b01613b11565b975050602088013567ffffffffffffffff811115613cb257613cb1613939565b5b613cbe8a828b01613b11565b9650506040613ccf8a828b01613ba9565b9550506060613ce08a828b01613ba9565b9450506080613cf18a828b01613bd5565b93505060a0613d028a828b01613bd5565b92505060c0613d138a828b01613c33565b91505092959891949750929550565b600060208284031215613d3857613d37613934565b5b6000613d4684828501613c33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d89578082015181840152602081019050613d6e565b83811115613d98576000848401525b50505050565b6000613da982613d4f565b613db38185613d5a565b9350613dc3818560208601613d6b565b613dcc81613a03565b840191505092915050565b60006020820190508181036000830152613df18184613d9e565b905092915050565b600060208284031215613e0f57613e0e613934565b5b6000613e1d84828501613ba9565b91505092915050565b613e2f81613c0a565b82525050565b6000602082019050613e4a6000830184613e26565b92915050565b60008060408385031215613e6757613e66613934565b5b6000613e7585828601613c33565b9250506020613e8685828601613ba9565b9150509250929050565b6000819050919050565b6000613eb5613eb0613eab84613bea565b613e90565b613bea565b9050919050565b6000613ec782613e9a565b9050919050565b6000613ed982613ebc565b9050919050565b613ee981613ece565b82525050565b6000602082019050613f046000830184613ee0565b92915050565b613f1381613b88565b82525050565b6000602082019050613f2e6000830184613f0a565b92915050565b600080600060608486031215613f4d57613f4c613934565b5b6000613f5b86828701613c33565b9350506020613f6c86828701613c33565b9250506040613f7d86828701613ba9565b9150509250925092565b60008060408385031215613f9e57613f9d613934565b5b6000613fac85828601613ba9565b9250506020613fbd85828601613bd5565b9150509250929050565b600080600060608486031215613fe057613fdf613934565b5b6000613fee86828701613c33565b9350506020613fff86828701613ba9565b925050604061401086828701613ba9565b9150509250925092565b6000806040838503121561403157614030613934565b5b600061403f85828601613c33565b925050602061405085828601613bd5565b9150509250929050565b6000806040838503121561407157614070613934565b5b600061407f85828601613ba9565b925050602061409085828601613ba9565b9150509250929050565b600067ffffffffffffffff8211156140b5576140b4613a14565b5b6140be82613a03565b9050602081019050919050565b60006140de6140d98461409a565b613a74565b9050828152602081018484840111156140fa576140f96139fe565b5b614105848285613ac0565b509392505050565b600082601f830112614122576141216139f9565b5b81356141328482602086016140cb565b91505092915050565b6000806000806080858703121561415557614154613934565b5b600061416387828801613c33565b945050602061417487828801613c33565b935050604061418587828801613ba9565b925050606085013567ffffffffffffffff8111156141a6576141a5613939565b5b6141b28782880161410d565b91505092959194509250565b60006101208201905081810360008301526141d9818c613d9e565b905081810360208301526141ed818b613d9e565b90506141fc604083018a613f0a565b6142096060830189613f0a565b6142166080830188613f0a565b61422360a08301876139cf565b61423060c08301866139cf565b61423d60e08301856139cf565b61424b610100830184613e26565b9a9950505050505050505050565b600080604083850312156142705761426f613934565b5b600061427e85828601613ba9565b925050602083013567ffffffffffffffff81111561429f5761429e613939565b5b6142ab85828601613b11565b9150509250929050565b600080604083850312156142cc576142cb613934565b5b60006142da85828601613c33565b92505060206142eb85828601613c33565b9150509250929050565b60008060006060848603121561430e5761430d613934565b5b600061431c86828701613ba9565b935050602061432d86828701613bd5565b925050604061433e86828701613c33565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061437e602083613d5a565b915061438982614348565b602082019050919050565b600060208201905081810360008301526143ad81614371565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143ee82613b88565b91506143f983613b88565b92508282101561440c5761440b6143b4565b5b828203905092915050565b6000610100820190508181036000830152614432818b613d9e565b90508181036020830152614446818a613d9e565b90506144556040830189613f0a565b6144626060830188613f0a565b61446f6080830187613f0a565b61447c60a08301866139cf565b61448960c08301856139cf565b61449660e0830184613e26565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144ea57607f821691505b6020821081036144fd576144fc6144a3565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061455f602d83613d5a565b915061456a82614503565b604082019050919050565b6000602082019050818103600083015261458e81614552565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006145f1602283613d5a565b91506145fc82614595565b604082019050919050565b60006020820190508181036000830152614620816145e4565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614683603983613d5a565b915061468e82614627565b604082019050919050565b600060208201905081810360008301526146b281614676565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614744602283613d5a565b915061474f826146e8565b604082019050919050565b6000602082019050818103600083015261477381614737565b9050919050565b600061478582613b88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b7576147b66143b4565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061481e602e83613d5a565b9150614829826147c2565b604082019050919050565b6000602082019050818103600083015261484d81614811565b9050919050565b600081905092915050565b50565b600061486f600083614854565b915061487a8261485f565b600082019050919050565b600061489082614862565b9150819050919050565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b60006148d0600d83613d5a565b91506148db8261489a565b602082019050919050565b600060208201905081810360008301526148ff816148c3565b9050919050565b600060608201905061491b6000830186613e26565b6149286020830185613e26565b6149356040830184613f0a565b949350505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614999602383613d5a565b91506149a48261493d565b604082019050919050565b600060208201905081810360008301526149c88161498c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a05601f83613d5a565b9150614a10826149cf565b602082019050919050565b60006020820190508181036000830152614a34816149f8565b9050919050565b7f466c6f77657220646f6573206e6f742065786973740000000000000000000000600082015250565b6000614a71601583613d5a565b9150614a7c82614a3b565b602082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b6000614ab282613b88565b9150614abd83613b88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af257614af16143b4565b5b828201905092915050565b7f45786365656473206d617820737570706c79206f6620666c6f7765722074797060008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b59602183613d5a565b9150614b6482614afd565b604082019050919050565b60006020820190508181036000830152614b8881614b4c565b9050919050565b7f466c6f776572206973206e6f7420696e20736561736f6e000000000000000000600082015250565b6000614bc5601783613d5a565b9150614bd082614b8f565b602082019050919050565b60006020820190508181036000830152614bf481614bb8565b9050919050565b6000614c0682613b88565b9150614c1183613b88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4a57614c496143b4565b5b828202905092915050565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b6000614c8b601c83613d5a565b9150614c9682614c55565b602082019050919050565b60006020820190508181036000830152614cba81614c7e565b9050919050565b7f45786365656473206d6178696d756d20706572207472616e73616374696f6e00600082015250565b6000614cf7601f83613d5a565b9150614d0282614cc1565b602082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b600081519050614d3c81613b92565b92915050565b600060208284031215614d5857614d57613934565b5b6000614d6684828501614d2d565b91505092915050565b7f53656e646572206d75737420686f6c6420612050686f746f73796e746865736960008201527f73204e4654000000000000000000000000000000000000000000000000000000602082015250565b6000614dcb602583613d5a565b9150614dd682614d6f565b604082019050919050565b60006020820190508181036000830152614dfa81614dbe565b9050919050565b7f53656e646572206d75737420686f6c642061207370656369666963204e46542060008201527f746f206d696e74207468697320666c6f77657200000000000000000000000000602082015250565b6000614e5d603383613d5a565b9150614e6882614e01565b604082019050919050565b60006020820190508181036000830152614e8c81614e50565b9050919050565b6000608082019050614ea86000830187613e26565b614eb56020830186613e26565b614ec26040830185613f0a565b614ecf6060830184613f0a565b95945050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f34602b83613d5a565b9150614f3f82614ed8565b604082019050919050565b60006020820190508181036000830152614f6381614f27565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614fa0601a83613d5a565b9150614fab82614f6a565b602082019050919050565b60006020820190508181036000830152614fcf81614f93565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000615032603383613d5a565b915061503d82614fd6565b604082019050919050565b6000602082019050818103600083015261506181615025565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006150c4602f83613d5a565b91506150cf82615068565b604082019050919050565b600060208201905081810360008301526150f3816150b7565b9050919050565b600081905092915050565b600061511082613d4f565b61511a81856150fa565b935061512a818560208601613d6b565b80840191505092915050565b60006151428285615105565b915061514e8284615105565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151b6602683613d5a565b91506151c18261515a565b604082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615248603283613d5a565b9150615253826151ec565b604082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006152da602683613d5a565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061533782615310565b915061534283615310565b925082821015615355576153546143b4565b5b828203905092915050565b600061536b82615310565b915061537683615310565b9250826fffffffffffffffffffffffffffffffff0382111561539b5761539a6143b4565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615402602a83613d5a565b915061540d826153a6565b604082019050919050565b60006020820190508181036000830152615431816153f5565b9050919050565b600061544382613b88565b915060008203615456576154556143b4565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006154bd602f83613d5a565b91506154c882615461565b604082019050919050565b600060208201905081810360008301526154ec816154b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061551a826154f3565b61552481856154fe565b9350615534818560208601613d6b565b61553d81613a03565b840191505092915050565b600060808201905061555d6000830187613e26565b61556a6020830186613e26565b6155776040830185613f0a565b8181036060830152615589818461550f565b905095945050505050565b6000815190506155a38161396a565b92915050565b6000602082840312156155bf576155be613934565b5b60006155cd84828501615594565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061561082613b88565b915061561b83613b88565b92508261562b5761562a6155d6565b5b828204905092915050565b600061564182613b88565b915061564c83613b88565b92508261565c5761565b6155d6565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156c3602183613d5a565b91506156ce82615667565b604082019050919050565b600060208201905081810360008301526156f2816156b6565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061572f601d83613d5a565b915061573a826156f9565b602082019050919050565b6000602082019050818103600083015261575e81615722565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006157c1602283613d5a565b91506157cc82615765565b604082019050919050565b600060208201905081810360008301526157f0816157b4565b905091905056fea2646970667358221220a6e0d15a2ef86a5e71cdd1c51b4615ef7bce0c3b340a2217966379e3758a22a264736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000366e3b64ef9060eb4b2b0908d7cd165c26312a23000000000000000000000000000000000000000000000000000000000000000d466c6f7765722053686f707065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007464c575253485000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Flower Shoppe
Arg [1] : symbol (string): FLWRSHP
Arg [2] : maxSupply (uint256): 115792089237316195423570985008687907853269984665640564039457584007913129639935
Arg [3] : _maxPerTx (uint256): 1
Arg [4] : PS (address): 0x366E3B64Ef9060EB4B2B0908d7cD165C26312A23
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000366e3b64ef9060eb4b2b0908d7cd165c26312a23
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 466c6f7765722053686f70706500000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 464c575253485000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
149:4393:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:358:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3964:82:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2781:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4052:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:92:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7024:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;215:29:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:92:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7842:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3731:122:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3100:721:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4336:203:6;;;;;;;;;;;;;:::i;:::-;;8036:151:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2615:160:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2642:174:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3859:99:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1475:1134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5374:116:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:13;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5692:96:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3466:132:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3604:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8245:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;839:32:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;5846:377:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3337:123:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7610:178:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3192:139:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;282:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4151:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3880:358:4;4002:4;4044:25;4029:40;;;:11;:40;;;;:98;;;;4094:33;4079:48;;;:11;:48;;;;4029:98;:158;;;;4152:35;4137:50;;;:11;:50;;;;4029:158;:204;;;;4197:36;4221:11;4197:23;:36::i;:::-;4029:204;4016:217;;3880:358;;;:::o;3964:82:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4035:4:6::1;4029:3;:10;;;;;;;;;;;;:::i;:::-;;3964:82:::0;:::o;2781:405::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2958:11:6::1;2975:87;;;;;;;;2987:5;2975:87;;;;2994:3;2975:87;;;;2999:1;2975:87;;;;3002:9;2975:87;;;;3013:6;2975:87;;;;3021:4;2975:87;;;;;;3027:7;2975:87;;;;;;3036:6;2975:87;;;;;;3044:17;2975:87;;;;::::0;2958:105:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3078:101;3088:5;3095:3;3121:1;3100:11;:18;;;;:22;;;;:::i;:::-;3124:9;3135:6;3143:7;3152:6;3161:17;3078:101;;;;;;;;;;;;;:::i;:::-;;;;;;;;2781:405:::0;;;;;;;:::o;4052:93::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4134:3:6::1;4109:14;;:29;;;;;;;;;;;;;;;;;;4052:93:::0;:::o;5544:92:4:-;5598:13;5626:5;5619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:92;:::o;7024:200::-;7092:7;7115:16;7123:7;7115;:16::i;:::-;7107:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7195:15;:24;7211:7;7195:24;;;;;;;;;;;;;;;;;;;;;7188:31;;7024:200;;;:::o;6602:369::-;6670:13;6686:24;6702:7;6686:15;:24::i;:::-;6670:40;;6730:5;6724:11;;:2;:11;;;6716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6812:5;6796:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;6821:37;6838:5;6845:12;:10;:12::i;:::-;6821:16;:37::i;:::-;6796:62;6781:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;6938:28;6947:2;6951:7;6960:5;6938:8;:28::i;:::-;6664:307;6602:369;;:::o;215:29:6:-;;;;;;;;;;;;;:::o;2486:92:4:-;2539:7;2561:12;;2554:19;;2486:92;:::o;7842:136::-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;:::-;7842:136;;;:::o;3731:122:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3839:7:6::1;3811:11;3823:5;3811:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;:35;;;;;;;;;;;;;;;;;;3731:122:::0;;:::o;3100:721:4:-;3205:7;3238:16;3248:5;3238:9;:16::i;:::-;3230:5;:24;3222:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3299:22;3324:13;:11;:13::i;:::-;3299:38;;3343:19;3372:25;3421:9;3416:339;3440:14;3436:1;:18;3416:339;;;3469:31;3503:11;:14;3515:1;3503:14;;;;;;;;;;;3469:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3555:1;3529:28;;:9;:14;;;:28;;;3525:87;;3589:9;:14;;;3569:34;;3525:87;3644:5;3623:26;;:17;:26;;;3619:130;;3680:5;3665:11;:20;3661:57;;3706:1;3699:8;;;;;;;;;3661:57;3727:13;;;;;:::i;:::-;;;;3619:130;3461:294;3456:3;;;;;:::i;:::-;;;;3416:339;;;;3760:56;;;;;;;;;;:::i;:::-;;;;;;;;3100:721;;;;;:::o;4336:203:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4385:15:6::1;4403:21;4385:39;;4435:12;4452;:10;:12::i;:::-;:17;;4477:7;4452:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4434:55;;;4507:7;4499:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;4375:164;;4336:203::o:0;8036:151:4:-;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;:::-;8036:151;;;:::o;2615:160:6:-;2665:47;2678:12;:10;:12::i;:::-;2700:1;2704:7;2665:12;:47::i;:::-;2727:41;2734:12;:10;:12::i;:::-;2756:1;2760:7;2727:41;;;;;;;;:::i;:::-;;;;;;;;2615:160;:::o;2642:174:4:-;2709:7;2740:13;:11;:13::i;:::-;2732:5;:21;2724:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2806:5;2799:12;;2642:174;;;:::o;3859:99:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3942:9:6::1;3931:8;:20;;;;3859:99:::0;:::o;1475:1134::-;1680:1:14;2259:7;;:19;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;1604:11:6::1;:18;;;;1591:10;:31;1583:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1708:11;1720:10;1708:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;1698:6;1666:11;1678:10;1666:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:38;;;;:::i;:::-;:75;;1658:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;1797:11;1809:10;1797:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;;;;;;;;;;;1789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1920:6;1888:11;1900:10;1888:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:38;;;;:::i;:::-;1875:9;:51;1867:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;1987:8;;1977:6;:18;;1969:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2045:11;2057:10;2045:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;2042:152;;;2140:1;2099:14;;;;;;;;;;;:24;;;2124:12;:10;:12::i;:::-;2099:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;2091:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;2042:152;2207:11;2219:10;2207:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;;;;;;;;;;2204:244;;;2251:10;2288:11;2300:10;2288:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:40;;;;;;;;;;;;2275:54;;2380:1;2351:2;:12;;;2364;:10;:12::i;:::-;2351:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;2343:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:211;2204:244;2491:6;2458:11;2470:10;2458:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:39;;;;;;;:::i;:::-;;;;;;;;2508:28;2518:9;2529:6;2508:9;:28::i;:::-;2551:51;2558:12;:10;:12::i;:::-;2572:9;2583:6;2591:10;2551:51;;;;;;;;;:::i;:::-;;;;;;;;1637:1:14::0;2562:7;:22;;;;1475:1134:6;;;:::o;5374:116:4:-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;;5453:32;;5374:116;;;:::o;4289:208::-;4353:7;4393:1;4376:19;;:5;:19;;;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4464:12;:19;4477:5;4464:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4456:36;;4449:43;;4289:208;;;:::o;1661:101:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5692:96:4:-;5748:13;5776:7;5769:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:96;:::o;7283:269::-;7385:12;:10;:12::i;:::-;7373:24;;:8;:24;;;7365:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7480:8;7435:18;:32;7454:12;:10;:12::i;:::-;7435:32;;;;;;;;;;;;;;;:42;7468:8;7435:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7528:8;7499:48;;7514:12;:10;:12::i;:::-;7499:48;;;7538:8;7499:48;;;;;;:::i;:::-;;;;;;;;7283:269;;:::o;3466:132:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3582:9:6::1;3551:11;3563:5;3551:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;:40;;;;3466:132:::0;;:::o;3604:121::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3712:6:6::1;3685:11;3697:5;3685:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;:33;;;;3604:121:::0;;:::o;8245:300:4:-;8376:28;8386:4;8392:2;8396:7;8376:9;:28::i;:::-;8425:48;8448:4;8454:2;8458:7;8467:5;8425:22;:48::i;:::-;8410:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;8245:300;;;;:::o;839:32:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5846:377:4:-;5939:13;5977:16;5985:7;5977;:16::i;:::-;5962:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6063:21;6087:10;:8;:10::i;:::-;6063:34;;6140:1;6122:7;6116:21;:25;:102;;;;;;;;;;;;;;;;;6176:7;6185:18;:7;:16;:18::i;:::-;6159:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6116:102;6103:115;;;5846:377;;;:::o;12517:43::-;;;;:::o;3337:123:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3447:6:6::1;3422:11;3434:5;3422:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:22;;:31;;;;;;;;;;;;:::i;:::-;;3337:123:::0;;:::o;7610:178:4:-;7727:4;7748:18;:25;7767:5;7748:25;;;;;;;;;;;;;;;:35;7774:8;7748:35;;;;;;;;;;;;;;;;;;;;;;;;;7741:42;;7610:178;;;;:::o;1911:198:13:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;3192:139:6:-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3315:9:6::1;3279:11;3291;3279:24;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;:45;;;;;;;;;;;;;;;;;;3192:139:::0;;:::o;282:23::-;;;;:::o;4151:179::-;1252:12:13;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4266:6:6::1;4239:11;4251:5;4239:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;:33;;;;;;;;;;;;;;;;;;4320:3;4282:11;4294:5;4282:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;:41;;;;;;;;;;;;;;;;;;4151:179:::0;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;588:96:1:-;641:7;667:10;660:17;;588:96;:::o;8775:103:4:-;8832:4;8861:12;;8851:7;:22;8844:29;;8775:103;;;:::o;12348:165::-;12467:2;12440:15;:24;12456:7;12440:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12500:7;12496:2;12480:28;;12489:5;12480:28;;;;;;;;;;;;12348:165;;;:::o;10763:1486::-;10855:35;10893:20;10905:7;10893:11;:20::i;:::-;10855:58;;10920:22;10962:13;:18;;;10946:34;;:12;:10;:12::i;:::-;:34;;;:80;;;;11014:12;:10;:12::i;:::-;10990:36;;:20;11002:7;10990:11;:20::i;:::-;:36;;;10946:80;:140;;;;11036:50;11053:13;:18;;;11073:12;:10;:12::i;:::-;11036:16;:50::i;:::-;10946:140;10920:167;;11109:17;11094:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11236:4;11214:26;;:13;:18;;;:26;;;11199:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:43;11397:4;11403:2;11407:7;11416:1;11375:21;:43::i;:::-;11472:49;11489:1;11493:7;11502:13;:18;;;11472:8;:49::i;:::-;11558:1;11528:12;:18;11541:4;11528:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11593:1;11565:12;:16;11578:2;11565:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11623:43;;;;;;;;11638:2;11623:43;;;;;;11649:15;11623:43;;;;;11600:11;:20;11612:7;11600:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11890:19;11922:1;11912:7;:11;;;;:::i;:::-;11890:33;;11974:1;11933:43;;:11;:24;11945:11;11933:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;11929:229;;11990:20;11998:11;11990:7;:20::i;:::-;11986:166;;;12049:94;;;;;;;;12075:13;:18;;;12049:94;;;;;;12105:13;:28;;;12049:94;;;;;12022:11;:24;12034:11;12022:24;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11986:166;11929:229;12188:7;12184:2;12169:27;;12178:4;12169:27;;;;;;;;;;;;12202:42;12223:4;12229:2;12233:7;12242:1;12202:20;:42::i;:::-;10849:1400;;;10763:1486;;;:::o;8882:96::-;8946:27;8956:2;8960:8;8946:27;;;;;;;;;;;;:9;:27::i;:::-;8882:96;;:::o;4739:586::-;4812:21;;:::i;:::-;4851:16;4859:7;4851;:16::i;:::-;4843:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4921:26;4968:12;4957:7;:23;4953:91;;5036:1;5021:12;5011:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4990:47;;4953:91;5055:12;5070:7;5055:22;;5050:207;5087:18;5079:4;:26;5050:207;;5123:31;5157:11;:17;5169:4;5157:17;;;;;;;;;;;5123:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5212:1;5186:28;;:9;:14;;;:28;;;5182:69;;5233:9;5226:16;;;;;;;5182:69;5115:142;5107:6;;;;;:::i;:::-;;;;5050:207;;;;5263:57;;;;;;;;;;:::i;:::-;;;;;;;;4739:586;;;;:::o;2263:187:13:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14018:667:4:-;14150:4;14166:15;:2;:13;;;:15::i;:::-;14162:519;;;14219:2;14203:36;;;14240:12;:10;:12::i;:::-;14254:4;14260:7;14269:5;14203:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14191:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14447:1;14430:6;:13;:18;14426:209;;14462:61;;;;;;;;;;:::i;:::-;;;;;;;;14426:209;14605:6;14599:13;14590:6;14586:2;14582:15;14575:38;14191:452;14333:45;;;14323:55;;;:6;:55;;;;14316:62;;;;;14162:519;14670:4;14663:11;;14018:667;;;;;;;:::o;6466:87::-;6517:13;6545:3;6538:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6466:87;:::o;275:703:15:-;331:13;557:1;548:5;:10;544:51;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;15133:136:4:-;;;;;:::o;15641:135::-;;;;;:::o;9304:1239::-;9404:20;9427:12;;9404:35;;9467:1;9453:16;;:2;:16;;;9445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9642:21;9650:12;9642:7;:21::i;:::-;9641:22;9633:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9723:12;9711:8;:24;;9703:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9781:61;9811:1;9815:2;9819:12;9833:8;9781:21;:61::i;:::-;9849:30;9882:12;:16;9895:2;9882:16;;;;;;;;;;;;;;;9849:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:116;;;;;;;;9972:8;9942:11;:19;;;:39;;;;:::i;:::-;9923:116;;;;;;10024:8;9989:11;:24;;;:44;;;;:::i;:::-;9923:116;;;;;9904:12;:16;9917:2;9904:16;;;;;;;;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10073:43;;;;;;;;10088:2;10073:43;;;;;;10099:15;10073:43;;;;;10045:11;:25;10057:12;10045:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10123:20;10146:12;10123:35;;10170:9;10165:274;10189:8;10185:1;:12;10165:274;;;10242:12;10238:2;10217:38;;10234:1;10217:38;;;;;;;;;;;;10280:59;10311:1;10315:2;10319:12;10333:5;10280:22;:59::i;:::-;10263:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;10418:14;;;;;:::i;:::-;;;;10199:3;;;;;:::i;:::-;;;;10165:274;;;;10460:12;10445;:27;;;;10478:60;10507:1;10511:2;10515:12;10529:8;10478:20;:60::i;:::-;9398:1145;;;9304:1239;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:77::-;4284:7;4313:5;4302:16;;4247:77;;;:::o;4330:122::-;4403:24;4421:5;4403:24;:::i;:::-;4396:5;4393:35;4383:63;;4442:1;4439;4432:12;4383:63;4330:122;:::o;4458:139::-;4504:5;4542:6;4529:20;4520:29;;4558:33;4585:5;4558:33;:::i;:::-;4458:139;;;;:::o;4603:116::-;4673:21;4688:5;4673:21;:::i;:::-;4666:5;4663:32;4653:60;;4709:1;4706;4699:12;4653:60;4603:116;:::o;4725:133::-;4768:5;4806:6;4793:20;4784:29;;4822:30;4846:5;4822:30;:::i;:::-;4725:133;;;;:::o;4864:126::-;4901:7;4941:42;4934:5;4930:54;4919:65;;4864:126;;;:::o;4996:96::-;5033:7;5062:24;5080:5;5062:24;:::i;:::-;5051:35;;4996:96;;;:::o;5098:122::-;5171:24;5189:5;5171:24;:::i;:::-;5164:5;5161:35;5151:63;;5210:1;5207;5200:12;5151:63;5098:122;:::o;5226:139::-;5272:5;5310:6;5297:20;5288:29;;5326:33;5353:5;5326:33;:::i;:::-;5226:139;;;;:::o;5371:1551::-;5498:6;5506;5514;5522;5530;5538;5546;5595:3;5583:9;5574:7;5570:23;5566:33;5563:120;;;5602:79;;:::i;:::-;5563:120;5750:1;5739:9;5735:17;5722:31;5780:18;5772:6;5769:30;5766:117;;;5802:79;;:::i;:::-;5766:117;5907:63;5962:7;5953:6;5942:9;5938:22;5907:63;:::i;:::-;5897:73;;5693:287;6047:2;6036:9;6032:18;6019:32;6078:18;6070:6;6067:30;6064:117;;;6100:79;;:::i;:::-;6064:117;6205:63;6260:7;6251:6;6240:9;6236:22;6205:63;:::i;:::-;6195:73;;5990:288;6317:2;6343:53;6388:7;6379:6;6368:9;6364:22;6343:53;:::i;:::-;6333:63;;6288:118;6445:2;6471:53;6516:7;6507:6;6496:9;6492:22;6471:53;:::i;:::-;6461:63;;6416:118;6573:3;6600:50;6642:7;6633:6;6622:9;6618:22;6600:50;:::i;:::-;6590:60;;6544:116;6699:3;6726:50;6768:7;6759:6;6748:9;6744:22;6726:50;:::i;:::-;6716:60;;6670:116;6825:3;6852:53;6897:7;6888:6;6877:9;6873:22;6852:53;:::i;:::-;6842:63;;6796:119;5371:1551;;;;;;;;;;:::o;6928:329::-;6987:6;7036:2;7024:9;7015:7;7011:23;7007:32;7004:119;;;7042:79;;:::i;:::-;7004:119;7162:1;7187:53;7232:7;7223:6;7212:9;7208:22;7187:53;:::i;:::-;7177:63;;7133:117;6928:329;;;;:::o;7263:99::-;7315:6;7349:5;7343:12;7333:22;;7263:99;;;:::o;7368:169::-;7452:11;7486:6;7481:3;7474:19;7526:4;7521:3;7517:14;7502:29;;7368:169;;;;:::o;7543:307::-;7611:1;7621:113;7635:6;7632:1;7629:13;7621:113;;;7720:1;7715:3;7711:11;7705:18;7701:1;7696:3;7692:11;7685:39;7657:2;7654:1;7650:10;7645:15;;7621:113;;;7752:6;7749:1;7746:13;7743:101;;;7832:1;7823:6;7818:3;7814:16;7807:27;7743:101;7592:258;7543:307;;;:::o;7856:364::-;7944:3;7972:39;8005:5;7972:39;:::i;:::-;8027:71;8091:6;8086:3;8027:71;:::i;:::-;8020:78;;8107:52;8152:6;8147:3;8140:4;8133:5;8129:16;8107:52;:::i;:::-;8184:29;8206:6;8184:29;:::i;:::-;8179:3;8175:39;8168:46;;7948:272;7856:364;;;;:::o;8226:313::-;8339:4;8377:2;8366:9;8362:18;8354:26;;8426:9;8420:4;8416:20;8412:1;8401:9;8397:17;8390:47;8454:78;8527:4;8518:6;8454:78;:::i;:::-;8446:86;;8226:313;;;;:::o;8545:329::-;8604:6;8653:2;8641:9;8632:7;8628:23;8624:32;8621:119;;;8659:79;;:::i;:::-;8621:119;8779:1;8804:53;8849:7;8840:6;8829:9;8825:22;8804:53;:::i;:::-;8794:63;;8750:117;8545:329;;;;:::o;8880:118::-;8967:24;8985:5;8967:24;:::i;:::-;8962:3;8955:37;8880:118;;:::o;9004:222::-;9097:4;9135:2;9124:9;9120:18;9112:26;;9148:71;9216:1;9205:9;9201:17;9192:6;9148:71;:::i;:::-;9004:222;;;;:::o;9232:474::-;9300:6;9308;9357:2;9345:9;9336:7;9332:23;9328:32;9325:119;;;9363:79;;:::i;:::-;9325:119;9483:1;9508:53;9553:7;9544:6;9533:9;9529:22;9508:53;:::i;:::-;9498:63;;9454:117;9610:2;9636:53;9681:7;9672:6;9661:9;9657:22;9636:53;:::i;:::-;9626:63;;9581:118;9232:474;;;;;:::o;9712:60::-;9740:3;9761:5;9754:12;;9712:60;;;:::o;9778:142::-;9828:9;9861:53;9879:34;9888:24;9906:5;9888:24;:::i;:::-;9879:34;:::i;:::-;9861:53;:::i;:::-;9848:66;;9778:142;;;:::o;9926:126::-;9976:9;10009:37;10040:5;10009:37;:::i;:::-;9996:50;;9926:126;;;:::o;10058:142::-;10124:9;10157:37;10188:5;10157:37;:::i;:::-;10144:50;;10058:142;;;:::o;10206:163::-;10309:53;10356:5;10309:53;:::i;:::-;10304:3;10297:66;10206:163;;:::o;10375:254::-;10484:4;10522:2;10511:9;10507:18;10499:26;;10535:87;10619:1;10608:9;10604:17;10595:6;10535:87;:::i;:::-;10375:254;;;;:::o;10635:118::-;10722:24;10740:5;10722:24;:::i;:::-;10717:3;10710:37;10635:118;;:::o;10759:222::-;10852:4;10890:2;10879:9;10875:18;10867:26;;10903:71;10971:1;10960:9;10956:17;10947:6;10903:71;:::i;:::-;10759:222;;;;:::o;10987:619::-;11064:6;11072;11080;11129:2;11117:9;11108:7;11104:23;11100:32;11097:119;;;11135:79;;:::i;:::-;11097:119;11255:1;11280:53;11325:7;11316:6;11305:9;11301:22;11280:53;:::i;:::-;11270:63;;11226:117;11382:2;11408:53;11453:7;11444:6;11433:9;11429:22;11408:53;:::i;:::-;11398:63;;11353:118;11510:2;11536:53;11581:7;11572:6;11561:9;11557:22;11536:53;:::i;:::-;11526:63;;11481:118;10987:619;;;;;:::o;11612:468::-;11677:6;11685;11734:2;11722:9;11713:7;11709:23;11705:32;11702:119;;;11740:79;;:::i;:::-;11702:119;11860:1;11885:53;11930:7;11921:6;11910:9;11906:22;11885:53;:::i;:::-;11875:63;;11831:117;11987:2;12013:50;12055:7;12046:6;12035:9;12031:22;12013:50;:::i;:::-;12003:60;;11958:115;11612:468;;;;;:::o;12086:619::-;12163:6;12171;12179;12228:2;12216:9;12207:7;12203:23;12199:32;12196:119;;;12234:79;;:::i;:::-;12196:119;12354:1;12379:53;12424:7;12415:6;12404:9;12400:22;12379:53;:::i;:::-;12369:63;;12325:117;12481:2;12507:53;12552:7;12543:6;12532:9;12528:22;12507:53;:::i;:::-;12497:63;;12452:118;12609:2;12635:53;12680:7;12671:6;12660:9;12656:22;12635:53;:::i;:::-;12625:63;;12580:118;12086:619;;;;;:::o;12711:468::-;12776:6;12784;12833:2;12821:9;12812:7;12808:23;12804:32;12801:119;;;12839:79;;:::i;:::-;12801:119;12959:1;12984:53;13029:7;13020:6;13009:9;13005:22;12984:53;:::i;:::-;12974:63;;12930:117;13086:2;13112:50;13154:7;13145:6;13134:9;13130:22;13112:50;:::i;:::-;13102:60;;13057:115;12711:468;;;;;:::o;13185:474::-;13253:6;13261;13310:2;13298:9;13289:7;13285:23;13281:32;13278:119;;;13316:79;;:::i;:::-;13278:119;13436:1;13461:53;13506:7;13497:6;13486:9;13482:22;13461:53;:::i;:::-;13451:63;;13407:117;13563:2;13589:53;13634:7;13625:6;13614:9;13610:22;13589:53;:::i;:::-;13579:63;;13534:118;13185:474;;;;;:::o;13665:307::-;13726:4;13816:18;13808:6;13805:30;13802:56;;;13838:18;;:::i;:::-;13802:56;13876:29;13898:6;13876:29;:::i;:::-;13868:37;;13960:4;13954;13950:15;13942:23;;13665:307;;;:::o;13978:410::-;14055:5;14080:65;14096:48;14137:6;14096:48;:::i;:::-;14080:65;:::i;:::-;14071:74;;14168:6;14161:5;14154:21;14206:4;14199:5;14195:16;14244:3;14235:6;14230:3;14226:16;14223:25;14220:112;;;14251:79;;:::i;:::-;14220:112;14341:41;14375:6;14370:3;14365;14341:41;:::i;:::-;14061:327;13978:410;;;;;:::o;14407:338::-;14462:5;14511:3;14504:4;14496:6;14492:17;14488:27;14478:122;;14519:79;;:::i;:::-;14478:122;14636:6;14623:20;14661:78;14735:3;14727:6;14720:4;14712:6;14708:17;14661:78;:::i;:::-;14652:87;;14468:277;14407:338;;;;:::o;14751:943::-;14846:6;14854;14862;14870;14919:3;14907:9;14898:7;14894:23;14890:33;14887:120;;;14926:79;;:::i;:::-;14887:120;15046:1;15071:53;15116:7;15107:6;15096:9;15092:22;15071:53;:::i;:::-;15061:63;;15017:117;15173:2;15199:53;15244:7;15235:6;15224:9;15220:22;15199:53;:::i;:::-;15189:63;;15144:118;15301:2;15327:53;15372:7;15363:6;15352:9;15348:22;15327:53;:::i;:::-;15317:63;;15272:118;15457:2;15446:9;15442:18;15429:32;15488:18;15480:6;15477:30;15474:117;;;15510:79;;:::i;:::-;15474:117;15615:62;15669:7;15660:6;15649:9;15645:22;15615:62;:::i;:::-;15605:72;;15400:287;14751:943;;;;;;;:::o;15700:1254::-;16039:4;16077:3;16066:9;16062:19;16054:27;;16127:9;16121:4;16117:20;16113:1;16102:9;16098:17;16091:47;16155:78;16228:4;16219:6;16155:78;:::i;:::-;16147:86;;16280:9;16274:4;16270:20;16265:2;16254:9;16250:18;16243:48;16308:78;16381:4;16372:6;16308:78;:::i;:::-;16300:86;;16396:72;16464:2;16453:9;16449:18;16440:6;16396:72;:::i;:::-;16478;16546:2;16535:9;16531:18;16522:6;16478:72;:::i;:::-;16560:73;16628:3;16617:9;16613:19;16604:6;16560:73;:::i;:::-;16643:67;16705:3;16694:9;16690:19;16681:6;16643:67;:::i;:::-;16720;16782:3;16771:9;16767:19;16758:6;16720:67;:::i;:::-;16797;16859:3;16848:9;16844:19;16835:6;16797:67;:::i;:::-;16874:73;16942:3;16931:9;16927:19;16918:6;16874:73;:::i;:::-;15700:1254;;;;;;;;;;;;:::o;16960:654::-;17038:6;17046;17095:2;17083:9;17074:7;17070:23;17066:32;17063:119;;;17101:79;;:::i;:::-;17063:119;17221:1;17246:53;17291:7;17282:6;17271:9;17267:22;17246:53;:::i;:::-;17236:63;;17192:117;17376:2;17365:9;17361:18;17348:32;17407:18;17399:6;17396:30;17393:117;;;17429:79;;:::i;:::-;17393:117;17534:63;17589:7;17580:6;17569:9;17565:22;17534:63;:::i;:::-;17524:73;;17319:288;16960:654;;;;;:::o;17620:474::-;17688:6;17696;17745:2;17733:9;17724:7;17720:23;17716:32;17713:119;;;17751:79;;:::i;:::-;17713:119;17871:1;17896:53;17941:7;17932:6;17921:9;17917:22;17896:53;:::i;:::-;17886:63;;17842:117;17998:2;18024:53;18069:7;18060:6;18049:9;18045:22;18024:53;:::i;:::-;18014:63;;17969:118;17620:474;;;;;:::o;18100:613::-;18174:6;18182;18190;18239:2;18227:9;18218:7;18214:23;18210:32;18207:119;;;18245:79;;:::i;:::-;18207:119;18365:1;18390:53;18435:7;18426:6;18415:9;18411:22;18390:53;:::i;:::-;18380:63;;18336:117;18492:2;18518:50;18560:7;18551:6;18540:9;18536:22;18518:50;:::i;:::-;18508:60;;18463:115;18617:2;18643:53;18688:7;18679:6;18668:9;18664:22;18643:53;:::i;:::-;18633:63;;18588:118;18100:613;;;;;:::o;18719:182::-;18859:34;18855:1;18847:6;18843:14;18836:58;18719:182;:::o;18907:366::-;19049:3;19070:67;19134:2;19129:3;19070:67;:::i;:::-;19063:74;;19146:93;19235:3;19146:93;:::i;:::-;19264:2;19259:3;19255:12;19248:19;;18907:366;;;:::o;19279:419::-;19445:4;19483:2;19472:9;19468:18;19460:26;;19532:9;19526:4;19522:20;19518:1;19507:9;19503:17;19496:47;19560:131;19686:4;19560:131;:::i;:::-;19552:139;;19279:419;;;:::o;19704:180::-;19752:77;19749:1;19742:88;19849:4;19846:1;19839:15;19873:4;19870:1;19863:15;19890:191;19930:4;19950:20;19968:1;19950:20;:::i;:::-;19945:25;;19984:20;20002:1;19984:20;:::i;:::-;19979:25;;20023:1;20020;20017:8;20014:34;;;20028:18;;:::i;:::-;20014:34;20073:1;20070;20066:9;20058:17;;19890:191;;;;:::o;20087:1155::-;20404:4;20442:3;20431:9;20427:19;20419:27;;20492:9;20486:4;20482:20;20478:1;20467:9;20463:17;20456:47;20520:78;20593:4;20584:6;20520:78;:::i;:::-;20512:86;;20645:9;20639:4;20635:20;20630:2;20619:9;20615:18;20608:48;20673:78;20746:4;20737:6;20673:78;:::i;:::-;20665:86;;20761:72;20829:2;20818:9;20814:18;20805:6;20761:72;:::i;:::-;20843;20911:2;20900:9;20896:18;20887:6;20843:72;:::i;:::-;20925:73;20993:3;20982:9;20978:19;20969:6;20925:73;:::i;:::-;21008:67;21070:3;21059:9;21055:19;21046:6;21008:67;:::i;:::-;21085;21147:3;21136:9;21132:19;21123:6;21085:67;:::i;:::-;21162:73;21230:3;21219:9;21215:19;21206:6;21162:73;:::i;:::-;20087:1155;;;;;;;;;;;:::o;21248:180::-;21296:77;21293:1;21286:88;21393:4;21390:1;21383:15;21417:4;21414:1;21407:15;21434:320;21478:6;21515:1;21509:4;21505:12;21495:22;;21562:1;21556:4;21552:12;21583:18;21573:81;;21639:4;21631:6;21627:17;21617:27;;21573:81;21701:2;21693:6;21690:14;21670:18;21667:38;21664:84;;21720:18;;:::i;:::-;21664:84;21485:269;21434:320;;;:::o;21760:232::-;21900:34;21896:1;21888:6;21884:14;21877:58;21969:15;21964:2;21956:6;21952:15;21945:40;21760:232;:::o;21998:366::-;22140:3;22161:67;22225:2;22220:3;22161:67;:::i;:::-;22154:74;;22237:93;22326:3;22237:93;:::i;:::-;22355:2;22350:3;22346:12;22339:19;;21998:366;;;:::o;22370:419::-;22536:4;22574:2;22563:9;22559:18;22551:26;;22623:9;22617:4;22613:20;22609:1;22598:9;22594:17;22587:47;22651:131;22777:4;22651:131;:::i;:::-;22643:139;;22370:419;;;:::o;22795:221::-;22935:34;22931:1;22923:6;22919:14;22912:58;23004:4;22999:2;22991:6;22987:15;22980:29;22795:221;:::o;23022:366::-;23164:3;23185:67;23249:2;23244:3;23185:67;:::i;:::-;23178:74;;23261:93;23350:3;23261:93;:::i;:::-;23379:2;23374:3;23370:12;23363:19;;23022:366;;;:::o;23394:419::-;23560:4;23598:2;23587:9;23583:18;23575:26;;23647:9;23641:4;23637:20;23633:1;23622:9;23618:17;23611:47;23675:131;23801:4;23675:131;:::i;:::-;23667:139;;23394:419;;;:::o;23819:244::-;23959:34;23955:1;23947:6;23943:14;23936:58;24028:27;24023:2;24015:6;24011:15;24004:52;23819:244;:::o;24069:366::-;24211:3;24232:67;24296:2;24291:3;24232:67;:::i;:::-;24225:74;;24308:93;24397:3;24308:93;:::i;:::-;24426:2;24421:3;24417:12;24410:19;;24069:366;;;:::o;24441:419::-;24607:4;24645:2;24634:9;24630:18;24622:26;;24694:9;24688:4;24684:20;24680:1;24669:9;24665:17;24658:47;24722:131;24848:4;24722:131;:::i;:::-;24714:139;;24441:419;;;:::o;24866:180::-;24914:77;24911:1;24904:88;25011:4;25008:1;25001:15;25035:4;25032:1;25025:15;25052:221;25192:34;25188:1;25180:6;25176:14;25169:58;25261:4;25256:2;25248:6;25244:15;25237:29;25052:221;:::o;25279:366::-;25421:3;25442:67;25506:2;25501:3;25442:67;:::i;:::-;25435:74;;25518:93;25607:3;25518:93;:::i;:::-;25636:2;25631:3;25627:12;25620:19;;25279:366;;;:::o;25651:419::-;25817:4;25855:2;25844:9;25840:18;25832:26;;25904:9;25898:4;25894:20;25890:1;25879:9;25875:17;25868:47;25932:131;26058:4;25932:131;:::i;:::-;25924:139;;25651:419;;;:::o;26076:233::-;26115:3;26138:24;26156:5;26138:24;:::i;:::-;26129:33;;26184:66;26177:5;26174:77;26171:103;;26254:18;;:::i;:::-;26171:103;26301:1;26294:5;26290:13;26283:20;;26076:233;;;:::o;26315:::-;26455:34;26451:1;26443:6;26439:14;26432:58;26524:16;26519:2;26511:6;26507:15;26500:41;26315:233;:::o;26554:366::-;26696:3;26717:67;26781:2;26776:3;26717:67;:::i;:::-;26710:74;;26793:93;26882:3;26793:93;:::i;:::-;26911:2;26906:3;26902:12;26895:19;;26554:366;;;:::o;26926:419::-;27092:4;27130:2;27119:9;27115:18;27107:26;;27179:9;27173:4;27169:20;27165:1;27154:9;27150:17;27143:47;27207:131;27333:4;27207:131;:::i;:::-;27199:139;;26926:419;;;:::o;27351:147::-;27452:11;27489:3;27474:18;;27351:147;;;;:::o;27504:114::-;;:::o;27624:398::-;27783:3;27804:83;27885:1;27880:3;27804:83;:::i;:::-;27797:90;;27896:93;27985:3;27896:93;:::i;:::-;28014:1;28009:3;28005:11;27998:18;;27624:398;;;:::o;28028:379::-;28212:3;28234:147;28377:3;28234:147;:::i;:::-;28227:154;;28398:3;28391:10;;28028:379;;;:::o;28413:163::-;28553:15;28549:1;28541:6;28537:14;28530:39;28413:163;:::o;28582:366::-;28724:3;28745:67;28809:2;28804:3;28745:67;:::i;:::-;28738:74;;28821:93;28910:3;28821:93;:::i;:::-;28939:2;28934:3;28930:12;28923:19;;28582:366;;;:::o;28954:419::-;29120:4;29158:2;29147:9;29143:18;29135:26;;29207:9;29201:4;29197:20;29193:1;29182:9;29178:17;29171:47;29235:131;29361:4;29235:131;:::i;:::-;29227:139;;28954:419;;;:::o;29379:442::-;29528:4;29566:2;29555:9;29551:18;29543:26;;29579:71;29647:1;29636:9;29632:17;29623:6;29579:71;:::i;:::-;29660:72;29728:2;29717:9;29713:18;29704:6;29660:72;:::i;:::-;29742;29810:2;29799:9;29795:18;29786:6;29742:72;:::i;:::-;29379:442;;;;;;:::o;29827:222::-;29967:34;29963:1;29955:6;29951:14;29944:58;30036:5;30031:2;30023:6;30019:15;30012:30;29827:222;:::o;30055:366::-;30197:3;30218:67;30282:2;30277:3;30218:67;:::i;:::-;30211:74;;30294:93;30383:3;30294:93;:::i;:::-;30412:2;30407:3;30403:12;30396:19;;30055:366;;;:::o;30427:419::-;30593:4;30631:2;30620:9;30616:18;30608:26;;30680:9;30674:4;30670:20;30666:1;30655:9;30651:17;30644:47;30708:131;30834:4;30708:131;:::i;:::-;30700:139;;30427:419;;;:::o;30852:181::-;30992:33;30988:1;30980:6;30976:14;30969:57;30852:181;:::o;31039:366::-;31181:3;31202:67;31266:2;31261:3;31202:67;:::i;:::-;31195:74;;31278:93;31367:3;31278:93;:::i;:::-;31396:2;31391:3;31387:12;31380:19;;31039:366;;;:::o;31411:419::-;31577:4;31615:2;31604:9;31600:18;31592:26;;31664:9;31658:4;31654:20;31650:1;31639:9;31635:17;31628:47;31692:131;31818:4;31692:131;:::i;:::-;31684:139;;31411:419;;;:::o;31836:171::-;31976:23;31972:1;31964:6;31960:14;31953:47;31836:171;:::o;32013:366::-;32155:3;32176:67;32240:2;32235:3;32176:67;:::i;:::-;32169:74;;32252:93;32341:3;32252:93;:::i;:::-;32370:2;32365:3;32361:12;32354:19;;32013:366;;;:::o;32385:419::-;32551:4;32589:2;32578:9;32574:18;32566:26;;32638:9;32632:4;32628:20;32624:1;32613:9;32609:17;32602:47;32666:131;32792:4;32666:131;:::i;:::-;32658:139;;32385:419;;;:::o;32810:305::-;32850:3;32869:20;32887:1;32869:20;:::i;:::-;32864:25;;32903:20;32921:1;32903:20;:::i;:::-;32898:25;;33057:1;32989:66;32985:74;32982:1;32979:81;32976:107;;;33063:18;;:::i;:::-;32976:107;33107:1;33104;33100:9;33093:16;;32810:305;;;;:::o;33121:220::-;33261:34;33257:1;33249:6;33245:14;33238:58;33330:3;33325:2;33317:6;33313:15;33306:28;33121:220;:::o;33347:366::-;33489:3;33510:67;33574:2;33569:3;33510:67;:::i;:::-;33503:74;;33586:93;33675:3;33586:93;:::i;:::-;33704:2;33699:3;33695:12;33688:19;;33347:366;;;:::o;33719:419::-;33885:4;33923:2;33912:9;33908:18;33900:26;;33972:9;33966:4;33962:20;33958:1;33947:9;33943:17;33936:47;34000:131;34126:4;34000:131;:::i;:::-;33992:139;;33719:419;;;:::o;34144:173::-;34284:25;34280:1;34272:6;34268:14;34261:49;34144:173;:::o;34323:366::-;34465:3;34486:67;34550:2;34545:3;34486:67;:::i;:::-;34479:74;;34562:93;34651:3;34562:93;:::i;:::-;34680:2;34675:3;34671:12;34664:19;;34323:366;;;:::o;34695:419::-;34861:4;34899:2;34888:9;34884:18;34876:26;;34948:9;34942:4;34938:20;34934:1;34923:9;34919:17;34912:47;34976:131;35102:4;34976:131;:::i;:::-;34968:139;;34695:419;;;:::o;35120:348::-;35160:7;35183:20;35201:1;35183:20;:::i;:::-;35178:25;;35217:20;35235:1;35217:20;:::i;:::-;35212:25;;35405:1;35337:66;35333:74;35330:1;35327:81;35322:1;35315:9;35308:17;35304:105;35301:131;;;35412:18;;:::i;:::-;35301:131;35460:1;35457;35453:9;35442:20;;35120:348;;;;:::o;35474:178::-;35614:30;35610:1;35602:6;35598:14;35591:54;35474:178;:::o;35658:366::-;35800:3;35821:67;35885:2;35880:3;35821:67;:::i;:::-;35814:74;;35897:93;35986:3;35897:93;:::i;:::-;36015:2;36010:3;36006:12;35999:19;;35658:366;;;:::o;36030:419::-;36196:4;36234:2;36223:9;36219:18;36211:26;;36283:9;36277:4;36273:20;36269:1;36258:9;36254:17;36247:47;36311:131;36437:4;36311:131;:::i;:::-;36303:139;;36030:419;;;:::o;36455:181::-;36595:33;36591:1;36583:6;36579:14;36572:57;36455:181;:::o;36642:366::-;36784:3;36805:67;36869:2;36864:3;36805:67;:::i;:::-;36798:74;;36881:93;36970:3;36881:93;:::i;:::-;36999:2;36994:3;36990:12;36983:19;;36642:366;;;:::o;37014:419::-;37180:4;37218:2;37207:9;37203:18;37195:26;;37267:9;37261:4;37257:20;37253:1;37242:9;37238:17;37231:47;37295:131;37421:4;37295:131;:::i;:::-;37287:139;;37014:419;;;:::o;37439:143::-;37496:5;37527:6;37521:13;37512:22;;37543:33;37570:5;37543:33;:::i;:::-;37439:143;;;;:::o;37588:351::-;37658:6;37707:2;37695:9;37686:7;37682:23;37678:32;37675:119;;;37713:79;;:::i;:::-;37675:119;37833:1;37858:64;37914:7;37905:6;37894:9;37890:22;37858:64;:::i;:::-;37848:74;;37804:128;37588:351;;;;:::o;37945:224::-;38085:34;38081:1;38073:6;38069:14;38062:58;38154:7;38149:2;38141:6;38137:15;38130:32;37945:224;:::o;38175:366::-;38317:3;38338:67;38402:2;38397:3;38338:67;:::i;:::-;38331:74;;38414:93;38503:3;38414:93;:::i;:::-;38532:2;38527:3;38523:12;38516:19;;38175:366;;;:::o;38547:419::-;38713:4;38751:2;38740:9;38736:18;38728:26;;38800:9;38794:4;38790:20;38786:1;38775:9;38771:17;38764:47;38828:131;38954:4;38828:131;:::i;:::-;38820:139;;38547:419;;;:::o;38972:238::-;39112:34;39108:1;39100:6;39096:14;39089:58;39181:21;39176:2;39168:6;39164:15;39157:46;38972:238;:::o;39216:366::-;39358:3;39379:67;39443:2;39438:3;39379:67;:::i;:::-;39372:74;;39455:93;39544:3;39455:93;:::i;:::-;39573:2;39568:3;39564:12;39557:19;;39216:366;;;:::o;39588:419::-;39754:4;39792:2;39781:9;39777:18;39769:26;;39841:9;39835:4;39831:20;39827:1;39816:9;39812:17;39805:47;39869:131;39995:4;39869:131;:::i;:::-;39861:139;;39588:419;;;:::o;40013:553::-;40190:4;40228:3;40217:9;40213:19;40205:27;;40242:71;40310:1;40299:9;40295:17;40286:6;40242:71;:::i;:::-;40323:72;40391:2;40380:9;40376:18;40367:6;40323:72;:::i;:::-;40405;40473:2;40462:9;40458:18;40449:6;40405:72;:::i;:::-;40487;40555:2;40544:9;40540:18;40531:6;40487:72;:::i;:::-;40013:553;;;;;;;:::o;40572:230::-;40712:34;40708:1;40700:6;40696:14;40689:58;40781:13;40776:2;40768:6;40764:15;40757:38;40572:230;:::o;40808:366::-;40950:3;40971:67;41035:2;41030:3;40971:67;:::i;:::-;40964:74;;41047:93;41136:3;41047:93;:::i;:::-;41165:2;41160:3;41156:12;41149:19;;40808:366;;;:::o;41180:419::-;41346:4;41384:2;41373:9;41369:18;41361:26;;41433:9;41427:4;41423:20;41419:1;41408:9;41404:17;41397:47;41461:131;41587:4;41461:131;:::i;:::-;41453:139;;41180:419;;;:::o;41605:176::-;41745:28;41741:1;41733:6;41729:14;41722:52;41605:176;:::o;41787:366::-;41929:3;41950:67;42014:2;42009:3;41950:67;:::i;:::-;41943:74;;42026:93;42115:3;42026:93;:::i;:::-;42144:2;42139:3;42135:12;42128:19;;41787:366;;;:::o;42159:419::-;42325:4;42363:2;42352:9;42348:18;42340:26;;42412:9;42406:4;42402:20;42398:1;42387:9;42383:17;42376:47;42440:131;42566:4;42440:131;:::i;:::-;42432:139;;42159:419;;;:::o;42584:238::-;42724:34;42720:1;42712:6;42708:14;42701:58;42793:21;42788:2;42780:6;42776:15;42769:46;42584:238;:::o;42828:366::-;42970:3;42991:67;43055:2;43050:3;42991:67;:::i;:::-;42984:74;;43067:93;43156:3;43067:93;:::i;:::-;43185:2;43180:3;43176:12;43169:19;;42828:366;;;:::o;43200:419::-;43366:4;43404:2;43393:9;43389:18;43381:26;;43453:9;43447:4;43443:20;43439:1;43428:9;43424:17;43417:47;43481:131;43607:4;43481:131;:::i;:::-;43473:139;;43200:419;;;:::o;43625:234::-;43765:34;43761:1;43753:6;43749:14;43742:58;43834:17;43829:2;43821:6;43817:15;43810:42;43625:234;:::o;43865:366::-;44007:3;44028:67;44092:2;44087:3;44028:67;:::i;:::-;44021:74;;44104:93;44193:3;44104:93;:::i;:::-;44222:2;44217:3;44213:12;44206:19;;43865:366;;;:::o;44237:419::-;44403:4;44441:2;44430:9;44426:18;44418:26;;44490:9;44484:4;44480:20;44476:1;44465:9;44461:17;44454:47;44518:131;44644:4;44518:131;:::i;:::-;44510:139;;44237:419;;;:::o;44662:148::-;44764:11;44801:3;44786:18;;44662:148;;;;:::o;44816:377::-;44922:3;44950:39;44983:5;44950:39;:::i;:::-;45005:89;45087:6;45082:3;45005:89;:::i;:::-;44998:96;;45103:52;45148:6;45143:3;45136:4;45129:5;45125:16;45103:52;:::i;:::-;45180:6;45175:3;45171:16;45164:23;;44926:267;44816:377;;;;:::o;45199:435::-;45379:3;45401:95;45492:3;45483:6;45401:95;:::i;:::-;45394:102;;45513:95;45604:3;45595:6;45513:95;:::i;:::-;45506:102;;45625:3;45618:10;;45199:435;;;;;:::o;45640:225::-;45780:34;45776:1;45768:6;45764:14;45757:58;45849:8;45844:2;45836:6;45832:15;45825:33;45640:225;:::o;45871:366::-;46013:3;46034:67;46098:2;46093:3;46034:67;:::i;:::-;46027:74;;46110:93;46199:3;46110:93;:::i;:::-;46228:2;46223:3;46219:12;46212:19;;45871:366;;;:::o;46243:419::-;46409:4;46447:2;46436:9;46432:18;46424:26;;46496:9;46490:4;46486:20;46482:1;46471:9;46467:17;46460:47;46524:131;46650:4;46524:131;:::i;:::-;46516:139;;46243:419;;;:::o;46668:237::-;46808:34;46804:1;46796:6;46792:14;46785:58;46877:20;46872:2;46864:6;46860:15;46853:45;46668:237;:::o;46911:366::-;47053:3;47074:67;47138:2;47133:3;47074:67;:::i;:::-;47067:74;;47150:93;47239:3;47150:93;:::i;:::-;47268:2;47263:3;47259:12;47252:19;;46911:366;;;:::o;47283:419::-;47449:4;47487:2;47476:9;47472:18;47464:26;;47536:9;47530:4;47526:20;47522:1;47511:9;47507:17;47500:47;47564:131;47690:4;47564:131;:::i;:::-;47556:139;;47283:419;;;:::o;47708:225::-;47848:34;47844:1;47836:6;47832:14;47825:58;47917:8;47912:2;47904:6;47900:15;47893:33;47708:225;:::o;47939:366::-;48081:3;48102:67;48166:2;48161:3;48102:67;:::i;:::-;48095:74;;48178:93;48267:3;48178:93;:::i;:::-;48296:2;48291:3;48287:12;48280:19;;47939:366;;;:::o;48311:419::-;48477:4;48515:2;48504:9;48500:18;48492:26;;48564:9;48558:4;48554:20;48550:1;48539:9;48535:17;48528:47;48592:131;48718:4;48592:131;:::i;:::-;48584:139;;48311:419;;;:::o;48736:118::-;48773:7;48813:34;48806:5;48802:46;48791:57;;48736:118;;;:::o;48860:191::-;48900:4;48920:20;48938:1;48920:20;:::i;:::-;48915:25;;48954:20;48972:1;48954:20;:::i;:::-;48949:25;;48993:1;48990;48987:8;48984:34;;;48998:18;;:::i;:::-;48984:34;49043:1;49040;49036:9;49028:17;;48860:191;;;;:::o;49057:273::-;49097:3;49116:20;49134:1;49116:20;:::i;:::-;49111:25;;49150:20;49168:1;49150:20;:::i;:::-;49145:25;;49272:1;49236:34;49232:42;49229:1;49226:49;49223:75;;;49278:18;;:::i;:::-;49223:75;49322:1;49319;49315:9;49308:16;;49057:273;;;;:::o;49336:229::-;49476:34;49472:1;49464:6;49460:14;49453:58;49545:12;49540:2;49532:6;49528:15;49521:37;49336:229;:::o;49571:366::-;49713:3;49734:67;49798:2;49793:3;49734:67;:::i;:::-;49727:74;;49810:93;49899:3;49810:93;:::i;:::-;49928:2;49923:3;49919:12;49912:19;;49571:366;;;:::o;49943:419::-;50109:4;50147:2;50136:9;50132:18;50124:26;;50196:9;50190:4;50186:20;50182:1;50171:9;50167:17;50160:47;50224:131;50350:4;50224:131;:::i;:::-;50216:139;;49943:419;;;:::o;50368:171::-;50407:3;50430:24;50448:5;50430:24;:::i;:::-;50421:33;;50476:4;50469:5;50466:15;50463:41;;50484:18;;:::i;:::-;50463:41;50531:1;50524:5;50520:13;50513:20;;50368:171;;;:::o;50545:234::-;50685:34;50681:1;50673:6;50669:14;50662:58;50754:17;50749:2;50741:6;50737:15;50730:42;50545:234;:::o;50785:366::-;50927:3;50948:67;51012:2;51007:3;50948:67;:::i;:::-;50941:74;;51024:93;51113:3;51024:93;:::i;:::-;51142:2;51137:3;51133:12;51126:19;;50785:366;;;:::o;51157:419::-;51323:4;51361:2;51350:9;51346:18;51338:26;;51410:9;51404:4;51400:20;51396:1;51385:9;51381:17;51374:47;51438:131;51564:4;51438:131;:::i;:::-;51430:139;;51157:419;;;:::o;51582:98::-;51633:6;51667:5;51661:12;51651:22;;51582:98;;;:::o;51686:168::-;51769:11;51803:6;51798:3;51791:19;51843:4;51838:3;51834:14;51819:29;;51686:168;;;;:::o;51860:360::-;51946:3;51974:38;52006:5;51974:38;:::i;:::-;52028:70;52091:6;52086:3;52028:70;:::i;:::-;52021:77;;52107:52;52152:6;52147:3;52140:4;52133:5;52129:16;52107:52;:::i;:::-;52184:29;52206:6;52184:29;:::i;:::-;52179:3;52175:39;52168:46;;51950:270;51860:360;;;;:::o;52226:640::-;52421:4;52459:3;52448:9;52444:19;52436:27;;52473:71;52541:1;52530:9;52526:17;52517:6;52473:71;:::i;:::-;52554:72;52622:2;52611:9;52607:18;52598:6;52554:72;:::i;:::-;52636;52704:2;52693:9;52689:18;52680:6;52636:72;:::i;:::-;52755:9;52749:4;52745:20;52740:2;52729:9;52725:18;52718:48;52783:76;52854:4;52845:6;52783:76;:::i;:::-;52775:84;;52226:640;;;;;;;:::o;52872:141::-;52928:5;52959:6;52953:13;52944:22;;52975:32;53001:5;52975:32;:::i;:::-;52872:141;;;;:::o;53019:349::-;53088:6;53137:2;53125:9;53116:7;53112:23;53108:32;53105:119;;;53143:79;;:::i;:::-;53105:119;53263:1;53288:63;53343:7;53334:6;53323:9;53319:22;53288:63;:::i;:::-;53278:73;;53234:127;53019:349;;;;:::o;53374:180::-;53422:77;53419:1;53412:88;53519:4;53516:1;53509:15;53543:4;53540:1;53533:15;53560:185;53600:1;53617:20;53635:1;53617:20;:::i;:::-;53612:25;;53651:20;53669:1;53651:20;:::i;:::-;53646:25;;53690:1;53680:35;;53695:18;;:::i;:::-;53680:35;53737:1;53734;53730:9;53725:14;;53560:185;;;;:::o;53751:176::-;53783:1;53800:20;53818:1;53800:20;:::i;:::-;53795:25;;53834:20;53852:1;53834:20;:::i;:::-;53829:25;;53873:1;53863:35;;53878:18;;:::i;:::-;53863:35;53919:1;53916;53912:9;53907:14;;53751:176;;;;:::o;53933:220::-;54073:34;54069:1;54061:6;54057:14;54050:58;54142:3;54137:2;54129:6;54125:15;54118:28;53933:220;:::o;54159:366::-;54301:3;54322:67;54386:2;54381:3;54322:67;:::i;:::-;54315:74;;54398:93;54487:3;54398:93;:::i;:::-;54516:2;54511:3;54507:12;54500:19;;54159:366;;;:::o;54531:419::-;54697:4;54735:2;54724:9;54720:18;54712:26;;54784:9;54778:4;54774:20;54770:1;54759:9;54755:17;54748:47;54812:131;54938:4;54812:131;:::i;:::-;54804:139;;54531:419;;;:::o;54956:179::-;55096:31;55092:1;55084:6;55080:14;55073:55;54956:179;:::o;55141:366::-;55283:3;55304:67;55368:2;55363:3;55304:67;:::i;:::-;55297:74;;55380:93;55469:3;55380:93;:::i;:::-;55498:2;55493:3;55489:12;55482:19;;55141:366;;;:::o;55513:419::-;55679:4;55717:2;55706:9;55702:18;55694:26;;55766:9;55760:4;55756:20;55752:1;55741:9;55737:17;55730:47;55794:131;55920:4;55794:131;:::i;:::-;55786:139;;55513:419;;;:::o;55938:221::-;56078:34;56074:1;56066:6;56062:14;56055:58;56147:4;56142:2;56134:6;56130:15;56123:29;55938:221;:::o;56165:366::-;56307:3;56328:67;56392:2;56387:3;56328:67;:::i;:::-;56321:74;;56404:93;56493:3;56404:93;:::i;:::-;56522:2;56517:3;56513:12;56506:19;;56165:366;;;:::o;56537:419::-;56703:4;56741:2;56730:9;56726:18;56718:26;;56790:9;56784:4;56780:20;56776:1;56765:9;56761:17;56754:47;56818:131;56944:4;56818:131;:::i;:::-;56810:139;;56537:419;;;:::o
Swarm Source
ipfs://a6e0d15a2ef86a5e71cdd1c51b4615ef7bce0c3b340a2217966379e3758a22a2
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.