ERC-721
Overview
Max Total Supply
283 AILOSET
Holders
213
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AILOSETLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Contract
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-11 */ // File: IWhitelist.sol // Creator: OZ pragma solidity ^0.8.4; interface IWhitelist { function check(address addr) external view returns(bool); } // File: Errors.sol // Creator: OZ using Chiru Labs pragma solidity ^0.8.4; error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error AssetCannotBeTransfered(); error AssetLocked(); error AssetNotLocked(); error BalanceQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error CallerNotOwnerNorApproved(); error Err(); error LackOfMoney(); error LockCallerNotOwnerNorApproved(); error MintShouldBeOpened(); error MintToZeroAddress(); error MintZeroQuantity(); error MintedQueryForZeroAddress(); error OutOfMintBoundaries(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error RootAddressError(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error WhitelistedOnly(); // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // 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. */ 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 Merklee 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) } } } // File: Strings.sol pragma solidity ^0.8.4; /** * Libraries * Used https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol for Strings */ library Strings{ bytes16 private constant _HEXSYMBOLS = "0123456789abcdef"; function toString(address account) public pure returns(string memory) { return toString(abi.encodePacked(account)); } function toString(bytes32 value) public pure returns(string memory) { return toString(abi.encodePacked(value)); } function toString(bytes memory data) public pure returns(string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(2 + data.length * 2); str[0] = "0"; str[1] = "x"; for (uint i = 0; i < data.length; i++) { str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))]; str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))]; } return string(str); } 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 (0 == value) { return "0"; } uint256 temp = value; uint256 digits; while (0 != temp) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (0 != value) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function toHexString(uint256 value) internal pure returns(string memory) { if (0 == value) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (0 != temp) { length++; temp >>= 8; } return toHexString(value,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] = _HEXSYMBOLS[value & 0xf]; value >>= 4; } require(value == 0); return string(buffer); } function concat(string memory self, string memory other) internal pure returns(string memory) { return string( abi.encodePacked( self, other )); } } // File: TokenStorage.sol // Creator: OZ pragma solidity ^0.8.4; contract TokenStorage { enum MintStatus { NONE, PRESALE, SALE } // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; uint64 numberMintedOnPresale; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } struct ContractData { // Token name string name; // Token description string description; // Token symbol string symbol; // Base URL for tokens metadata string baseURL; // Contract-level metadata URL string contractURL; // Whitelist Merkle tree root bytes32 wl; // Is it set or asset? bool isEnvelope; // Revealed? bool isRevealed; // Mint status managed by bool mintStatusAuto; // Status MintStatus mintStatus; } struct EnvelopeTypes { address envelope; address[] types; } struct MintSettings { uint8 mintOnPresale; uint8 maxMintPerUser; uint8 minMintPerUser; uint64 maxTokenSupply; uint256 priceOnPresale; uint256 priceOnSale; uint256 envelopeConcatPrice; uint256 envelopeSplitPrice; // MintStatus timing uint256 mintStatusPreale; uint256 mintStatusSale; uint256 mintStatusFinished; } // Contract root address address internal _root; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Contract data ContractData internal _contractData; // Envelope data EnvelopeTypes internal _envelopeTypes; // Mint settings MintSettings internal _mintSettings; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping owner address to address data mapping(address => AddressData) internal _addressData; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; // Envelope container mapping(uint256 => mapping(address => uint256)) internal _assetsEnvelope; mapping(address => mapping(uint256 => bool)) internal _assetsEnveloped; } // File: IEnvelope.sol // Creator: OZ pragma solidity ^0.8.4; interface IEnvelope { function locked(address _asset,uint256 _assetId) external view returns(bool); function ownerOfAsset(uint256 _assetId) external view returns(address); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) 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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: Ownership.sol // Creator: OZ using Chiru Labs pragma solidity ^0.8.4; contract Ownership is Context, TokenStorage { /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } uint256[] private __tokens__; function tokensOf(address _owner) external returns(uint256[] memory tokens) { unchecked { for(uint i=0;i<_currentIndex;i++) { TokenOwnership memory ownership = ownershipOf(i); if(ownership.addr == _owner) { if (!ownership.burned) { if(_contractData.isEnvelope) { __tokens__.push(i); } else { if(!IEnvelope(_envelopeTypes.envelope).locked(address(this),i)) { __tokens__.push(i); } } } } } return __tokens__; } } } // File: AccessControl.sol // Creator: OZ pragma solidity ^0.8.4; contract AccessControl is Ownership { function ActiveMint() internal view { if(MintStatus.NONE == _contractData.mintStatus) revert MintShouldBeOpened(); } function ApprovedOnly(address owner) internal view { if (!_operatorApprovals[owner][_msgSender()]) revert CallerNotOwnerNorApproved(); } function BotProtection() internal view { if(tx.origin != msg.sender) revert Err(); } function OwnerOnly(address owner,uint256 tokenId) internal view { if (owner != ownershipOf(tokenId).addr) revert CallerNotOwnerNorApproved(); } function RootOnly() internal view { address sender = _msgSender(); if( sender != _root && sender != _envelopeTypes.envelope ) revert RootAddressError(); } function Whitelisted(bytes32[] calldata _merkleProof) internal view { address sender = _msgSender(); bool flag = _root == sender || _contractData.mintStatus == MintStatus.SALE ; /** * Set merkle tree root */ if(!flag) flag = MerkleProof.verify(_merkleProof, _contractData.wl, keccak256(abi.encodePacked(sender))); /**/ if(!flag) revert WhitelistedOnly(); } function setWLRoot(bytes32 _root) external { RootOnly(); _contractData.wl = _root; } } // File: Array.sol // Creator: OZ pragma solidity ^0.8.4; contract Array{ function remove(uint256[] memory arr, uint256 e) internal pure { unchecked { uint idx = 0; for(uint i = 0; i < arr.length; i++) { if(arr[i] == e) { idx = i; } } for (uint i = idx; i < arr.length-1; i++){ arr[i] = arr[i+1]; } delete arr[arr.length - 1]; } } } // File: Math.sol pragma solidity ^0.8.4; library Math{ function max(uint256 a,uint256 b) internal pure returns(uint256) { return a >= b ? a : b; } function min(uint256 a,uint256 b) internal pure returns(uint256) { return a < b ? a : b; } function average(uint256 a,uint256 b) internal pure returns(uint256) { return (a & b) + (a ^ b) / 2; } function ceilDiv(uint256 a,uint256 b) internal pure returns(uint256) { return a / b + (a % b == 0 ? 0 : 1); } function mul(uint256 a,uint256 b) internal pure returns(uint256 c) { if (0 == a) { return 0; } c = a * b; assert(c / a == b); return c; } function div(uint256 a,uint256 b) internal pure returns(uint256) { assert(0 != b); return a / b; } function sub(uint256 a,uint256 b) internal pure returns(uint256) { assert(b <= a); return a - b; } function add(uint256 a,uint256 b) internal pure returns(uint256 c) { c = a + b; assert(c >= a); return c; } } // File: Payment.sol // Creator: OZ pragma solidity ^0.8.4; contract Payment is TokenStorage { function lackOfMoney(uint _quantity) internal returns(bool) { return msg.value < Math.mul(_contractData.mintStatus == MintStatus.PRESALE ? _mintSettings.priceOnPresale : _mintSettings.priceOnSale ,_quantity); } function lackOfMoneyForConcat() internal returns(bool) { return _mintSettings.envelopeConcatPrice != 0 && _mintSettings.envelopeConcatPrice > msg.value ; } function lackOfMoneyForSplit() internal returns(bool) { return _mintSettings.envelopeSplitPrice != 0 && _mintSettings.envelopeSplitPrice > msg.value ; } } // File: Quantity.sol // Creator: OZ pragma solidity ^0.8.4; contract Quantity is TokenStorage { function quantityIsGood(uint256 _quantity,uint256 _minted,uint256 _mintedOnPresale) internal view returns(bool) { return ( _contractData.mintStatus == MintStatus.PRESALE && _mintSettings.mintOnPresale >= _quantity + _minted ) || ( _contractData.mintStatus == MintStatus.SALE && _mintSettings.maxMintPerUser >= _quantity + _minted - _mintedOnPresale && _mintSettings.minMintPerUser <= _quantity ) ; } function supplyIsGood() internal view returns(bool) { return _contractData.isEnvelope || ( _contractData.isEnvelope == false && _mintSettings.maxTokenSupply > _currentIndex ) ; } } // File: ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; //import "hardhat/console.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, AccessControl, Quantity { using Address for address; using Strings for uint256; constructor( string memory name_, string memory description_, string memory symbol_, string memory baseURL_, string memory contractURL_ ) { _contractData.name = name_; _contractData.description = description_; _contractData.symbol = symbol_; _contractData.baseURL = baseURL_; _contractData.contractURL = contractURL_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view returns(uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @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 override returns(uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * returnsthe number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns(uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); else return uint256(_addressData[owner].numberMinted); } function _numberMintedOnPresale(address owner) internal view returns(uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); else return uint256(_addressData[owner].numberMintedOnPresale); } /** * returnsthe number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns(uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); else return uint256(_addressData[owner].numberBurned); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns(address) { if(!_contractData.isEnvelope) { if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId)) { return address(0); } } return ownershipOf(tokenId).addr; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert CallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns(address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); else return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 virtual override { if(!_contractData.isEnvelope) if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId)) revert AssetLocked(); _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 { if(!_contractData.isEnvelope) if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId)) revert AssetLocked(); _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } /** * @dev returnswhether `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 && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if(!supplyIsGood()) revert OutOfMintBoundaries(); if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); if(_contractData.mintStatus == MintStatus.PRESALE) _addressData[to].numberMintedOnPresale = _addressData[to].numberMintedOnPresale + uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer(); updatedIndex++; } _currentIndex = updatedIndex; } } /** * Transfer set and all its assets */ function _transferEnvelope(address _to,uint256 _assetId) internal { unchecked { for (uint i = 0; i < _envelopeTypes.types.length; i++) { (bool success,bytes memory res) = _envelopeTypes.types[i].call( abi.encodeWithSignature("unlock(uint256,address)", _assetsEnvelope[_assetId][_envelopeTypes.types[i]], _to) ); if(!success) revert AssetCannotBeTransfered(); } } } /** * @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 ) internal { TokenOwnership memory prevOwnership = ownershipOf(tokenId); address sender = _msgSender(); bool isApprovedOrOwner = ( sender == _envelopeTypes.envelope || sender == prevOwnership.addr || sender == getApproved(tokenId) || isApprovedForAll(prevOwnership.addr, sender) ); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); /* if( sender == prevOwnership.addr && _contractData.isEnvelope ) _transferEnvelope(to,tokenId); */ // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, 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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn 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)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns(bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns(bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function getBalance() external view returns(uint256) { if(_root != _msgSender()) revert RootAddressError(); return address(this).balance; } function withdraw(address _to,uint256 _amount) external { if(_root != _msgSender()) revert RootAddressError(); if(address(this).balance < _amount) revert LackOfMoney(); payable(_to).transfer(_amount); } } // File: ERC721AToken.sol // Creator: Chiru Labs & OZ pragma solidity ^0.8.4; /** * @title ERC721A Base Token * @dev ERC721A Token that can be irreversibly burned (destroyed). */ abstract contract ERC721AToken is Context, Ownership, ERC721A { using Strings for uint256; /** * @dev See {IERC721Metadata-name}. */ function name() external view virtual override returns(string memory) { return _contractData.name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external view virtual override returns(string memory) { return _contractData.symbol; } function baseTokenURI() external view returns(string memory) { return _contractData.baseURL; } function contractURI() external view returns(string memory) { return _contractData.contractURL; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view override returns(string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return string( abi.encodePacked( _contractData.baseURL, "/", Strings.toString(tokenId), ".json" )); } function decimals() external pure returns(uint8) { return 0; } /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) internal { if(!_contractData.isEnvelope) if(IEnvelope(_envelopeTypes.envelope).locked(address(this),tokenId)) revert AssetLocked(); TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); _burn(tokenId); } } // File: IAsset.sol // Creator: OZ pragma solidity ^0.8.4; interface IAsset { function checkMint(address _owner,uint256 _quantity) external returns(uint256); function locked(uint256 _assetId) external view returns(bool); function ownerOfAsset(uint256 _assetId) external view returns(address); } // File: ERC721AEnvelope.sol // Creator: OZ pragma solidity ^0.8.4; //import "hardhat/console.sol"; abstract contract ERC721AEnvelope is Array, Context, ERC721AToken { using Math for uint256; function _mintSetOfAssets(address _owner,uint _quantity) internal { unchecked { for(uint i = 0; i < _envelopeTypes.types.length; i++) { (bool success,bytes memory res) = _envelopeTypes.types[i].call( abi.encodeWithSignature("safeMint(address,uint256)", _owner, _quantity ) ); if(!success) revert Err(); } } } function _envelopeAssets(uint256 _envelopeId) internal view returns(address[] memory,uint256[] memory) { unchecked { uint len = 0; for (uint i = 0; i < _envelopeTypes.types.length; i++) { len++; } address[] memory addrs = new address[](len); uint256[] memory tokens = new uint256[](len); len = 0; for (uint i = 0; i < _envelopeTypes.types.length; i++) { addrs[len] = _envelopeTypes.types[i]; tokens[len++] = _assetsEnvelope[_envelopeId][_envelopeTypes.types[i]]; } return (addrs,tokens); } } function _envelopeSplit(address _owner,uint256 _envelopeId) internal returns(address[] memory,uint256[] memory) { OwnerOnly(_owner,_envelopeId); (address[] memory addrs,uint256[] memory tokens) = _envelopeAssets(_envelopeId); _burn(_envelopeId); _transferEnvelope(_owner,_envelopeId); unchecked { for(uint i = 0; i < addrs.length; i++) { _unlockEnvelopeAsset( _envelopeId, addrs[i], tokens[i] ); } } return (addrs,tokens); } function _unlockEnvelopeAsset(uint256 _envelopeId,address _asset,uint256 _assetId) internal { if(!_locked(_asset,_assetId)) revert AssetNotLocked(); if(_msgSender() != IAsset(_asset).ownerOfAsset(_assetId)) revert CallerNotOwnerNorApproved(); delete _assetsEnveloped[_asset][_assetId]; delete _assetsEnvelope[_envelopeId][_asset]; } function _envelopeCreate(address _owner,address[] calldata _assets,uint256[] calldata _assetIds) internal returns(uint256) { if( _assets.length == 0 && _assets.length != _assetIds.length ) revert Err(); uint256 envelopeId = _currentIndex; _safeMint(_owner,1); unchecked { _assetsEnvelope[envelopeId][_envelopeTypes.envelope] = envelopeId; for(uint i = 0; i < _assets.length; i++) { if(_locked(_assets[i],_assetIds[i])) revert AssetLocked(); if(_owner != IAsset(_assets[i]).ownerOfAsset(_assetIds[i])) revert CallerNotOwnerNorApproved(); _assetsEnvelope[envelopeId][_assets[i]] = _assetIds[i]; _assetsEnveloped[_assets[i]][_assetIds[i]] = true; } } return envelopeId; } function _locked(address _asset,uint256 _assetId) internal view returns(bool) { if (_contractData.isEnvelope) return _assetsEnveloped[_asset][_assetId]; else return IAsset(_envelopeTypes.envelope).locked(_assetId); } } // File: Master.sol // Creator: OZ pragma solidity ^0.8.4; abstract contract Master is ERC721AEnvelope { constructor() { _root = _msgSender(); _contractData.isRevealed = false; _contractData.mintStatus = MintStatus.NONE; _contractData.mintStatusAuto = true; _mintSettings.mintOnPresale = 1; // number of tokens on presale _mintSettings.maxMintPerUser = 2; // max tokens on sale _mintSettings.minMintPerUser = 1; // min tokens on sale _mintSettings.maxTokenSupply = 5000; _mintSettings.priceOnPresale = 37500000000000000; // in wei, may be changed later _mintSettings.priceOnSale = 47500000000000000; // in wei, may be changed later _mintSettings.envelopeConcatPrice = 0; // in wei, may be changed later _mintSettings.envelopeSplitPrice = 0; // in wei, may be changed later _mintSettings.mintStatusPreale = 1649683800; // Monday, April 11, 2022 2:00:00 PM GMT _mintSettings.mintStatusSale = 1649734200; // Tuesday, April 12, 2022 3:30:00 AM _mintSettings.mintStatusFinished = 0; //does not specified } function exists(uint256 tokenId) external view returns(bool) { return _exists(tokenId); } function setRoot(address _owner) external { RootOnly(); _root = _owner; } function getRoot() external view returns(address) { return _root; } function CheckMintStatus() internal { if(!_contractData.mintStatusAuto) return; uint256 mps = _mintSettings.mintStatusPreale; uint256 ms = _mintSettings.mintStatusSale; uint256 mf = _mintSettings.mintStatusFinished; if (mps <= block.timestamp && block.timestamp < ms) { _contractData.mintStatus = MintStatus.PRESALE; } else if (ms <= block.timestamp && (block.timestamp < mf || 0 == mf)) { _contractData.mintStatus = MintStatus.SALE; } else { _contractData.mintStatus = MintStatus.NONE; } } function toggleMintStatus(bool _mode) external { RootOnly(); _contractData.mintStatusAuto = _mode; } function setMintingIsOnPresale() external { RootOnly(); _contractData.mintStatus = MintStatus.PRESALE; } function setMintingIsOnSale() external { RootOnly(); _contractData.mintStatus = MintStatus.SALE; } function stopMinting() external { RootOnly(); _contractData.mintStatus = MintStatus.NONE; } function updateContract( uint256 _pricePresale, uint256 _priceSale, uint8 _minMint, uint8 _maxMint, uint64 _maxSupply ) external { RootOnly(); _mintSettings.priceOnPresale = _pricePresale; _mintSettings.priceOnSale = _priceSale; _mintSettings.maxMintPerUser = _maxMint; _mintSettings.minMintPerUser = _minMint; _mintSettings.maxTokenSupply = _maxSupply; } function setRevealed(string calldata _url) external { RootOnly(); _contractData.isRevealed = true; _contractData.baseURL = _url; } function updateBaseURL(string calldata _url) external { RootOnly(); _contractData.baseURL = _url; } } // File: Contract.sol // Creator: OZ pragma solidity ^0.8.4; contract Contract is Master, Payment, IEnvelope { constructor( string memory name_, string memory description_, string memory symbol_, string memory baseURL_, string memory contractURL_ ) ERC721A( name_, description_, symbol_, baseURL_, contractURL_ ) Master() { _contractData.isEnvelope = true; //_contractData.wl = 0x7355b511eb06aa6d5a11b366b27ed407bc3237cf6e2eafe1799efef4a678756f; _contractData.wl = 0xcdab47e163c1eb6040f36523ce1ddb86b732c6e652e159613a6e0b896d4f8232; } function addAssetType(address _asset) external { RootOnly(); unchecked { _envelopeTypes.types.push(_asset); } } function setEnvelopeConcatPrice(uint256 _price) external { RootOnly(); _mintSettings.envelopeConcatPrice = _price; } function setEnvelopeSplitPrice(uint256 _price) external { RootOnly(); _mintSettings.envelopeSplitPrice = _price; } function addMint(uint _quantity) external payable returns(uint256) { BotProtection(); CheckMintStatus(); ActiveMint(); if(_contractData.mintStatus != MintStatus.SALE) revert WhitelistedOnly(); // if (lackOfMoney(_quantity * _envelopeTypes.types.length)) revert LackOfMoney(); else { _mintSetOfAssets(_msgSender(), _quantity); return _quantity; } } function addMint(uint _quantity,bytes32[] calldata _merkleProof) external payable returns(uint256) { BotProtection(); CheckMintStatus(); ActiveMint(); Whitelisted(_merkleProof); if (lackOfMoney(_quantity * _envelopeTypes.types.length)) revert LackOfMoney(); else { _mintSetOfAssets(_msgSender(), _quantity); return _quantity; } } function addMint(address _owner,uint _quantity) external { RootOnly(); CheckMintStatus(); _mintSetOfAssets(_owner, _quantity); } function envelopeCreate(address[] calldata _assets,uint256[] calldata _assetIds) external payable returns(uint256) { if(lackOfMoneyForConcat()) revert LackOfMoney(); else return _envelopeCreate(_msgSender(),_assets, _assetIds); } function envelopeSplit(uint256 _envelopeId) external payable returns(address[] memory,uint256[] memory) { OwnerOnly(_msgSender(),_envelopeId); if(lackOfMoneyForSplit()) revert LackOfMoney(); else return _envelopeSplit(_msgSender(),_envelopeId); } function getAssetTypes() external view returns(address[] memory) { return _envelopeTypes.types; } function getEnvelopeAssets(uint256 _envelopeId) external view returns(address[] memory,uint256[] memory) { return _envelopeAssets(_envelopeId); } function locked(address _asset,uint256 _assetId) external view override returns(bool) { return _assetsEnveloped[_asset][_assetId]; } function ownerOfAsset(uint256 _assetId) external view override returns(address) { return ownershipOf(_assetId).addr; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"description_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURL_","type":"string"},{"internalType":"string","name":"contractURL_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"AssetCannotBeTransfered","type":"error"},{"inputs":[],"name":"AssetLocked","type":"error"},{"inputs":[],"name":"AssetNotLocked","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"Err","type":"error"},{"inputs":[],"name":"LackOfMoney","type":"error"},{"inputs":[],"name":"MintShouldBeOpened","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OutOfMintBoundaries","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RootAddressError","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WhitelistedOnly","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"addAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"addMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"addMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"addMint","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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assets","type":"address[]"},{"internalType":"uint256[]","name":"_assetIds","type":"uint256[]"}],"name":"envelopeCreate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_envelopeId","type":"uint256"}],"name":"envelopeSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssetTypes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_envelopeId","type":"uint256"}],"name":"getEnvelopeAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_assetId","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetId","type":"uint256"}],"name":"ownerOfAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEnvelopeConcatPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEnvelopeSplitPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintingIsOnPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintingIsOnSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","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":"bool","name":"_mode","type":"bool"}],"name":"toggleMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"nonpayable","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":"string","name":"_url","type":"string"}],"name":"updateBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricePresale","type":"uint256"},{"internalType":"uint256","name":"_priceSale","type":"uint256"},{"internalType":"uint8","name":"_minMint","type":"uint8"},{"internalType":"uint8","name":"_maxMint","type":"uint8"},{"internalType":"uint64","name":"_maxSupply","type":"uint64"}],"name":"updateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200628a3803806200628a83398181016040528101906200003791906200051d565b8484848484846003600001908051906020019062000057929190620002d0565b50836003600101908051906020019062000073929190620002d0565b5082600360020190805190602001906200008f929190620002d0565b5081600380019080519060200190620000aa929190620002d0565b508060036004019080519060200190620000c6929190620002d0565b505050505050620000dc620002c860201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360060160016101000a81548160ff0219169083151502179055506000600360060160036101000a81548160ff0219169083600281111562000165576200016462000640565b5b02179055506001600360060160026101000a81548160ff0219169083151502179055506001600c60000160006101000a81548160ff021916908360ff1602179055506002600c60000160016101000a81548160ff021916908360ff1602179055506001600c60000160026101000a81548160ff021916908360ff160217905550611388600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555066853a0d2313c000600c6001018190555066a8c0ff92d4c000600c600201819055506000600c600301819055506000600c600401819055506362542d58600c60050181905550636254f238600c600601819055506000600c600701819055506001600360060160006101000a81548160ff0219169083151502179055507fcdab47e163c1eb6040f36523ce1ddb86b732c6e652e159613a6e0b896d4f823260001b6003600501819055505050505050620006d3565b600033905090565b828054620002de906200069e565b90600052602060002090601f0160209004810192826200030257600085556200034e565b82601f106200031d57805160ff19168380011785556200034e565b828001600101855582156200034e579182015b828111156200034d57825182559160200191906001019062000330565b5b5090506200035d919062000361565b5090565b5b808211156200037c57600081600090555060010162000362565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003e9826200039e565b810181811067ffffffffffffffff821117156200040b576200040a620003af565b5b80604052505050565b60006200042062000380565b90506200042e8282620003de565b919050565b600067ffffffffffffffff821115620004515762000450620003af565b5b6200045c826200039e565b9050602081019050919050565b60005b83811015620004895780820151818401526020810190506200046c565b8381111562000499576000848401525b50505050565b6000620004b6620004b08462000433565b62000414565b905082815260208101848484011115620004d557620004d462000399565b5b620004e284828562000469565b509392505050565b600082601f83011262000502576200050162000394565b5b8151620005148482602086016200049f565b91505092915050565b600080600080600060a086880312156200053c576200053b6200038a565b5b600086015167ffffffffffffffff8111156200055d576200055c6200038f565b5b6200056b88828901620004ea565b955050602086015167ffffffffffffffff8111156200058f576200058e6200038f565b5b6200059d88828901620004ea565b945050604086015167ffffffffffffffff811115620005c157620005c06200038f565b5b620005cf88828901620004ea565b935050606086015167ffffffffffffffff811115620005f357620005f26200038f565b5b6200060188828901620004ea565b925050608086015167ffffffffffffffff8111156200062557620006246200038f565b5b6200063388828901620004ea565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006b757607f821691505b602082108103620006cd57620006cc6200066f565b5b50919050565b615ba780620006e36000396000f3fe60806040526004361061025b5760003560e01c80637fdf5dc411610144578063b4e99839116100b6578063d547cfb71161007a578063d547cfb7146108fc578063daba6f3a14610927578063e0173a6d14610958578063e8a3d48514610988578063e985e9c5146109b3578063f3fef3a3146109f05761025b565b8063b4e9983914610819578063b88d4fde14610830578063bf7bab7314610859578063c2f1dcc814610896578063c87b56dd146108bf5761025b565b8063911e65fa11610108578063911e65fa1461071857806395d89b41146107485780639ece339814610773578063a084c6ad1461078a578063a22cb465146107c7578063b11c7f82146107f05761025b565b80637fdf5dc414610636578063834fd1241461065f5780638525185114610688578063864aa866146106c6578063870d6f9d146106ef5761025b565b80633e6007e0116101dd5780635ca1e165116101a15780635ca1e165146105145780635ecc8e6b1461053f5780636352211e1461056a57806368d4e4ef146105a757806370a08231146105d0578063794100b91461060d5761025b565b80633e6007e014610418578063403398301461044157806342842e0e146104715780634f558e791461049a5780635a3f2672146104d75761025b565b806312065fe01161022457806312065fe01461035757806318160ddd1461038257806323b872dd146103ad578063313ce567146103d65780633e3e0b12146104015761025b565b80623ba1ed1461026057806301ffc9a71461028957806306fdde03146102c6578063081812fc146102f1578063095ea7b31461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190614901565b610a19565b005b34801561029557600080fd5b506102b060048036038101906102ab9190614986565b610a64565b6040516102bd91906149ce565b60405180910390f35b3480156102d257600080fd5b506102db610b46565b6040516102e89190614a82565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190614ada565b610bdb565b6040516103259190614b16565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190614b31565b610c57565b005b34801561036357600080fd5b5061036c610d61565b6040516103799190614b80565b60405180910390f35b34801561038e57600080fd5b50610397610df5565b6040516103a49190614b80565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614b9b565b610e03565b005b3480156103e257600080fd5b506103eb610f03565b6040516103f89190614c0a565b60405180910390f35b34801561040d57600080fd5b50610416610f08565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614c51565b610f40565b005b61045b60048036038101906104569190614ada565b610f68565b6040516104689190614b80565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190614b9b565b61105d565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190614ada565b61107d565b6040516104ce91906149ce565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190614901565b61108f565b60405161050b9190614d3c565b60405180910390f35b34801561052057600080fd5b5061052961126a565b6040516105369190614b16565b60405180910390f35b34801561054b57600080fd5b50610554611293565b6040516105619190614e1c565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190614ada565b611324565b60405161059e9190614b16565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614901565b611402565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190614901565b611473565b6040516106049190614b80565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614ea3565b611542565b005b34801561064257600080fd5b5061065d60048036038101906106589190614ada565b611580565b005b34801561066b57600080fd5b5061068660048036038101906106819190614ada565b611595565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614ada565b6115aa565b6040516106bd929190614ef0565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190614f93565b6115bf565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614ea3565b61164a565b005b610732600480360381019061072d9190615064565b61166a565b60405161073f9190614b80565b60405180910390f35b34801561075457600080fd5b5061075d6116fc565b60405161076a9190614a82565b60405180910390f35b34801561077f57600080fd5b50610788611791565b005b34801561079657600080fd5b506107b160048036038101906107ac9190614ada565b6117c9565b6040516107be9190614b16565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906150c4565b6117df565b005b3480156107fc57600080fd5b506108176004803603810190610812919061513a565b611956565b005b34801561082557600080fd5b5061082e61196b565b005b34801561083c57600080fd5b5061085760048036038101906108529190615297565b6119a3565b005b34801561086557600080fd5b50610880600480360381019061087b9190614b31565b611ae6565b60405161088d91906149ce565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190614b31565b611b4e565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ada565b611b6c565b6040516108f39190614a82565b60405180910390f35b34801561090857600080fd5b50610911611be1565b60405161091e9190614a82565b60405180910390f35b610941600480360381019061093c9190614ada565b611c75565b60405161094f929190614ef0565b60405180910390f35b610972600480360381019061096d91906153c6565b611ce2565b60405161097f9190614b80565b60405180910390f35b34801561099457600080fd5b5061099d611d41565b6040516109aa9190614a82565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190615447565b611dd6565b6040516109e791906149ce565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614b31565b611e6a565b005b610a21611f7b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3f5750610b3e8261206e565b5b9050919050565b606060036000018054610b58906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b84906154b6565b8015610bd15780601f10610ba657610100808354040283529160200191610bd1565b820191906000526020600020905b815481529060010190602001808311610bb457829003601f168201915b5050505050905090565b6000610be6826120d8565b610c1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6282611324565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce8612113565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1a5750610d1881610d13612113565b611dd6565b155b15610d51576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5c83838361211b565b505050565b6000610d6b612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610def576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47905090565b600060025460015403905090565b600360060160009054906101000a900460ff16610ef357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330836040518363ffffffff1660e01b8152600401610e7a9291906154e7565b602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190615525565b15610ef2576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610efe8383836121cd565b505050565b600090565b610f10611f7b565b6000600360060160036101000a81548160ff02191690836002811115610f3957610f38615552565b5b0217905550565b610f48611f7b565b80600360060160026101000a81548160ff02191690831515021790555050565b6000610f726126f5565b610f7a61275c565b610f82612861565b600280811115610f9557610f94615552565b5b600360060160039054906101000a900460ff166002811115610fba57610fb9615552565b5b14610ff1576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61100d600a600101805490508361100891906155b0565b6128d3565b15611044576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105561104f612113565b83612937565b819050919050565b611078838383604051806020016040528060008152506119a3565b505050565b6000611088826120d8565b9050919050565b606060005b6001548110156112115760006110a982612ad4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361120357806040015161120257600360060160009054906101000a900460ff161561113157601a829080600181540180825580915050600190039060005260206000200160009091909190915055611201565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b81526004016111919291906154e7565b602060405180830381865afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190615525565b61120057601a8290806001815401808255809150506001900390600052602060002001600090919091909150555b5b5b5b508080600101915050611094565b50601a80548060200260200160405190810160405280929190818152602001828054801561125e57602002820191906000526020600020905b81548152602001906001019080831161124a575b50505050509050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60010180548060200260200160405190810160405280929190818152602001828054801561131a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112d0575b5050505050905090565b6000600360060160009054906101000a900460ff166113ed57600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b815260040161139d9291906154e7565b602060405180830381865afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190615525565b156113ec57600090506113fd565b5b6113f682612ad4565b6000015190505b919050565b61140a611f7b565b600a600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61154a611f7b565b6001600360060160016101000a81548160ff021916908315150217905550818160038001919061157b9291906147a9565b505050565b611588611f7b565b80600c6004018190555050565b61159d611f7b565b80600c6003018190555050565b6060806115b683612d50565b91509150915091565b6115c7611f7b565b84600c6001018190555083600c6002018190555081600c60000160016101000a81548160ff021916908360ff16021790555082600c60000160026101000a81548160ff021916908360ff16021790555080600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050565b611652611f7b565b81816003800191906116659291906147a9565b505050565b60006116746126f5565b61167c61275c565b611684612861565b61168e8383612f90565b6116aa600a60010180549050856116a591906155b0565b6128d3565b156116e1576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f26116ec612113565b85612937565b8390509392505050565b60606003600201805461170e906154b6565b80601f016020809104026020016040519081016040528092919081815260200182805461173a906154b6565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611f7b565b6002600360060160036101000a81548160ff021916908360028111156117c2576117c1615552565b5b0217905550565b60006117d482612ad4565b600001519050919050565b6117e7612113565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060176000611858612113565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611905612113565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194a91906149ce565b60405180910390a35050565b61195e611f7b565b8060036005018190555050565b611973611f7b565b6001600360060160036101000a81548160ff0219169083600281111561199c5761199b615552565b5b0217905550565b600360060160009054906101000a900460ff16611a9357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b8152600401611a1a9291906154e7565b602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190615525565b15611a92576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b611a9e8484846121cd565b611aaa848484846130eb565b611ae0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b611b56611f7b565b611b5e61275c565b611b688282612937565b5050565b6060611b77826120d8565b611bad576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038001611bba83613269565b604051602001611bcb929190615772565b6040516020818303038152906040529050919050565b6060600380018054611bf2906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906154b6565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b5050505050905090565b606080611c89611c83612113565b846133c9565b611c9161343e565b15611cc8576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd9611cd3612113565b8461345e565b91509150915091565b6000611cec6134f6565b15611d23576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d37611d2e612113565b86868686613516565b9050949350505050565b606060036004018054611d53906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7f906154b6565b8015611dcc5780601f10611da157610100808354040283529160200191611dcc565b820191906000526020600020905b815481529060010190602001808311611daf57829003601f168201915b5050505050905090565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e72612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80471015611f30576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f76573d6000803e3d6000fd5b505050565b6000611f85612113565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120345750600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561206b576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001548210801561210c575060146000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826015600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121d882612ad4565b905060006121e4612113565b90506000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122765750826000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122b4575061228584610bdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122c957506122c8836000015183611dd6565b5b905080612302576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e1600085856000015161211b565b6001601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846014600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600086815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612691576001548110156126905783600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461275a576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600360060160029054906101000a900460ff161561285f576000600c6005015490506000600c6006015490506000600c6007015490504283111580156127a157508142105b156127d9576001600360060160036101000a81548160ff021916908360028111156127cf576127ce615552565b5b021790555061285b565b4282111580156127f35750804210806127f25750806000145b5b1561282b576002600360060160036101000a81548160ff0219169083600281111561282157612820615552565b5b021790555061285a565b6000600360060160036101000a81548160ff0219169083600281111561285457612853615552565b5b02179055505b5b5050505b565b600360060160039054906101000a900460ff16600281111561288657612885615552565b5b6000600281111561289a57612899615552565b5b036128d1576040517f08a69c7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600061292e600160028111156128ec576128eb615552565b5b600360060160039054906101000a900460ff16600281111561291157612910615552565b5b1461292157600c60020154612928565b600c600101545b836138f9565b34109050919050565b60005b600a60010180549050811015612acf57600080600a6001018381548110612964576129636157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685856040516024016129b89291906154e7565b6040516020818303038152906040527fa1448194000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a429190615822565b6000604051808303816000865af19150503d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b509150915081612ac0576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808060010191505061293a565b505050565b612adc61482f565b6000829050600154811015612d19576000601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d1757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bfb578092505050612d4b565b5b600115612d1657818060019003925050601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612d4b565b612bfc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060806000805b600a60010180549050811015612d7c5781806001019250508080600101915050612d57565b5060008167ffffffffffffffff811115612d9957612d9861516c565b5b604051908082528060200260200182016040528015612dc75781602001602082028036833780820191505090505b50905060008267ffffffffffffffff811115612de657612de561516c565b5b604051908082528060200260200182016040528015612e145781602001602082028036833780820191505090505b5090506000925060005b600a60010180549050811015612f8157600a6001018181548110612e4557612e446157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838581518110612e8357612e826157ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860008881526020019081526020016000206000600a6001018381548110612ee957612ee86157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828580600101965081518110612f6857612f676157ac565b5b6020026020010181815250508080600101915050612e1e565b50818194509450505050915091565b6000612f9a612113565b905060008173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061302d575060028081111561300657613005615552565b5b600360060160039054906101000a900460ff16600281111561302b5761302a615552565b5b145b9050806130ae576130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600360050154846040516020016130909190615881565b6040516020818303038152906040528051906020012061393c565b90505b806130e5576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613953565b1561325c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612113565b8786866040518563ffffffff1660e01b815260040161315794939291906158e6565b6020604051808303816000875af192505050801561319357506040513d601f19601f820116820180604052508101906131909190615947565b60015b61320c573d80600081146131c3576040519150601f19603f3d011682016040523d82523d6000602084013e6131c8565b606091505b506000815103613204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613261565b600190505b949350505050565b6060816000036132b0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c4565b600082905060005b816000146132e25780806132cb90615974565b915050600a826132db91906159eb565b91506132b8565b60008167ffffffffffffffff8111156132fe576132fd61516c565b5b6040519080825280601f01601f1916602001820160405280156133305781602001600182028036833780820191505090505b5090505b846000146133bd576001826133499190615a1c565b9150600a856133589190615a50565b60306133649190615a81565b60f81b81838151811061337a576133796157ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b691906159eb565b9450613334565b8093505050505b919050565b6133d281612ad4565b6000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343a576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600080600c6004015414158015613459575034600c60040154115b905090565b60608061346b84846133c9565b60008061347785612d50565b9150915061348485613976565b61348e8686613cf5565b60005b82518110156134e6576134d9868483815181106134b1576134b06157ac565b5b60200260200101518484815181106134cc576134cb6157ac565b5b6020026020010151613f23565b8080600101915050613491565b5081819350935050509250929050565b600080600c6003015414158015613511575034600c60030154115b905090565b600080858590501480156135305750828290508585905014155b15613567576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001549050613579876001614101565b80601860008381526020019081526020016000206000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b868690508110156138eb5761364b878783818110613617576136166157ac565b5b905060200201602081019061362c9190614901565b86868481811061363f5761363e6157ac565b5b9050602002013561411f565b15613682576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868682818110613695576136946157ac565b5b90506020020160208101906136aa9190614901565b73ffffffffffffffffffffffffffffffffffffffff1663a084c6ad8686848181106136d8576136d76157ac565b5b905060200201356040518263ffffffff1660e01b81526004016136fb9190614b80565b602060405180830381865afa158015613718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373c9190615aec565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146137a0576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484828181106137b3576137b26157ac565b5b905060200201356018600084815260200190815260200160002060008989858181106137e2576137e16157ac565b5b90506020020160208101906137f79190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016019600089898581811061384e5761384d6157ac565b5b90506020020160208101906138639190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106138b2576138b16157ac565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506135f6565b508091505095945050505050565b60008260000361390c5760009050613936565b818361391891906155b0565b905081838261392791906159eb565b1461393557613934615b19565b5b5b92915050565b6000826139498584614246565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061398182612ad4565b9050613993600083836000015161211b565b600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160188282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516014600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160146000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613c7e57600154811015613c7d5781600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46002600081548092919060010191905055505050565b60005b600a60010180549050811015613f1e57600080600a6001018381548110613d2257613d216157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601860008681526020019081526020016000206000600a6001018681548110613d8f57613d8e6157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486604051602401613e07929190615b48565b6040516020818303038152906040527ff1d2ec1d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613e919190615822565b6000604051808303816000865af19150503d8060008114613ece576040519150601f19603f3d011682016040523d82523d6000602084013e613ed3565b606091505b509150915081613f0f576040517fb5bc7d7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080600101915050613cf8565b505050565b613f2d828261411f565b613f63576040517f431d992700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a084c6ad826040518263ffffffff1660e01b8152600401613f9c9190614b80565b602060405180830381865afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615aec565b73ffffffffffffffffffffffffffffffffffffffff16613ffb612113565b73ffffffffffffffffffffffffffffffffffffffff1614614048576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060006101000a81549060ff02191690556018600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b61411b8282604051806020016040528060008152506142bb565b5050565b6000600360060160009054906101000a900460ff161561419e57601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050614240565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b45a3c0e836040518263ffffffff1660e01b81526004016141fc9190614b80565b602060405180830381865afa158015614219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423d9190615525565b90505b92915050565b60008082905060005b84518110156142b057600085828151811061426d5761426c6157ac565b5b6020026020010151905080831161428f5761428883826142cd565b925061429c565b61429981846142cd565b92505b5080806142a890615974565b91505061424f565b508091505092915050565b6142c883838360016142e4565b505050565b600082600052816020526040600020905092915050565b600060015490506142f361473e565b614329576040517f271c929900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361438f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036143c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160028111156144e1576144e0615552565b5b600360060160039054906101000a900460ff16600281111561450657614505615552565b5b036145cd5783601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1601601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b846014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561472e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156146e257506146e060008884886130eb565b155b15614719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050614667565b5080600181905550505050505050565b6000600360060160009054906101000a900460ff16806147a4575060001515600360060160009054906101000a900460ff1615151480156147a35750600154600c60000160039054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b5b905090565b8280546147b5906154b6565b90600052602060002090601f0160209004810192826147d7576000855561481e565b82601f106147f057803560ff191683800117855561481e565b8280016001018555821561481e579182015b8281111561481d578235825591602001919060010190614802565b5b50905061482b9190614872565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561488b576000816000905550600101614873565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148ce826148a3565b9050919050565b6148de816148c3565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b60006020828403121561491757614916614899565b5b6000614925848285016148ec565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149638161492e565b811461496e57600080fd5b50565b6000813590506149808161495a565b92915050565b60006020828403121561499c5761499b614899565b5b60006149aa84828501614971565b91505092915050565b60008115159050919050565b6149c8816149b3565b82525050565b60006020820190506149e360008301846149bf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a23578082015181840152602081019050614a08565b83811115614a32576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a54826149e9565b614a5e81856149f4565b9350614a6e818560208601614a05565b614a7781614a38565b840191505092915050565b60006020820190508181036000830152614a9c8184614a49565b905092915050565b6000819050919050565b614ab781614aa4565b8114614ac257600080fd5b50565b600081359050614ad481614aae565b92915050565b600060208284031215614af057614aef614899565b5b6000614afe84828501614ac5565b91505092915050565b614b10816148c3565b82525050565b6000602082019050614b2b6000830184614b07565b92915050565b60008060408385031215614b4857614b47614899565b5b6000614b56858286016148ec565b9250506020614b6785828601614ac5565b9150509250929050565b614b7a81614aa4565b82525050565b6000602082019050614b956000830184614b71565b92915050565b600080600060608486031215614bb457614bb3614899565b5b6000614bc2868287016148ec565b9350506020614bd3868287016148ec565b9250506040614be486828701614ac5565b9150509250925092565b600060ff82169050919050565b614c0481614bee565b82525050565b6000602082019050614c1f6000830184614bfb565b92915050565b614c2e816149b3565b8114614c3957600080fd5b50565b600081359050614c4b81614c25565b92915050565b600060208284031215614c6757614c66614899565b5b6000614c7584828501614c3c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614cb381614aa4565b82525050565b6000614cc58383614caa565b60208301905092915050565b6000602082019050919050565b6000614ce982614c7e565b614cf38185614c89565b9350614cfe83614c9a565b8060005b83811015614d2f578151614d168882614cb9565b9750614d2183614cd1565b925050600181019050614d02565b5085935050505092915050565b60006020820190508181036000830152614d568184614cde565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d93816148c3565b82525050565b6000614da58383614d8a565b60208301905092915050565b6000602082019050919050565b6000614dc982614d5e565b614dd38185614d69565b9350614dde83614d7a565b8060005b83811015614e0f578151614df68882614d99565b9750614e0183614db1565b925050600181019050614de2565b5085935050505092915050565b60006020820190508181036000830152614e368184614dbe565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614e6357614e62614e3e565b5b8235905067ffffffffffffffff811115614e8057614e7f614e43565b5b602083019150836001820283011115614e9c57614e9b614e48565b5b9250929050565b60008060208385031215614eba57614eb9614899565b5b600083013567ffffffffffffffff811115614ed857614ed761489e565b5b614ee485828601614e4d565b92509250509250929050565b60006040820190508181036000830152614f0a8185614dbe565b90508181036020830152614f1e8184614cde565b90509392505050565b614f3081614bee565b8114614f3b57600080fd5b50565b600081359050614f4d81614f27565b92915050565b600067ffffffffffffffff82169050919050565b614f7081614f53565b8114614f7b57600080fd5b50565b600081359050614f8d81614f67565b92915050565b600080600080600060a08688031215614faf57614fae614899565b5b6000614fbd88828901614ac5565b9550506020614fce88828901614ac5565b9450506040614fdf88828901614f3e565b9350506060614ff088828901614f3e565b925050608061500188828901614f7e565b9150509295509295909350565b60008083601f84011261502457615023614e3e565b5b8235905067ffffffffffffffff81111561504157615040614e43565b5b60208301915083602082028301111561505d5761505c614e48565b5b9250929050565b60008060006040848603121561507d5761507c614899565b5b600061508b86828701614ac5565b935050602084013567ffffffffffffffff8111156150ac576150ab61489e565b5b6150b88682870161500e565b92509250509250925092565b600080604083850312156150db576150da614899565b5b60006150e9858286016148ec565b92505060206150fa85828601614c3c565b9150509250929050565b6000819050919050565b61511781615104565b811461512257600080fd5b50565b6000813590506151348161510e565b92915050565b6000602082840312156151505761514f614899565b5b600061515e84828501615125565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6151a482614a38565b810181811067ffffffffffffffff821117156151c3576151c261516c565b5b80604052505050565b60006151d661488f565b90506151e2828261519b565b919050565b600067ffffffffffffffff8211156152025761520161516c565b5b61520b82614a38565b9050602081019050919050565b82818337600083830152505050565b600061523a615235846151e7565b6151cc565b90508281526020810184848401111561525657615255615167565b5b615261848285615218565b509392505050565b600082601f83011261527e5761527d614e3e565b5b813561528e848260208601615227565b91505092915050565b600080600080608085870312156152b1576152b0614899565b5b60006152bf878288016148ec565b94505060206152d0878288016148ec565b93505060406152e187828801614ac5565b925050606085013567ffffffffffffffff8111156153025761530161489e565b5b61530e87828801615269565b91505092959194509250565b60008083601f8401126153305761532f614e3e565b5b8235905067ffffffffffffffff81111561534d5761534c614e43565b5b60208301915083602082028301111561536957615368614e48565b5b9250929050565b60008083601f84011261538657615385614e3e565b5b8235905067ffffffffffffffff8111156153a3576153a2614e43565b5b6020830191508360208202830111156153bf576153be614e48565b5b9250929050565b600080600080604085870312156153e0576153df614899565b5b600085013567ffffffffffffffff8111156153fe576153fd61489e565b5b61540a8782880161531a565b9450945050602085013567ffffffffffffffff81111561542d5761542c61489e565b5b61543987828801615370565b925092505092959194509250565b6000806040838503121561545e5761545d614899565b5b600061546c858286016148ec565b925050602061547d858286016148ec565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154ce57607f821691505b6020821081036154e1576154e0615487565b5b50919050565b60006040820190506154fc6000830185614b07565b6155096020830184614b71565b9392505050565b60008151905061551f81614c25565b92915050565b60006020828403121561553b5761553a614899565b5b600061554984828501615510565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155bb82614aa4565b91506155c683614aa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ff576155fe615581565b5b828202905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154615637816154b6565b615641818661560a565b9450600182166000811461565c576001811461566d576156a0565b60ff198316865281860193506156a0565b61567685615615565b60005b8381101561569857815481890152600182019150602081019050615679565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006156df60018361560a565b91506156ea826156a9565b600182019050919050565b6000615700826149e9565b61570a818561560a565b935061571a818560208601614a05565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061575c60058361560a565b915061576782615726565b600582019050919050565b600061577e828561562a565b9150615789826156d2565b915061579582846156f5565b91506157a08261574f565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60006157fc826157db565b61580681856157e6565b9350615816818560208601614a05565b80840191505092915050565b600061582e82846157f1565b915081905092915050565b60008160601b9050919050565b600061585182615839565b9050919050565b600061586382615846565b9050919050565b61587b615876826148c3565b615858565b82525050565b600061588d828461586a565b60148201915081905092915050565b600082825260208201905092915050565b60006158b8826157db565b6158c2818561589c565b93506158d2818560208601614a05565b6158db81614a38565b840191505092915050565b60006080820190506158fb6000830187614b07565b6159086020830186614b07565b6159156040830185614b71565b818103606083015261592781846158ad565b905095945050505050565b6000815190506159418161495a565b92915050565b60006020828403121561595d5761595c614899565b5b600061596b84828501615932565b91505092915050565b600061597f82614aa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159b1576159b0615581565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006159f682614aa4565b9150615a0183614aa4565b925082615a1157615a106159bc565b5b828204905092915050565b6000615a2782614aa4565b9150615a3283614aa4565b925082821015615a4557615a44615581565b5b828203905092915050565b6000615a5b82614aa4565b9150615a6683614aa4565b925082615a7657615a756159bc565b5b828206905092915050565b6000615a8c82614aa4565b9150615a9783614aa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615acc57615acb615581565b5b828201905092915050565b600081519050615ae6816148d5565b92915050565b600060208284031215615b0257615b01614899565b5b6000615b1084828501615ad7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000604082019050615b5d6000830185614b71565b615b6a6020830184614b07565b939250505056fea26469706673582212209b9832035cbe2f11b3ae77aef04a8389d80b163e2966407e0e5e1cc172f43ea964736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000841696c6f7365747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741494c4f53455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f746f6b656e2f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135620000000000000000000000000000000000000000000000000000000000000000000000000000000000007d68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f636f6e74726163742f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135622e6a736f6e000000
Deployed Bytecode
0x60806040526004361061025b5760003560e01c80637fdf5dc411610144578063b4e99839116100b6578063d547cfb71161007a578063d547cfb7146108fc578063daba6f3a14610927578063e0173a6d14610958578063e8a3d48514610988578063e985e9c5146109b3578063f3fef3a3146109f05761025b565b8063b4e9983914610819578063b88d4fde14610830578063bf7bab7314610859578063c2f1dcc814610896578063c87b56dd146108bf5761025b565b8063911e65fa11610108578063911e65fa1461071857806395d89b41146107485780639ece339814610773578063a084c6ad1461078a578063a22cb465146107c7578063b11c7f82146107f05761025b565b80637fdf5dc414610636578063834fd1241461065f5780638525185114610688578063864aa866146106c6578063870d6f9d146106ef5761025b565b80633e6007e0116101dd5780635ca1e165116101a15780635ca1e165146105145780635ecc8e6b1461053f5780636352211e1461056a57806368d4e4ef146105a757806370a08231146105d0578063794100b91461060d5761025b565b80633e6007e014610418578063403398301461044157806342842e0e146104715780634f558e791461049a5780635a3f2672146104d75761025b565b806312065fe01161022457806312065fe01461035757806318160ddd1461038257806323b872dd146103ad578063313ce567146103d65780633e3e0b12146104015761025b565b80623ba1ed1461026057806301ffc9a71461028957806306fdde03146102c6578063081812fc146102f1578063095ea7b31461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190614901565b610a19565b005b34801561029557600080fd5b506102b060048036038101906102ab9190614986565b610a64565b6040516102bd91906149ce565b60405180910390f35b3480156102d257600080fd5b506102db610b46565b6040516102e89190614a82565b60405180910390f35b3480156102fd57600080fd5b5061031860048036038101906103139190614ada565b610bdb565b6040516103259190614b16565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190614b31565b610c57565b005b34801561036357600080fd5b5061036c610d61565b6040516103799190614b80565b60405180910390f35b34801561038e57600080fd5b50610397610df5565b6040516103a49190614b80565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614b9b565b610e03565b005b3480156103e257600080fd5b506103eb610f03565b6040516103f89190614c0a565b60405180910390f35b34801561040d57600080fd5b50610416610f08565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614c51565b610f40565b005b61045b60048036038101906104569190614ada565b610f68565b6040516104689190614b80565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190614b9b565b61105d565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190614ada565b61107d565b6040516104ce91906149ce565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190614901565b61108f565b60405161050b9190614d3c565b60405180910390f35b34801561052057600080fd5b5061052961126a565b6040516105369190614b16565b60405180910390f35b34801561054b57600080fd5b50610554611293565b6040516105619190614e1c565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190614ada565b611324565b60405161059e9190614b16565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614901565b611402565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190614901565b611473565b6040516106049190614b80565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190614ea3565b611542565b005b34801561064257600080fd5b5061065d60048036038101906106589190614ada565b611580565b005b34801561066b57600080fd5b5061068660048036038101906106819190614ada565b611595565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614ada565b6115aa565b6040516106bd929190614ef0565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190614f93565b6115bf565b005b3480156106fb57600080fd5b5061071660048036038101906107119190614ea3565b61164a565b005b610732600480360381019061072d9190615064565b61166a565b60405161073f9190614b80565b60405180910390f35b34801561075457600080fd5b5061075d6116fc565b60405161076a9190614a82565b60405180910390f35b34801561077f57600080fd5b50610788611791565b005b34801561079657600080fd5b506107b160048036038101906107ac9190614ada565b6117c9565b6040516107be9190614b16565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e991906150c4565b6117df565b005b3480156107fc57600080fd5b506108176004803603810190610812919061513a565b611956565b005b34801561082557600080fd5b5061082e61196b565b005b34801561083c57600080fd5b5061085760048036038101906108529190615297565b6119a3565b005b34801561086557600080fd5b50610880600480360381019061087b9190614b31565b611ae6565b60405161088d91906149ce565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190614b31565b611b4e565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ada565b611b6c565b6040516108f39190614a82565b60405180910390f35b34801561090857600080fd5b50610911611be1565b60405161091e9190614a82565b60405180910390f35b610941600480360381019061093c9190614ada565b611c75565b60405161094f929190614ef0565b60405180910390f35b610972600480360381019061096d91906153c6565b611ce2565b60405161097f9190614b80565b60405180910390f35b34801561099457600080fd5b5061099d611d41565b6040516109aa9190614a82565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190615447565b611dd6565b6040516109e791906149ce565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614b31565b611e6a565b005b610a21611f7b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3f5750610b3e8261206e565b5b9050919050565b606060036000018054610b58906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b84906154b6565b8015610bd15780601f10610ba657610100808354040283529160200191610bd1565b820191906000526020600020905b815481529060010190602001808311610bb457829003601f168201915b5050505050905090565b6000610be6826120d8565b610c1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6282611324565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce8612113565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1a5750610d1881610d13612113565b611dd6565b155b15610d51576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5c83838361211b565b505050565b6000610d6b612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610def576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b47905090565b600060025460015403905090565b600360060160009054906101000a900460ff16610ef357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330836040518363ffffffff1660e01b8152600401610e7a9291906154e7565b602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190615525565b15610ef2576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610efe8383836121cd565b505050565b600090565b610f10611f7b565b6000600360060160036101000a81548160ff02191690836002811115610f3957610f38615552565b5b0217905550565b610f48611f7b565b80600360060160026101000a81548160ff02191690831515021790555050565b6000610f726126f5565b610f7a61275c565b610f82612861565b600280811115610f9557610f94615552565b5b600360060160039054906101000a900460ff166002811115610fba57610fb9615552565b5b14610ff1576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61100d600a600101805490508361100891906155b0565b6128d3565b15611044576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105561104f612113565b83612937565b819050919050565b611078838383604051806020016040528060008152506119a3565b505050565b6000611088826120d8565b9050919050565b606060005b6001548110156112115760006110a982612ad4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361120357806040015161120257600360060160009054906101000a900460ff161561113157601a829080600181540180825580915050600190039060005260206000200160009091909190915055611201565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b81526004016111919291906154e7565b602060405180830381865afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190615525565b61120057601a8290806001815401808255809150506001900390600052602060002001600090919091909150555b5b5b5b508080600101915050611094565b50601a80548060200260200160405190810160405280929190818152602001828054801561125e57602002820191906000526020600020905b81548152602001906001019080831161124a575b50505050509050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60010180548060200260200160405190810160405280929190818152602001828054801561131a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112d0575b5050505050905090565b6000600360060160009054906101000a900460ff166113ed57600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b815260040161139d9291906154e7565b602060405180830381865afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190615525565b156113ec57600090506113fd565b5b6113f682612ad4565b6000015190505b919050565b61140a611f7b565b600a600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61154a611f7b565b6001600360060160016101000a81548160ff021916908315150217905550818160038001919061157b9291906147a9565b505050565b611588611f7b565b80600c6004018190555050565b61159d611f7b565b80600c6003018190555050565b6060806115b683612d50565b91509150915091565b6115c7611f7b565b84600c6001018190555083600c6002018190555081600c60000160016101000a81548160ff021916908360ff16021790555082600c60000160026101000a81548160ff021916908360ff16021790555080600c60000160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050505050565b611652611f7b565b81816003800191906116659291906147a9565b505050565b60006116746126f5565b61167c61275c565b611684612861565b61168e8383612f90565b6116aa600a60010180549050856116a591906155b0565b6128d3565b156116e1576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f26116ec612113565b85612937565b8390509392505050565b60606003600201805461170e906154b6565b80601f016020809104026020016040519081016040528092919081815260200182805461173a906154b6565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611f7b565b6002600360060160036101000a81548160ff021916908360028111156117c2576117c1615552565b5b0217905550565b60006117d482612ad4565b600001519050919050565b6117e7612113565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060176000611858612113565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611905612113565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161194a91906149ce565b60405180910390a35050565b61195e611f7b565b8060036005018190555050565b611973611f7b565b6001600360060160036101000a81548160ff0219169083600281111561199c5761199b615552565b5b0217905550565b600360060160009054906101000a900460ff16611a9357600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7bab7330846040518363ffffffff1660e01b8152600401611a1a9291906154e7565b602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190615525565b15611a92576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b611a9e8484846121cd565b611aaa848484846130eb565b611ae0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16905092915050565b611b56611f7b565b611b5e61275c565b611b688282612937565b5050565b6060611b77826120d8565b611bad576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038001611bba83613269565b604051602001611bcb929190615772565b6040516020818303038152906040529050919050565b6060600380018054611bf2906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906154b6565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b5050505050905090565b606080611c89611c83612113565b846133c9565b611c9161343e565b15611cc8576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cd9611cd3612113565b8461345e565b91509150915091565b6000611cec6134f6565b15611d23576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d37611d2e612113565b86868686613516565b9050949350505050565b606060036004018054611d53906154b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7f906154b6565b8015611dcc5780601f10611da157610100808354040283529160200191611dcc565b820191906000526020600020905b815481529060010190602001808311611daf57829003601f168201915b5050505050905090565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e72612113565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ef6576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80471015611f30576040517fffec2f6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611f76573d6000803e3d6000fd5b505050565b6000611f85612113565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120345750600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561206b576040517f988a727000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001548210801561210c575060146000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826015600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121d882612ad4565b905060006121e4612113565b90506000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122765750826000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122b4575061228584610bdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806122c957506122c8836000015183611dd6565b5b905080612302576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123d1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e1600085856000015161211b565b6001601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846014600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600086815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600185019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612691576001548110156126905783600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461275a576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600360060160029054906101000a900460ff161561285f576000600c6005015490506000600c6006015490506000600c6007015490504283111580156127a157508142105b156127d9576001600360060160036101000a81548160ff021916908360028111156127cf576127ce615552565b5b021790555061285b565b4282111580156127f35750804210806127f25750806000145b5b1561282b576002600360060160036101000a81548160ff0219169083600281111561282157612820615552565b5b021790555061285a565b6000600360060160036101000a81548160ff0219169083600281111561285457612853615552565b5b02179055505b5b5050505b565b600360060160039054906101000a900460ff16600281111561288657612885615552565b5b6000600281111561289a57612899615552565b5b036128d1576040517f08a69c7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600061292e600160028111156128ec576128eb615552565b5b600360060160039054906101000a900460ff16600281111561291157612910615552565b5b1461292157600c60020154612928565b600c600101545b836138f9565b34109050919050565b60005b600a60010180549050811015612acf57600080600a6001018381548110612964576129636157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685856040516024016129b89291906154e7565b6040516020818303038152906040527fa1448194000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a429190615822565b6000604051808303816000865af19150503d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b509150915081612ac0576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808060010191505061293a565b505050565b612adc61482f565b6000829050600154811015612d19576000601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d1757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bfb578092505050612d4b565b5b600115612d1657818060019003925050601460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612d4b565b612bfc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6060806000805b600a60010180549050811015612d7c5781806001019250508080600101915050612d57565b5060008167ffffffffffffffff811115612d9957612d9861516c565b5b604051908082528060200260200182016040528015612dc75781602001602082028036833780820191505090505b50905060008267ffffffffffffffff811115612de657612de561516c565b5b604051908082528060200260200182016040528015612e145781602001602082028036833780820191505090505b5090506000925060005b600a60010180549050811015612f8157600a6001018181548110612e4557612e446157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838581518110612e8357612e826157ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860008881526020019081526020016000206000600a6001018381548110612ee957612ee86157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828580600101965081518110612f6857612f676157ac565b5b6020026020010181815250508080600101915050612e1e565b50818194509450505050915091565b6000612f9a612113565b905060008173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061302d575060028081111561300657613005615552565b5b600360060160039054906101000a900460ff16600281111561302b5761302a615552565b5b145b9050806130ae576130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600360050154846040516020016130909190615881565b6040516020818303038152906040528051906020012061393c565b90505b806130e5576040517f9f167ed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613953565b1561325c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612113565b8786866040518563ffffffff1660e01b815260040161315794939291906158e6565b6020604051808303816000875af192505050801561319357506040513d601f19601f820116820180604052508101906131909190615947565b60015b61320c573d80600081146131c3576040519150601f19603f3d011682016040523d82523d6000602084013e6131c8565b606091505b506000815103613204576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613261565b600190505b949350505050565b6060816000036132b0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c4565b600082905060005b816000146132e25780806132cb90615974565b915050600a826132db91906159eb565b91506132b8565b60008167ffffffffffffffff8111156132fe576132fd61516c565b5b6040519080825280601f01601f1916602001820160405280156133305781602001600182028036833780820191505090505b5090505b846000146133bd576001826133499190615a1c565b9150600a856133589190615a50565b60306133649190615a81565b60f81b81838151811061337a576133796157ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b691906159eb565b9450613334565b8093505050505b919050565b6133d281612ad4565b6000015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461343a576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b600080600c6004015414158015613459575034600c60040154115b905090565b60608061346b84846133c9565b60008061347785612d50565b9150915061348485613976565b61348e8686613cf5565b60005b82518110156134e6576134d9868483815181106134b1576134b06157ac565b5b60200260200101518484815181106134cc576134cb6157ac565b5b6020026020010151613f23565b8080600101915050613491565b5081819350935050509250929050565b600080600c6003015414158015613511575034600c60030154115b905090565b600080858590501480156135305750828290508585905014155b15613567576040517fc64fc37200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001549050613579876001614101565b80601860008381526020019081526020016000206000600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b868690508110156138eb5761364b878783818110613617576136166157ac565b5b905060200201602081019061362c9190614901565b86868481811061363f5761363e6157ac565b5b9050602002013561411f565b15613682576040517f1b73ba6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868682818110613695576136946157ac565b5b90506020020160208101906136aa9190614901565b73ffffffffffffffffffffffffffffffffffffffff1663a084c6ad8686848181106136d8576136d76157ac565b5b905060200201356040518263ffffffff1660e01b81526004016136fb9190614b80565b602060405180830381865afa158015613718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373c9190615aec565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146137a0576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484828181106137b3576137b26157ac565b5b905060200201356018600084815260200190815260200160002060008989858181106137e2576137e16157ac565b5b90506020020160208101906137f79190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016019600089898581811061384e5761384d6157ac565b5b90506020020160208101906138639190614901565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106138b2576138b16157ac565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506135f6565b508091505095945050505050565b60008260000361390c5760009050613936565b818361391891906155b0565b905081838261392791906159eb565b1461393557613934615b19565b5b5b92915050565b6000826139498584614246565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061398182612ad4565b9050613993600083836000015161211b565b600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160166000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160188282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600001516014600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160146000848152602001908152602001600020600001601c6101000a81548160ff0219169083151502179055506000600183019050600073ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613c7e57600154811015613c7d5781600001516014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602001516014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5081600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46002600081548092919060010191905055505050565b60005b600a60010180549050811015613f1e57600080600a6001018381548110613d2257613d216157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601860008681526020019081526020016000206000600a6001018681548110613d8f57613d8e6157ac565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486604051602401613e07929190615b48565b6040516020818303038152906040527ff1d2ec1d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613e919190615822565b6000604051808303816000865af19150503d8060008114613ece576040519150601f19603f3d011682016040523d82523d6000602084013e613ed3565b606091505b509150915081613f0f576040517fb5bc7d7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080600101915050613cf8565b505050565b613f2d828261411f565b613f63576040517f431d992700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a084c6ad826040518263ffffffff1660e01b8152600401613f9c9190614b80565b602060405180830381865afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190615aec565b73ffffffffffffffffffffffffffffffffffffffff16613ffb612113565b73ffffffffffffffffffffffffffffffffffffffff1614614048576040517f4fb505aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060006101000a81549060ff02191690556018600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b61411b8282604051806020016040528060008152506142bb565b5050565b6000600360060160009054906101000a900460ff161561419e57601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff169050614240565b600a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b45a3c0e836040518263ffffffff1660e01b81526004016141fc9190614b80565b602060405180830381865afa158015614219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423d9190615525565b90505b92915050565b60008082905060005b84518110156142b057600085828151811061426d5761426c6157ac565b5b6020026020010151905080831161428f5761428883826142cd565b925061429c565b61429981846142cd565b92505b5080806142a890615974565b91505061424f565b508091505092915050565b6142c883838360016142e4565b505050565b600082600052816020526040600020905092915050565b600060015490506142f361473e565b614329576040517f271c929900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361438f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036143c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160028111156144e1576144e0615552565b5b600360060160039054906101000a900460ff16600281111561450657614505615552565b5b036145cd5783601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1601601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b846014600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426014600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561472e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156146e257506146e060008884886130eb565b155b15614719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050614667565b5080600181905550505050505050565b6000600360060160009054906101000a900460ff16806147a4575060001515600360060160009054906101000a900460ff1615151480156147a35750600154600c60000160039054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b5b905090565b8280546147b5906154b6565b90600052602060002090601f0160209004810192826147d7576000855561481e565b82601f106147f057803560ff191683800117855561481e565b8280016001018555821561481e579182015b8281111561481d578235825591602001919060010190614802565b5b50905061482b9190614872565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561488b576000816000905550600101614873565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148ce826148a3565b9050919050565b6148de816148c3565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b60006020828403121561491757614916614899565b5b6000614925848285016148ec565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6149638161492e565b811461496e57600080fd5b50565b6000813590506149808161495a565b92915050565b60006020828403121561499c5761499b614899565b5b60006149aa84828501614971565b91505092915050565b60008115159050919050565b6149c8816149b3565b82525050565b60006020820190506149e360008301846149bf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a23578082015181840152602081019050614a08565b83811115614a32576000848401525b50505050565b6000601f19601f8301169050919050565b6000614a54826149e9565b614a5e81856149f4565b9350614a6e818560208601614a05565b614a7781614a38565b840191505092915050565b60006020820190508181036000830152614a9c8184614a49565b905092915050565b6000819050919050565b614ab781614aa4565b8114614ac257600080fd5b50565b600081359050614ad481614aae565b92915050565b600060208284031215614af057614aef614899565b5b6000614afe84828501614ac5565b91505092915050565b614b10816148c3565b82525050565b6000602082019050614b2b6000830184614b07565b92915050565b60008060408385031215614b4857614b47614899565b5b6000614b56858286016148ec565b9250506020614b6785828601614ac5565b9150509250929050565b614b7a81614aa4565b82525050565b6000602082019050614b956000830184614b71565b92915050565b600080600060608486031215614bb457614bb3614899565b5b6000614bc2868287016148ec565b9350506020614bd3868287016148ec565b9250506040614be486828701614ac5565b9150509250925092565b600060ff82169050919050565b614c0481614bee565b82525050565b6000602082019050614c1f6000830184614bfb565b92915050565b614c2e816149b3565b8114614c3957600080fd5b50565b600081359050614c4b81614c25565b92915050565b600060208284031215614c6757614c66614899565b5b6000614c7584828501614c3c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614cb381614aa4565b82525050565b6000614cc58383614caa565b60208301905092915050565b6000602082019050919050565b6000614ce982614c7e565b614cf38185614c89565b9350614cfe83614c9a565b8060005b83811015614d2f578151614d168882614cb9565b9750614d2183614cd1565b925050600181019050614d02565b5085935050505092915050565b60006020820190508181036000830152614d568184614cde565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d93816148c3565b82525050565b6000614da58383614d8a565b60208301905092915050565b6000602082019050919050565b6000614dc982614d5e565b614dd38185614d69565b9350614dde83614d7a565b8060005b83811015614e0f578151614df68882614d99565b9750614e0183614db1565b925050600181019050614de2565b5085935050505092915050565b60006020820190508181036000830152614e368184614dbe565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614e6357614e62614e3e565b5b8235905067ffffffffffffffff811115614e8057614e7f614e43565b5b602083019150836001820283011115614e9c57614e9b614e48565b5b9250929050565b60008060208385031215614eba57614eb9614899565b5b600083013567ffffffffffffffff811115614ed857614ed761489e565b5b614ee485828601614e4d565b92509250509250929050565b60006040820190508181036000830152614f0a8185614dbe565b90508181036020830152614f1e8184614cde565b90509392505050565b614f3081614bee565b8114614f3b57600080fd5b50565b600081359050614f4d81614f27565b92915050565b600067ffffffffffffffff82169050919050565b614f7081614f53565b8114614f7b57600080fd5b50565b600081359050614f8d81614f67565b92915050565b600080600080600060a08688031215614faf57614fae614899565b5b6000614fbd88828901614ac5565b9550506020614fce88828901614ac5565b9450506040614fdf88828901614f3e565b9350506060614ff088828901614f3e565b925050608061500188828901614f7e565b9150509295509295909350565b60008083601f84011261502457615023614e3e565b5b8235905067ffffffffffffffff81111561504157615040614e43565b5b60208301915083602082028301111561505d5761505c614e48565b5b9250929050565b60008060006040848603121561507d5761507c614899565b5b600061508b86828701614ac5565b935050602084013567ffffffffffffffff8111156150ac576150ab61489e565b5b6150b88682870161500e565b92509250509250925092565b600080604083850312156150db576150da614899565b5b60006150e9858286016148ec565b92505060206150fa85828601614c3c565b9150509250929050565b6000819050919050565b61511781615104565b811461512257600080fd5b50565b6000813590506151348161510e565b92915050565b6000602082840312156151505761514f614899565b5b600061515e84828501615125565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6151a482614a38565b810181811067ffffffffffffffff821117156151c3576151c261516c565b5b80604052505050565b60006151d661488f565b90506151e2828261519b565b919050565b600067ffffffffffffffff8211156152025761520161516c565b5b61520b82614a38565b9050602081019050919050565b82818337600083830152505050565b600061523a615235846151e7565b6151cc565b90508281526020810184848401111561525657615255615167565b5b615261848285615218565b509392505050565b600082601f83011261527e5761527d614e3e565b5b813561528e848260208601615227565b91505092915050565b600080600080608085870312156152b1576152b0614899565b5b60006152bf878288016148ec565b94505060206152d0878288016148ec565b93505060406152e187828801614ac5565b925050606085013567ffffffffffffffff8111156153025761530161489e565b5b61530e87828801615269565b91505092959194509250565b60008083601f8401126153305761532f614e3e565b5b8235905067ffffffffffffffff81111561534d5761534c614e43565b5b60208301915083602082028301111561536957615368614e48565b5b9250929050565b60008083601f84011261538657615385614e3e565b5b8235905067ffffffffffffffff8111156153a3576153a2614e43565b5b6020830191508360208202830111156153bf576153be614e48565b5b9250929050565b600080600080604085870312156153e0576153df614899565b5b600085013567ffffffffffffffff8111156153fe576153fd61489e565b5b61540a8782880161531a565b9450945050602085013567ffffffffffffffff81111561542d5761542c61489e565b5b61543987828801615370565b925092505092959194509250565b6000806040838503121561545e5761545d614899565b5b600061546c858286016148ec565b925050602061547d858286016148ec565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154ce57607f821691505b6020821081036154e1576154e0615487565b5b50919050565b60006040820190506154fc6000830185614b07565b6155096020830184614b71565b9392505050565b60008151905061551f81614c25565b92915050565b60006020828403121561553b5761553a614899565b5b600061554984828501615510565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155bb82614aa4565b91506155c683614aa4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ff576155fe615581565b5b828202905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154615637816154b6565b615641818661560a565b9450600182166000811461565c576001811461566d576156a0565b60ff198316865281860193506156a0565b61567685615615565b60005b8381101561569857815481890152600182019150602081019050615679565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006156df60018361560a565b91506156ea826156a9565b600182019050919050565b6000615700826149e9565b61570a818561560a565b935061571a818560208601614a05565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061575c60058361560a565b915061576782615726565b600582019050919050565b600061577e828561562a565b9150615789826156d2565b915061579582846156f5565b91506157a08261574f565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60006157fc826157db565b61580681856157e6565b9350615816818560208601614a05565b80840191505092915050565b600061582e82846157f1565b915081905092915050565b60008160601b9050919050565b600061585182615839565b9050919050565b600061586382615846565b9050919050565b61587b615876826148c3565b615858565b82525050565b600061588d828461586a565b60148201915081905092915050565b600082825260208201905092915050565b60006158b8826157db565b6158c2818561589c565b93506158d2818560208601614a05565b6158db81614a38565b840191505092915050565b60006080820190506158fb6000830187614b07565b6159086020830186614b07565b6159156040830185614b71565b818103606083015261592781846158ad565b905095945050505050565b6000815190506159418161495a565b92915050565b60006020828403121561595d5761595c614899565b5b600061596b84828501615932565b91505092915050565b600061597f82614aa4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159b1576159b0615581565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006159f682614aa4565b9150615a0183614aa4565b925082615a1157615a106159bc565b5b828204905092915050565b6000615a2782614aa4565b9150615a3283614aa4565b925082821015615a4557615a44615581565b5b828203905092915050565b6000615a5b82614aa4565b9150615a6683614aa4565b925082615a7657615a756159bc565b5b828206905092915050565b6000615a8c82614aa4565b9150615a9783614aa4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615acc57615acb615581565b5b828201905092915050565b600081519050615ae6816148d5565b92915050565b600060208284031215615b0257615b01614899565b5b6000615b1084828501615ad7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000604082019050615b5d6000830185614b71565b615b6a6020830184614b07565b939250505056fea26469706673582212209b9832035cbe2f11b3ae77aef04a8389d80b163e2966407e0e5e1cc172f43ea964736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000841696c6f7365747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741494c4f53455400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f746f6b656e2f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135620000000000000000000000000000000000000000000000000000000000000000000000000000000000007d68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d2f73746f726167652f66696c65732f636f6e74726163742f393938663666613136333339653839663263666437613861316662343431383231653831666230356236336638646264666339356362633339306138353135622e6a736f6e000000
-----Decoded View---------------
Arg [0] : name_ (string): Ailosets
Arg [1] : description_ (string):
Arg [2] : symbol_ (string): AILOSET
Arg [3] : baseURL_ (string): https://collection.ailoverse.com/storage/files/token/998f6fa16339e89f2cfd7a8a1fb441821e81fb05b63f8dbdfc95cbc390a8515b
Arg [4] : contractURL_ (string): https://collection.ailoverse.com/storage/files/contract/998f6fa16339e89f2cfd7a8a1fb441821e81fb05b63f8dbdfc95cbc390a8515b.json
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 41696c6f73657473000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [10] : 41494c4f53455400000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000075
Arg [12] : 68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d
Arg [13] : 2f73746f726167652f66696c65732f746f6b656e2f3939386636666131363333
Arg [14] : 3965383966326366643761386131666234343138323165383166623035623633
Arg [15] : 6638646264666339356362633339306138353135620000000000000000000000
Arg [16] : 000000000000000000000000000000000000000000000000000000000000007d
Arg [17] : 68747470733a2f2f636f6c6c656374696f6e2e61696c6f76657273652e636f6d
Arg [18] : 2f73746f726167652f66696c65732f636f6e74726163742f3939386636666131
Arg [19] : 3633333965383966326366643761386131666234343138323165383166623035
Arg [20] : 6236336638646264666339356362633339306138353135622e6a736f6e000000
Deployed Bytecode Sourcemap
63104:3534:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60766:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38097:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53358:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40577:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40137:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52516:190;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37740:285;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41527:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54466:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62081:126;;;;;;;;;;;;;:::i;:::-;;61641:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64216:495;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41946:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60640:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30453:775;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60890:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65991:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39745:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63724:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38485:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62703:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64059:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63900:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66125:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;62215:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62885:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64719:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53561:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61935:133;;;;;;;;;;;;;:::i;:::-;;66481:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40901:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32770:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61784:139;;;;;;;;;;;;;:::i;:::-;;42202:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66307:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65180:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54037:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53707:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65662:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;65360:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53840:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41277:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52714:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60766:116;60829:10;:8;:10::i;:::-;60868:6;60860:5;;:14;;;;;;;;;;;;;;;;;;60766:116;:::o;38097:324::-;38213:4;38270:25;38255:40;;;:11;:40;;;;:105;;;;38327:33;38312:48;;;:11;:48;;;;38255:105;:158;;;;38377:36;38401:11;38377:23;:36::i;:::-;38255:158;38235:178;;38097:324;;;:::o;53358:134::-;53428:13;53466;:18;;53459:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53358:134;:::o;40577:252::-;40659:7;40689:16;40697:7;40689;:16::i;:::-;40684:137;;40727:34;;;;;;;;;;;;;;40684:137;40797:15;:24;40813:7;40797:24;;;;;;;;;;;;;;;;;;;;;40777:44;;40577:252;;;:::o;40137:374::-;40225:13;40241:24;40257:7;40241:15;:24::i;:::-;40225:40;;40286:5;40280:11;;:2;:11;;;40276:61;;40313:24;;;;;;;;;;;;;;40276:61;40368:5;40352:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40378:37;40395:5;40402:12;:10;:12::i;:::-;40378:16;:37::i;:::-;40377:38;40352:63;40348:116;;;40437:27;;;;;;;;;;;;;;40348:116;40475:28;40484:2;40488:7;40497:5;40475:8;:28::i;:::-;40214:297;40137:374;;:::o;52516:190::-;52570:7;52607:12;:10;:12::i;:::-;52598:21;;:5;;;;;;;;;;:21;;;52595:64;;52641:18;;;;;;;;;;;;;;52595:64;52677:21;52670:28;;52516:190;:::o;37740:285::-;37793:7;37990:12;;37974:13;;:28;37967:35;;37740:285;:::o;41527:348::-;41665:13;:24;;;;;;;;;;;;41661:149;;41717:14;:23;;;;;;;;;;;;41707:41;;;41757:4;41763:7;41707:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41704:106;;;41797:13;;;;;;;;;;;;;;41704:106;41661:149;41839:28;41849:4;41855:2;41859:7;41839:9;:28::i;:::-;41527:348;;;:::o;54466:91::-;54518:5;54466:91;:::o;62081:126::-;62134:10;:8;:10::i;:::-;62184:15;62157:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;62081:126::o;61641:135::-;61709:10;:8;:10::i;:::-;61763:5;61732:13;:28;;;:36;;;;;;;;;;;;;;;;;;61641:135;:::o;64216:495::-;64284:7;64309:15;:13;:15::i;:::-;64335:17;:15;:17::i;:::-;64363:12;:10;:12::i;:::-;64419:15;64391:43;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:43;;;;;;;;:::i;:::-;;;64388:85;;64456:17;;;;;;;;;;;;;;64388:85;64502:52;64526:14;:20;;:27;;;;64514:9;:39;;;;:::i;:::-;64502:11;:52::i;:::-;64498:206;;;64576:13;;;;;;;;;;;;;;64498:206;64620:41;64637:12;:10;:12::i;:::-;64651:9;64620:16;:41::i;:::-;64683:9;64676:16;;64216:495;;;:::o;41946:185::-;42084:39;42101:4;42107:2;42111:7;42084:39;;;;;;;;;;;;:16;:39::i;:::-;41946:185;;;:::o;60640:118::-;60705:4;60734:16;60742:7;60734;:16::i;:::-;60727:23;;60640:118;;;:::o;30453:775::-;30514:23;30584:6;30580:598;30595:13;;30593:1;:15;30580:598;;;30633:31;30667:14;30679:1;30667:11;:14::i;:::-;30633:48;;30721:6;30703:24;;:9;:14;;;:24;;;30700:463;;30757:9;:16;;;30752:392;;30805:13;:24;;;;;;;;;;;;30802:319;;;30862:10;30878:1;30862:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30802:319;;;30959:14;:23;;;;;;;;;;;;30949:41;;;30999:4;31005:1;30949:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30945:149;;31044:10;31060:1;31044:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30945:149;30802:319;30752:392;30700:463;30614:564;30609:3;;;;;;;30580:598;;;;31199:10;31192:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30453:775;;;:::o;60890:96::-;60941:7;60973:5;;;;;;;;;;;60966:12;;60890:96;:::o;65991:126::-;66048:16;66089:14;:20;;66082:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65991:126;:::o;39745:330::-;39823:7;39852:13;:24;;;;;;;;;;;;39848:177;;39906:14;:23;;;;;;;;;;;;39896:41;;;39946:4;39952:7;39896:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39893:121;;;39996:1;39981:17;;;;39893:121;39848:177;40042:20;40054:7;40042:11;:20::i;:::-;:25;;;40035:32;;39745:330;;;;:::o;63724:168::-;63792:10;:8;:10::i;:::-;63840:14;:20;;63866:6;63840:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63724:168;:::o;38485:238::-;38563:7;38609:1;38592:19;;:5;:19;;;38588:73;;38633:28;;;;;;;;;;;;;;38588:73;38687:12;:19;38700:5;38687:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38679:36;;38672:43;;38485:238;;;:::o;62703:174::-;62776:10;:8;:10::i;:::-;62826:4;62799:13;:24;;;:31;;;;;;;;;;;;;;;;;;62865:4;;62841:13;:21;;:28;;;;;;;:::i;:::-;;62703:174;;:::o;64059:149::-;64136:10;:8;:10::i;:::-;64194:6;64159:13;:32;;:41;;;;64059:149;:::o;63900:151::-;63978:10;:8;:10::i;:::-;64037:6;64001:13;:33;;:42;;;;63900:151;:::o;66125:174::-;66205:16;66222;66263:28;66279:11;66263:15;:28::i;:::-;66256:35;;;;66125:174;;;:::o;62215:480::-;62419:10;:8;:10::i;:::-;62473:13;62442;:28;;:44;;;;62525:10;62497:13;:25;;:38;;;;62577:8;62546:13;:28;;;:39;;;;;;;;;;;;;;;;;;62627:8;62596:13;:28;;;:39;;;;;;;;;;;;;;;;;;62677:10;62646:13;:28;;;:41;;;;;;;;;;;;;;;;;;62215:480;;;;;:::o;62885:134::-;62960:10;:8;:10::i;:::-;63007:4;;62983:13;:21;;:28;;;;;;;:::i;:::-;;62885:134;;:::o;64719:453::-;64819:7;64844:15;:13;:15::i;:::-;64870:17;:15;:17::i;:::-;64898:12;:10;:12::i;:::-;64921:25;64933:12;;64921:11;:25::i;:::-;64963:52;64987:14;:20;;:27;;;;64975:9;:39;;;;:::i;:::-;64963:11;:52::i;:::-;64959:206;;;65037:13;;;;;;;;;;;;;;64959:206;65081:41;65098:12;:10;:12::i;:::-;65112:9;65081:16;:41::i;:::-;65144:9;65137:16;;64719:453;;;;;:::o;53561:138::-;53633:13;53671;:20;;53664:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53561:138;:::o;61935:133::-;61995:10;:8;:10::i;:::-;62045:15;62018:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61935:133::o;66481:152::-;66567:7;66599:21;66611:8;66599:11;:21::i;:::-;:26;;;66592:33;;66481:152;;;:::o;40901:305::-;41019:12;:10;:12::i;:::-;41007:24;;:8;:24;;;41003:67;;41053:17;;;;;;;;;;;;;;41003:67;41126:8;41081:18;:32;41100:12;:10;:12::i;:::-;41081:32;;;;;;;;;;;;;;;:42;41114:8;41081:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41179:8;41150:48;;41165:12;:10;:12::i;:::-;41150:48;;;41189:8;41150:48;;;;;;:::i;:::-;;;;;;;;40901:305;;:::o;32770:119::-;32834:10;:8;:10::i;:::-;32876:5;32857:13;:16;;:24;;;;32770:119;:::o;61784:139::-;61847:10;:8;:10::i;:::-;61897:18;61870:13;:24;;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61784:139::o;42202:491::-;42373:13;:24;;;;;;;;;;;;42369:149;;42425:14;:23;;;;;;;;;;;;42415:41;;;42465:4;42471:7;42415:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42412:106;;;42505:13;;;;;;;;;;;;;;42412:106;42369:149;42531:28;42541:4;42547:2;42551:7;42531:9;:28::i;:::-;42575:48;42598:4;42604:2;42608:7;42617:5;42575:22;:48::i;:::-;42570:115;;42645:40;;;;;;;;;;;;;;42570:115;42202:491;;;;:::o;66307:166::-;66402:4;66431:16;:24;66448:6;66431:24;;;;;;;;;;;;;;;:34;66456:8;66431:34;;;;;;;;;;;;;;;;;;;;;66424:41;;66307:166;;;;:::o;65180:172::-;65258:10;:8;:10::i;:::-;65279:17;:15;:17::i;:::-;65309:35;65326:6;65334:9;65309:16;:35::i;:::-;65180:172;;:::o;54037:421::-;54118:13;54154:16;54162:7;54154;:16::i;:::-;54149:72;;54192:29;;;;;;;;;;;;;;54149:72;54305:13;:21;;54375:25;54392:7;54375:16;:25::i;:::-;54266:183;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54234:216;;54037:421;;;:::o;53707:123::-;53763:13;53801;:21;;53794:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53707:123;:::o;65662:321::-;65741:16;65758;65792:35;65802:12;:10;:12::i;:::-;65815:11;65792:9;:35::i;:::-;65843:21;:19;:21::i;:::-;65840:135;;;65886:13;;;;;;;;;;;;;;65840:135;65935:40;65950:12;:10;:12::i;:::-;65963:11;65935:14;:40::i;:::-;65915:60;;;;65662:321;;;:::o;65360:294::-;65477:7;65505:22;:20;:22::i;:::-;65502:144;;;65549:13;;;;;;;;;;;;;;65502:144;65598:48;65614:12;:10;:12::i;:::-;65627:7;;65636:9;;65598:15;:48::i;:::-;65578:68;;65360:294;;;;;;:::o;53840:126::-;53895:13;53933;:25;;53926:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53840:126;:::o;41277:183::-;41388:4;41417:18;:25;41436:5;41417:25;;;;;;;;;;;;;;;:35;41443:8;41417:35;;;;;;;;;;;;;;;;;;;;;;;;;41410:42;;41277:183;;;;:::o;52714:270::-;52803:12;:10;:12::i;:::-;52794:21;;:5;;;;;;;;;;:21;;;52791:64;;52837:18;;;;;;;;;;;;;;52791:64;52893:7;52869:21;:31;52866:69;;;52922:13;;;;;;;;;;;;;;52866:69;52954:3;52946:21;;:30;52968:7;52946:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52714:270;;:::o;32022:222::-;32077:14;32094:12;:10;:12::i;:::-;32077:29;;32144:5;;;;;;;;;;32134:15;;:6;:15;;;;:65;;;;;32176:14;:23;;;;;;;;;;;;32166:33;;:6;:33;;;;32134:65;32117:119;;;32218:18;;;;;;;;;;;;;;32117:119;32066:178;32022:222::o;21153:157::-;21238:4;21277:25;21262:40;;;:11;:40;;;;21255:47;;21153:157;;;:::o;42947:158::-;43013:4;43052:13;;43042:7;:23;:55;;;;;43070:11;:20;43082:7;43070:20;;;;;;;;;;;:27;;;;;;;;;;;;43069:28;43042:55;43035:62;;42947:158;;;:::o;28751:98::-;28804:7;28831:10;28824:17;;28751:98;:::o;50959:196::-;51101:2;51074:15;:24;51090:7;51074:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51139:7;51135:2;51119:28;;51128:5;51119:28;;;;;;;;;;;;50959:196;;;:::o;46411:2305::-;46529:35;46567:20;46579:7;46567:11;:20::i;:::-;46529:58;;46598:14;46615:12;:10;:12::i;:::-;46598:29;;46640:22;46690:14;:23;;;;;;;;;;;;46680:33;;:6;:33;;;:78;;;;46740:13;:18;;;46730:28;;:6;:28;;;46680:78;:125;;;;46785:20;46797:7;46785:11;:20::i;:::-;46775:30;;:6;:30;;;46680:125;:186;;;;46822:44;46839:13;:18;;;46859:6;46822:16;:44::i;:::-;46680:186;46640:237;;46895:17;46890:79;;46934:35;;;;;;;;;;;;;;46890:79;47006:4;46984:26;;:13;:18;;;:26;;;46980:80;;47032:28;;;;;;;;;;;;;;46980:80;47089:1;47075:16;;:2;:16;;;47071:65;;47113:23;;;;;;;;;;;;;;47071:65;47365:49;47382:1;47386:7;47395:13;:18;;;47365:8;:49::i;:::-;47740:1;47710:12;:18;47723:4;47710:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47784:1;47756:12;:16;47769:2;47756:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47830:2;47802:11;:20;47814:7;47802:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;47892:15;47847:11;:20;47859:7;47847:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;48160:19;48192:1;48182:7;:11;48160:33;;48253:1;48212:43;;:11;:24;48224:11;48212:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;48208:445;;48437:13;;48423:11;:27;48419:219;;;48507:13;:18;;;48475:11;:24;48487:11;48475:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;48590:13;:28;;;48548:11;:24;48560:11;48548:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;48419:219;48208:445;47685:979;48700:7;48696:2;48681:27;;48690:4;48681:27;;;;;;;;;;;;46516:2200;;;46411:2305;;;:::o;31705:121::-;31781:10;31768:23;;:9;:23;;;31765:53;;31813:5;;;;;;;;;;;;;;31765:53;31705:121::o;60994:639::-;61055:13;:28;;;;;;;;;;;;61051:54;61098:7;61051:54;61125:11;61139:13;:30;;;61125:44;;61180:10;61193:13;:28;;;61180:41;;61232:10;61245:13;:32;;;61232:45;;61299:15;61292:3;:22;;:46;;;;;61336:2;61318:15;:20;61292:46;61288:338;;;61382:18;61355:13;:24;;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61288:338;;;61428:15;61422:2;:21;;:58;;;;;61466:2;61448:15;:20;:31;;;;61477:2;61472:1;:7;61448:31;61422:58;61418:208;;;61524:15;61497:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61418:208;;;61599:15;61572:13;:24;;;:42;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;61418:208;61288:338;61040:593;;;60994:639;:::o;31363:153::-;31442:13;:24;;;;;;;;;;;;31423:43;;;;;;;;:::i;:::-;;:15;:43;;;;;;;;:::i;:::-;;;31420:88;;31488:20;;;;;;;;;;;;;;31420:88;31363:153::o;34766:257::-;34830:4;34871:144;34908:18;34880:46;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;:114;;34969:13;:25;;;34880:114;;;34938:13;:28;;;34880:114;35005:9;34871:8;:144::i;:::-;34859:9;:156;34852:163;;34766:257;;;:::o;55920:535::-;56036:6;56032:405;56052:14;:20;;:27;;;;56048:1;:31;56032:405;;;56106:12;56119:16;56139:14;:20;;56160:1;56139:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;56268:6;56301:9;56190:147;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56139:217;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56105:251;;;;56379:7;56375:46;;56416:5;;;;;;;;;;;;;;56375:46;56086:351;;56081:3;;;;;;;56032:405;;;;55920:535;;:::o;29310:1098::-;29381:21;;:::i;:::-;29420:12;29435:7;29420:22;;29491:13;;29484:4;:20;29480:861;;;29525:31;29559:11;:17;29571:4;29559:17;;;;;;;;;;;29525:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29600:9;:16;;;29595:731;;29671:1;29645:28;;:9;:14;;;:28;;;29641:101;;29709:9;29702:16;;;;;;29641:101;30046:261;30053:4;30046:261;;;30086:6;;;;;;;;30131:11;:17;30143:4;30131:17;;;;;;;;;;;30119:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30205:1;30179:28;;:9;:14;;;:28;;;30175:109;;30247:9;30240:16;;;;;;30175:109;30046:261;;;29595:731;29506:835;29480:861;30369:31;;;;;;;;;;;;;;29310:1098;;;;:::o;56463:697::-;56541:16;56558;56617:8;56649:6;56644:95;56665:14;:20;;:27;;;;56661:1;:31;56644:95;;;56718:5;;;;;;;56694:3;;;;;;;56644:95;;;;56753:22;56792:3;56778:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56753:43;;56811:23;56851:3;56837:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56811:44;;56876:1;56870:7;;56897:6;56892:214;56913:14;:20;;:27;;;;56909:1;:31;56892:214;;;56979:14;:20;;57000:1;56979:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56966:5;56972:3;56966:10;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;;57037:15;:28;57053:11;57037:28;;;;;;;;;;;:53;57066:14;:20;;57087:1;57066:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57037:53;;;;;;;;;;;;;;;;57021:6;57028:5;;;;;;57021:13;;;;;;;;:::i;:::-;;;;;;;:69;;;;;56942:3;;;;;;;56892:214;;;;57128:5;57134:6;57120:21;;;;;;;56463:697;;;:::o;32252:510::-;32341:14;32358:12;:10;:12::i;:::-;32341:29;;32381:9;32415:6;32406:15;;:5;;;;;;;;;;:15;;;:75;;;;32466:15;32438:43;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:43;;;;;;;;:::i;:::-;;;32406:75;32381:100;;32567:4;32563:117;;32593:87;32612:12;;32593:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32626:13;:16;;;32671:6;32654:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;32644:35;;;;;;32593:18;:87::i;:::-;32586:94;;32563:117;32711:4;32707:47;;32737:17;;;;;;;;;;;;;;32707:47;32330:432;;32252:510;;:::o;51720:788::-;51874:4;51895:15;:2;:13;;;:15::i;:::-;51891:610;;;51947:2;51931:36;;;51968:12;:10;:12::i;:::-;51982:4;51988:7;51997:5;51931:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51927:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52193:1;52176:6;:13;:18;52172:259;;52226:40;;;;;;;;;;;;;;52172:259;52381:6;52375:13;52366:6;52362:2;52358:15;52351:38;51927:519;52063:45;;;52053:55;;;:6;:55;;;;52046:62;;;;;51891:610;52485:4;52478:11;;51720:788;;;;;;;:::o;4545:727::-;4600:13;4831:5;4826:1;:10;4822:53;;4853:10;;;;;;;;;;;;;;;;;;;;;4822:53;4885:12;4900:5;4885:20;;4916:14;4941:78;4953:4;4948:1;:9;4941:78;;4974:8;;;;;:::i;:::-;;;;5005:2;4997:10;;;;;:::i;:::-;;;4941:78;;;5029:19;5061:6;5051:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5029:39;;5079:154;5091:5;5086:1;:10;5079:154;;5123:1;5113:11;;;;;:::i;:::-;;;5190:2;5182:5;:10;;;;:::i;:::-;5169:2;:24;;;;:::i;:::-;5156:39;;5139:6;5146;5139:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5219:2;5210:11;;;;;:::i;:::-;;;5079:154;;;5257:6;5243:21;;;;;4545:727;;;;:::o;31834:180::-;31932:20;31944:7;31932:11;:20::i;:::-;:25;;;31923:34;;:5;:34;;;31919:87;;31979:27;;;;;;;;;;;;;;31919:87;31834:180;;:::o;35262:220::-;35320:4;35398:1;35362:13;:32;;;:37;;:98;;;;;35451:9;35416:13;:32;;;:44;35362:98;35342:118;;35262:220;:::o;57168:652::-;57255:16;57272;57306:29;57316:6;57323:11;57306:9;:29::i;:::-;57349:22;57372:23;57399:28;57415:11;57399:15;:28::i;:::-;57348:79;;;;57438:18;57444:11;57438:5;:18::i;:::-;57467:37;57485:6;57492:11;57467:17;:37::i;:::-;57544:6;57540:230;57560:5;:12;57556:1;:16;57540:230;;;57598:156;57645:11;57683:5;57689:1;57683:8;;;;;;;;:::i;:::-;;;;;;;;57718:6;57725:1;57718:9;;;;;;;;:::i;:::-;;;;;;;;57598:20;:156::i;:::-;57574:3;;;;;;;57540:230;;;;57799:5;57805:6;57791:21;;;;;;57168:652;;;;;:::o;35031:223::-;35090:4;35169:1;35132:13;:33;;;:38;;:100;;;;;35223:9;35187:13;:33;;;:45;35132:100;35112:120;;35031:223;:::o;58247:928::-;58371:7;58431:1;58413:7;;:14;;:19;:70;;;;;58467:9;;:16;;58449:7;;:14;;:34;;58413:70;58396:111;;;58502:5;;;;;;;;;;;;;;58396:111;58520:18;58541:13;;58520:34;;58565:19;58575:6;58582:1;58565:9;:19::i;:::-;58675:10;58620:15;:27;58636:10;58620:27;;;;;;;;;;;:52;58648:14;:23;;;;;;;;;;;;58620:52;;;;;;;;;;;;;;;:65;;;;58704:6;58700:429;58720:7;;:14;;58716:1;:18;58700:429;;;58763:32;58771:7;;58779:1;58771:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58782:9;;58792:1;58782:12;;;;;;;:::i;:::-;;;;;;;;58763:7;:32::i;:::-;58760:78;;;58825:13;;;;;;;;;;;;;;58760:78;58877:7;;58885:1;58877:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58870:31;;;58902:9;;58912:1;58902:12;;;;;;;:::i;:::-;;;;;;;;58870:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58860:55;;:6;:55;;;58857:115;;58945:27;;;;;;;;;;;;;;58857:115;59033:9;;59043:1;59033:12;;;;;;;:::i;:::-;;;;;;;;58991:15;:27;59007:10;58991:27;;;;;;;;;;;:39;59019:7;;59027:1;59019:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58991:39;;;;;;;;;;;;;;;:54;;;;59109:4;59064:16;:28;59081:7;;59089:1;59081:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59064:28;;;;;;;;;;;;;;;:42;59093:9;;59103:1;59093:12;;;;;;;:::i;:::-;;;;;;;;59064:42;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;58736:3;;;;;;;58700:429;;;;59157:10;59150:17;;;58247:928;;;;;;;:::o;34017:205::-;34073:9;34109:1;34104;:6;34100:47;;34134:1;34127:8;;;;34100:47;34165:1;34161;:5;;;;:::i;:::-;34157:9;;34193:1;34188;34184;:5;;;;:::i;:::-;:10;34177:18;;;;:::i;:::-;;34017:205;;;;;:::o;2053:190::-;2178:4;2231;2202:25;2215:5;2222:4;2202:12;:25::i;:::-;:33;2195:40;;2053:190;;;;;:::o;11070:326::-;11130:4;11387:1;11365:7;:19;;;:23;11358:30;;11070:326;;;:::o;48945:1896::-;49015:35;49053:20;49065:7;49053:11;:20::i;:::-;49015:58;;49138:49;49155:1;49159:7;49168:13;:18;;;49138:8;:49::i;:::-;49527:1;49483:12;:32;49496:13;:18;;;49483:32;;;;;;;;;;;;;;;:40;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49592:1;49543:12;:32;49556:13;:18;;;49543:32;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49720:13;:18;;;49692:11;:20;49704:7;49692:20;;;;;;;;;;;:25;;;:46;;;;;;;;;;;;;;;;;;49798:15;49753:11;:20;49765:7;49753:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;49859:4;49829:11;:20;49841:7;49829:20;;;;;;;;;;;:27;;;:34;;;;;;;;;;;;;;;;;;50111:19;50143:1;50133:7;:11;50111:33;;50204:1;50163:43;;:11;:24;50175:11;50163:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50159:445;;50388:13;;50374:11;:27;50370:219;;;50458:13;:18;;;50426:11;:24;50438:11;50426:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;50541:13;:28;;;50499:11;:24;50511:11;50499:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;50370:219;50159:445;49458:1157;50673:7;50669:1;50632:49;;50641:13;:18;;;50632:49;;;;;;;;;;;;50808:12;;:14;;;;;;;;;;;;;49004:1837;48945:1896;:::o;45591:566::-;45708:6;45703:436;45724:14;:20;;:27;;;;45720:1;:31;45703:436;;;45778:12;45791:16;45811:14;:20;;45832:1;45811:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:28;;45938:15;:25;45954:8;45938:25;;;;;;;;;;;:50;45964:14;:20;;45985:1;45964:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45938:50;;;;;;;;;;;;;;;;46015:3;45862:157;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45811:227;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45777:261;;;;46061:7;46057:66;;46098:25;;;;;;;;;;;;;;46057:66;45758:381;;45753:3;;;;;;;45703:436;;;;45591:566;;:::o;57828:411::-;57945:24;57953:6;57960:8;57945:7;:24::i;:::-;57941:66;;57991:16;;;;;;;;;;;;;;57941:66;58044:6;58037:27;;;58065:8;58037:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58021:53;;:12;:10;:12::i;:::-;:53;;;58018:105;;58096:27;;;;;;;;;;;;;;58018:105;58143:16;:24;58160:6;58143:24;;;;;;;;;;;;;;;:34;58168:8;58143:34;;;;;;;;;;;;58136:41;;;;;;;;;;;58195:15;:28;58211:11;58195:28;;;;;;;;;;;:36;58224:6;58195:36;;;;;;;;;;;;;;;58188:43;;;57828:411;;;:::o;43113:104::-;43182:27;43192:2;43196:8;43182:27;;;;;;;;;;;;:9;:27::i;:::-;43113:104;;:::o;59183:280::-;59265:4;59291:13;:24;;;;;;;;;;;;59287:168;;;59337:16;:24;59354:6;59337:24;;;;;;;;;;;;;;;:34;59362:8;59337:34;;;;;;;;;;;;;;;;;;;;;59330:41;;;;59287:168;59414:14;:23;;;;;;;;;;;;59407:38;;;59446:8;59407:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59400:55;;59183:280;;;;;:::o;2605:675::-;2688:7;2708:20;2731:4;2708:27;;2751:9;2746:497;2770:5;:12;2766:1;:16;2746:497;;;2804:20;2827:5;2833:1;2827:8;;;;;;;;:::i;:::-;;;;;;;;2804:31;;2870:12;2854;:28;2850:382;;2997:42;3012:12;3026;2997:14;:42::i;:::-;2982:57;;2850:382;;;3174:42;3189:12;3203;3174:14;:42::i;:::-;3159:57;;2850:382;2789:454;2784:3;;;;;:::i;:::-;;;;2746:497;;;;3260:12;3253:19;;;2605:675;;;;:::o;43580:163::-;43703:32;43709:2;43713:8;43723:5;43730:4;43703:5;:32::i;:::-;43580:163;;;:::o;3288:224::-;3356:13;3419:1;3413:4;3406:15;3448:1;3442:4;3435:15;3489:4;3483;3473:21;3464:30;;3288:224;;;;:::o;44002:1523::-;44141:20;44164:13;;44141:36;;44192:14;:12;:14::i;:::-;44188:61;;44228:21;;;;;;;;;;;;;;44188:61;44278:1;44264:16;;:2;:16;;;44260:61;;44302:19;;;;;;;;;;;;;;44260:61;44348:1;44336:8;:13;44332:57;;44371:18;;;;;;;;;;;;;;44332:57;44701:8;44666:12;:16;44679:2;44666:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44765:8;44725:12;:16;44738:2;44725:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44820:18;44792:46;;;;;;;;:::i;:::-;;:13;:24;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;44789:166;;44946:8;44898:12;:16;44911:2;44898:16;;;;;;;;;;;;;;;:38;;;;;;;;;;;;:57;44857:12;:16;44870:2;44857:16;;;;;;;;;;;;;;;:38;;;:98;;;;;;;;;;;;;;;;;;44789:166;45005:2;44972:11;:25;44984:12;44972:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45072:15;45022:11;:25;45034:12;45022:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;45105:20;45128:12;45105:35;;45160:9;45155:307;45175:8;45171:1;:12;45155:307;;;45239:12;45235:2;45214:38;;45231:1;45214:38;;;;;;;;;;;;45275:4;:68;;;;;45284:59;45315:1;45319:2;45323:12;45337:5;45284:22;:59::i;:::-;45283:60;45275:68;45271:142;;;45373:40;;;;;;;;;;;;;;45271:142;45432:14;;;;;;;45185:3;;;;;;;45155:307;;;;45494:12;45478:13;:28;;;;44641:877;44130:1395;44002:1523;;;;:::o;36181:280::-;36237:4;36279:13;:24;;;;;;;;;;;;:160;;;;36354:5;36326:33;;:13;:24;;;;;;;;;;;;:33;;;:98;;;;;36411:13;;36380;:28;;;;;;;;;;;;:44;;;36326:98;36279:160;36259:180;;36181:280;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:86::-;6285:7;6325:4;6318:5;6314:16;6303:27;;6250:86;;;:::o;6342:112::-;6425:22;6441:5;6425:22;:::i;:::-;6420:3;6413:35;6342:112;;:::o;6460:214::-;6549:4;6587:2;6576:9;6572:18;6564:26;;6600:67;6664:1;6653:9;6649:17;6640:6;6600:67;:::i;:::-;6460:214;;;;:::o;6680:116::-;6750:21;6765:5;6750:21;:::i;:::-;6743:5;6740:32;6730:60;;6786:1;6783;6776:12;6730:60;6680:116;:::o;6802:133::-;6845:5;6883:6;6870:20;6861:29;;6899:30;6923:5;6899:30;:::i;:::-;6802:133;;;;:::o;6941:323::-;6997:6;7046:2;7034:9;7025:7;7021:23;7017:32;7014:119;;;7052:79;;:::i;:::-;7014:119;7172:1;7197:50;7239:7;7230:6;7219:9;7215:22;7197:50;:::i;:::-;7187:60;;7143:114;6941:323;;;;:::o;7270:114::-;7337:6;7371:5;7365:12;7355:22;;7270:114;;;:::o;7390:184::-;7489:11;7523:6;7518:3;7511:19;7563:4;7558:3;7554:14;7539:29;;7390:184;;;;:::o;7580:132::-;7647:4;7670:3;7662:11;;7700:4;7695:3;7691:14;7683:22;;7580:132;;;:::o;7718:108::-;7795:24;7813:5;7795:24;:::i;:::-;7790:3;7783:37;7718:108;;:::o;7832:179::-;7901:10;7922:46;7964:3;7956:6;7922:46;:::i;:::-;8000:4;7995:3;7991:14;7977:28;;7832:179;;;;:::o;8017:113::-;8087:4;8119;8114:3;8110:14;8102:22;;8017:113;;;:::o;8166:732::-;8285:3;8314:54;8362:5;8314:54;:::i;:::-;8384:86;8463:6;8458:3;8384:86;:::i;:::-;8377:93;;8494:56;8544:5;8494:56;:::i;:::-;8573:7;8604:1;8589:284;8614:6;8611:1;8608:13;8589:284;;;8690:6;8684:13;8717:63;8776:3;8761:13;8717:63;:::i;:::-;8710:70;;8803:60;8856:6;8803:60;:::i;:::-;8793:70;;8649:224;8636:1;8633;8629:9;8624:14;;8589:284;;;8593:14;8889:3;8882:10;;8290:608;;;8166:732;;;;:::o;8904:373::-;9047:4;9085:2;9074:9;9070:18;9062:26;;9134:9;9128:4;9124:20;9120:1;9109:9;9105:17;9098:47;9162:108;9265:4;9256:6;9162:108;:::i;:::-;9154:116;;8904:373;;;;:::o;9283:114::-;9350:6;9384:5;9378:12;9368:22;;9283:114;;;:::o;9403:184::-;9502:11;9536:6;9531:3;9524:19;9576:4;9571:3;9567:14;9552:29;;9403:184;;;;:::o;9593:132::-;9660:4;9683:3;9675:11;;9713:4;9708:3;9704:14;9696:22;;9593:132;;;:::o;9731:108::-;9808:24;9826:5;9808:24;:::i;:::-;9803:3;9796:37;9731:108;;:::o;9845:179::-;9914:10;9935:46;9977:3;9969:6;9935:46;:::i;:::-;10013:4;10008:3;10004:14;9990:28;;9845:179;;;;:::o;10030:113::-;10100:4;10132;10127:3;10123:14;10115:22;;10030:113;;;:::o;10179:732::-;10298:3;10327:54;10375:5;10327:54;:::i;:::-;10397:86;10476:6;10471:3;10397:86;:::i;:::-;10390:93;;10507:56;10557:5;10507:56;:::i;:::-;10586:7;10617:1;10602:284;10627:6;10624:1;10621:13;10602:284;;;10703:6;10697:13;10730:63;10789:3;10774:13;10730:63;:::i;:::-;10723:70;;10816:60;10869:6;10816:60;:::i;:::-;10806:70;;10662:224;10649:1;10646;10642:9;10637:14;;10602:284;;;10606:14;10902:3;10895:10;;10303:608;;;10179:732;;;;:::o;10917:373::-;11060:4;11098:2;11087:9;11083:18;11075:26;;11147:9;11141:4;11137:20;11133:1;11122:9;11118:17;11111:47;11175:108;11278:4;11269:6;11175:108;:::i;:::-;11167:116;;10917:373;;;;:::o;11296:117::-;11405:1;11402;11395:12;11419:117;11528:1;11525;11518:12;11542:117;11651:1;11648;11641:12;11679:553;11737:8;11747:6;11797:3;11790:4;11782:6;11778:17;11774:27;11764:122;;11805:79;;:::i;:::-;11764:122;11918:6;11905:20;11895:30;;11948:18;11940:6;11937:30;11934:117;;;11970:79;;:::i;:::-;11934:117;12084:4;12076:6;12072:17;12060:29;;12138:3;12130:4;12122:6;12118:17;12108:8;12104:32;12101:41;12098:128;;;12145:79;;:::i;:::-;12098:128;11679:553;;;;;:::o;12238:529::-;12309:6;12317;12366:2;12354:9;12345:7;12341:23;12337:32;12334:119;;;12372:79;;:::i;:::-;12334:119;12520:1;12509:9;12505:17;12492:31;12550:18;12542:6;12539:30;12536:117;;;12572:79;;:::i;:::-;12536:117;12685:65;12742:7;12733:6;12722:9;12718:22;12685:65;:::i;:::-;12667:83;;;;12463:297;12238:529;;;;;:::o;12773:634::-;12994:4;13032:2;13021:9;13017:18;13009:26;;13081:9;13075:4;13071:20;13067:1;13056:9;13052:17;13045:47;13109:108;13212:4;13203:6;13109:108;:::i;:::-;13101:116;;13264:9;13258:4;13254:20;13249:2;13238:9;13234:18;13227:48;13292:108;13395:4;13386:6;13292:108;:::i;:::-;13284:116;;12773:634;;;;;:::o;13413:118::-;13484:22;13500:5;13484:22;:::i;:::-;13477:5;13474:33;13464:61;;13521:1;13518;13511:12;13464:61;13413:118;:::o;13537:135::-;13581:5;13619:6;13606:20;13597:29;;13635:31;13660:5;13635:31;:::i;:::-;13537:135;;;;:::o;13678:101::-;13714:7;13754:18;13747:5;13743:30;13732:41;;13678:101;;;:::o;13785:120::-;13857:23;13874:5;13857:23;:::i;:::-;13850:5;13847:34;13837:62;;13895:1;13892;13885:12;13837:62;13785:120;:::o;13911:137::-;13956:5;13994:6;13981:20;13972:29;;14010:32;14036:5;14010:32;:::i;:::-;13911:137;;;;:::o;14054:901::-;14144:6;14152;14160;14168;14176;14225:3;14213:9;14204:7;14200:23;14196:33;14193:120;;;14232:79;;:::i;:::-;14193:120;14352:1;14377:53;14422:7;14413:6;14402:9;14398:22;14377:53;:::i;:::-;14367:63;;14323:117;14479:2;14505:53;14550:7;14541:6;14530:9;14526:22;14505:53;:::i;:::-;14495:63;;14450:118;14607:2;14633:51;14676:7;14667:6;14656:9;14652:22;14633:51;:::i;:::-;14623:61;;14578:116;14733:2;14759:51;14802:7;14793:6;14782:9;14778:22;14759:51;:::i;:::-;14749:61;;14704:116;14859:3;14886:52;14930:7;14921:6;14910:9;14906:22;14886:52;:::i;:::-;14876:62;;14830:118;14054:901;;;;;;;;:::o;14978:568::-;15051:8;15061:6;15111:3;15104:4;15096:6;15092:17;15088:27;15078:122;;15119:79;;:::i;:::-;15078:122;15232:6;15219:20;15209:30;;15262:18;15254:6;15251:30;15248:117;;;15284:79;;:::i;:::-;15248:117;15398:4;15390:6;15386:17;15374:29;;15452:3;15444:4;15436:6;15432:17;15422:8;15418:32;15415:41;15412:128;;;15459:79;;:::i;:::-;15412:128;14978:568;;;;;:::o;15552:704::-;15647:6;15655;15663;15712:2;15700:9;15691:7;15687:23;15683:32;15680:119;;;15718:79;;:::i;:::-;15680:119;15838:1;15863:53;15908:7;15899:6;15888:9;15884:22;15863:53;:::i;:::-;15853:63;;15809:117;15993:2;15982:9;15978:18;15965:32;16024:18;16016:6;16013:30;16010:117;;;16046:79;;:::i;:::-;16010:117;16159:80;16231:7;16222:6;16211:9;16207:22;16159:80;:::i;:::-;16141:98;;;;15936:313;15552:704;;;;;:::o;16262:468::-;16327:6;16335;16384:2;16372:9;16363:7;16359:23;16355:32;16352:119;;;16390:79;;:::i;:::-;16352:119;16510:1;16535:53;16580:7;16571:6;16560:9;16556:22;16535:53;:::i;:::-;16525:63;;16481:117;16637:2;16663:50;16705:7;16696:6;16685:9;16681:22;16663:50;:::i;:::-;16653:60;;16608:115;16262:468;;;;;:::o;16736:77::-;16773:7;16802:5;16791:16;;16736:77;;;:::o;16819:122::-;16892:24;16910:5;16892:24;:::i;:::-;16885:5;16882:35;16872:63;;16931:1;16928;16921:12;16872:63;16819:122;:::o;16947:139::-;16993:5;17031:6;17018:20;17009:29;;17047:33;17074:5;17047:33;:::i;:::-;16947:139;;;;:::o;17092:329::-;17151:6;17200:2;17188:9;17179:7;17175:23;17171:32;17168:119;;;17206:79;;:::i;:::-;17168:119;17326:1;17351:53;17396:7;17387:6;17376:9;17372:22;17351:53;:::i;:::-;17341:63;;17297:117;17092:329;;;;:::o;17427:117::-;17536:1;17533;17526:12;17550:180;17598:77;17595:1;17588:88;17695:4;17692:1;17685:15;17719:4;17716:1;17709:15;17736:281;17819:27;17841:4;17819:27;:::i;:::-;17811:6;17807:40;17949:6;17937:10;17934:22;17913:18;17901:10;17898:34;17895:62;17892:88;;;17960:18;;:::i;:::-;17892:88;18000:10;17996:2;17989:22;17779:238;17736:281;;:::o;18023:129::-;18057:6;18084:20;;:::i;:::-;18074:30;;18113:33;18141:4;18133:6;18113:33;:::i;:::-;18023:129;;;:::o;18158:307::-;18219:4;18309:18;18301:6;18298:30;18295:56;;;18331:18;;:::i;:::-;18295:56;18369:29;18391:6;18369:29;:::i;:::-;18361:37;;18453:4;18447;18443:15;18435:23;;18158:307;;;:::o;18471:154::-;18555:6;18550:3;18545;18532:30;18617:1;18608:6;18603:3;18599:16;18592:27;18471:154;;;:::o;18631:410::-;18708:5;18733:65;18749:48;18790:6;18749:48;:::i;:::-;18733:65;:::i;:::-;18724:74;;18821:6;18814:5;18807:21;18859:4;18852:5;18848:16;18897:3;18888:6;18883:3;18879:16;18876:25;18873:112;;;18904:79;;:::i;:::-;18873:112;18994:41;19028:6;19023:3;19018;18994:41;:::i;:::-;18714:327;18631:410;;;;;:::o;19060:338::-;19115:5;19164:3;19157:4;19149:6;19145:17;19141:27;19131:122;;19172:79;;:::i;:::-;19131:122;19289:6;19276:20;19314:78;19388:3;19380:6;19373:4;19365:6;19361:17;19314:78;:::i;:::-;19305:87;;19121:277;19060:338;;;;:::o;19404:943::-;19499:6;19507;19515;19523;19572:3;19560:9;19551:7;19547:23;19543:33;19540:120;;;19579:79;;:::i;:::-;19540:120;19699:1;19724:53;19769:7;19760:6;19749:9;19745:22;19724:53;:::i;:::-;19714:63;;19670:117;19826:2;19852:53;19897:7;19888:6;19877:9;19873:22;19852:53;:::i;:::-;19842:63;;19797:118;19954:2;19980:53;20025:7;20016:6;20005:9;20001:22;19980:53;:::i;:::-;19970:63;;19925:118;20110:2;20099:9;20095:18;20082:32;20141:18;20133:6;20130:30;20127:117;;;20163:79;;:::i;:::-;20127:117;20268:62;20322:7;20313:6;20302:9;20298:22;20268:62;:::i;:::-;20258:72;;20053:287;19404:943;;;;;;;:::o;20370:568::-;20443:8;20453:6;20503:3;20496:4;20488:6;20484:17;20480:27;20470:122;;20511:79;;:::i;:::-;20470:122;20624:6;20611:20;20601:30;;20654:18;20646:6;20643:30;20640:117;;;20676:79;;:::i;:::-;20640:117;20790:4;20782:6;20778:17;20766:29;;20844:3;20836:4;20828:6;20824:17;20814:8;20810:32;20807:41;20804:128;;;20851:79;;:::i;:::-;20804:128;20370:568;;;;;:::o;20961:::-;21034:8;21044:6;21094:3;21087:4;21079:6;21075:17;21071:27;21061:122;;21102:79;;:::i;:::-;21061:122;21215:6;21202:20;21192:30;;21245:18;21237:6;21234:30;21231:117;;;21267:79;;:::i;:::-;21231:117;21381:4;21373:6;21369:17;21357:29;;21435:3;21427:4;21419:6;21415:17;21405:8;21401:32;21398:41;21395:128;;;21442:79;;:::i;:::-;21395:128;20961:568;;;;;:::o;21535:934::-;21657:6;21665;21673;21681;21730:2;21718:9;21709:7;21705:23;21701:32;21698:119;;;21736:79;;:::i;:::-;21698:119;21884:1;21873:9;21869:17;21856:31;21914:18;21906:6;21903:30;21900:117;;;21936:79;;:::i;:::-;21900:117;22049:80;22121:7;22112:6;22101:9;22097:22;22049:80;:::i;:::-;22031:98;;;;21827:312;22206:2;22195:9;22191:18;22178:32;22237:18;22229:6;22226:30;22223:117;;;22259:79;;:::i;:::-;22223:117;22372:80;22444:7;22435:6;22424:9;22420:22;22372:80;:::i;:::-;22354:98;;;;22149:313;21535:934;;;;;;;:::o;22475:474::-;22543:6;22551;22600:2;22588:9;22579:7;22575:23;22571:32;22568:119;;;22606:79;;:::i;:::-;22568:119;22726:1;22751:53;22796:7;22787:6;22776:9;22772:22;22751:53;:::i;:::-;22741:63;;22697:117;22853:2;22879:53;22924:7;22915:6;22904:9;22900:22;22879:53;:::i;:::-;22869:63;;22824:118;22475:474;;;;;:::o;22955:180::-;23003:77;23000:1;22993:88;23100:4;23097:1;23090:15;23124:4;23121:1;23114:15;23141:320;23185:6;23222:1;23216:4;23212:12;23202:22;;23269:1;23263:4;23259:12;23290:18;23280:81;;23346:4;23338:6;23334:17;23324:27;;23280:81;23408:2;23400:6;23397:14;23377:18;23374:38;23371:84;;23427:18;;:::i;:::-;23371:84;23192:269;23141:320;;;:::o;23467:332::-;23588:4;23626:2;23615:9;23611:18;23603:26;;23639:71;23707:1;23696:9;23692:17;23683:6;23639:71;:::i;:::-;23720:72;23788:2;23777:9;23773:18;23764:6;23720:72;:::i;:::-;23467:332;;;;;:::o;23805:137::-;23859:5;23890:6;23884:13;23875:22;;23906:30;23930:5;23906:30;:::i;:::-;23805:137;;;;:::o;23948:345::-;24015:6;24064:2;24052:9;24043:7;24039:23;24035:32;24032:119;;;24070:79;;:::i;:::-;24032:119;24190:1;24215:61;24268:7;24259:6;24248:9;24244:22;24215:61;:::i;:::-;24205:71;;24161:125;23948:345;;;;:::o;24299:180::-;24347:77;24344:1;24337:88;24444:4;24441:1;24434:15;24468:4;24465:1;24458:15;24485:180;24533:77;24530:1;24523:88;24630:4;24627:1;24620:15;24654:4;24651:1;24644:15;24671:348;24711:7;24734:20;24752:1;24734:20;:::i;:::-;24729:25;;24768:20;24786:1;24768:20;:::i;:::-;24763:25;;24956:1;24888:66;24884:74;24881:1;24878:81;24873:1;24866:9;24859:17;24855:105;24852:131;;;24963:18;;:::i;:::-;24852:131;25011:1;25008;25004:9;24993:20;;24671:348;;;;:::o;25025:148::-;25127:11;25164:3;25149:18;;25025:148;;;;:::o;25179:141::-;25228:4;25251:3;25243:11;;25274:3;25271:1;25264:14;25308:4;25305:1;25295:18;25287:26;;25179:141;;;:::o;25350:845::-;25453:3;25490:5;25484:12;25519:36;25545:9;25519:36;:::i;:::-;25571:89;25653:6;25648:3;25571:89;:::i;:::-;25564:96;;25691:1;25680:9;25676:17;25707:1;25702:137;;;;25853:1;25848:341;;;;25669:520;;25702:137;25786:4;25782:9;25771;25767:25;25762:3;25755:38;25822:6;25817:3;25813:16;25806:23;;25702:137;;25848:341;25915:38;25947:5;25915:38;:::i;:::-;25975:1;25989:154;26003:6;26000:1;25997:13;25989:154;;;26077:7;26071:14;26067:1;26062:3;26058:11;26051:35;26127:1;26118:7;26114:15;26103:26;;26025:4;26022:1;26018:12;26013:17;;25989:154;;;26172:6;26167:3;26163:16;26156:23;;25855:334;;25669:520;;25457:738;;25350:845;;;;:::o;26201:151::-;26341:3;26337:1;26329:6;26325:14;26318:27;26201:151;:::o;26358:400::-;26518:3;26539:84;26621:1;26616:3;26539:84;:::i;:::-;26532:91;;26632:93;26721:3;26632:93;:::i;:::-;26750:1;26745:3;26741:11;26734:18;;26358:400;;;:::o;26764:377::-;26870:3;26898:39;26931:5;26898:39;:::i;:::-;26953:89;27035:6;27030:3;26953:89;:::i;:::-;26946:96;;27051:52;27096:6;27091:3;27084:4;27077:5;27073:16;27051:52;:::i;:::-;27128:6;27123:3;27119:16;27112:23;;26874:267;26764:377;;;;:::o;27147:155::-;27287:7;27283:1;27275:6;27271:14;27264:31;27147:155;:::o;27308:400::-;27468:3;27489:84;27571:1;27566:3;27489:84;:::i;:::-;27482:91;;27582:93;27671:3;27582:93;:::i;:::-;27700:1;27695:3;27691:11;27684:18;;27308:400;;;:::o;27714:961::-;28093:3;28115:92;28203:3;28194:6;28115:92;:::i;:::-;28108:99;;28224:148;28368:3;28224:148;:::i;:::-;28217:155;;28389:95;28480:3;28471:6;28389:95;:::i;:::-;28382:102;;28501:148;28645:3;28501:148;:::i;:::-;28494:155;;28666:3;28659:10;;27714:961;;;;;:::o;28681:180::-;28729:77;28726:1;28719:88;28826:4;28823:1;28816:15;28850:4;28847:1;28840:15;28867:98;28918:6;28952:5;28946:12;28936:22;;28867:98;;;:::o;28971:147::-;29072:11;29109:3;29094:18;;28971:147;;;;:::o;29124:373::-;29228:3;29256:38;29288:5;29256:38;:::i;:::-;29310:88;29391:6;29386:3;29310:88;:::i;:::-;29303:95;;29407:52;29452:6;29447:3;29440:4;29433:5;29429:16;29407:52;:::i;:::-;29484:6;29479:3;29475:16;29468:23;;29232:265;29124:373;;;;:::o;29503:271::-;29633:3;29655:93;29744:3;29735:6;29655:93;:::i;:::-;29648:100;;29765:3;29758:10;;29503:271;;;;:::o;29780:94::-;29813:8;29861:5;29857:2;29853:14;29832:35;;29780:94;;;:::o;29880:::-;29919:7;29948:20;29962:5;29948:20;:::i;:::-;29937:31;;29880:94;;;:::o;29980:100::-;30019:7;30048:26;30068:5;30048:26;:::i;:::-;30037:37;;29980:100;;;:::o;30086:157::-;30191:45;30211:24;30229:5;30211:24;:::i;:::-;30191:45;:::i;:::-;30186:3;30179:58;30086:157;;:::o;30249:256::-;30361:3;30376:75;30447:3;30438:6;30376:75;:::i;:::-;30476:2;30471:3;30467:12;30460:19;;30496:3;30489:10;;30249:256;;;;:::o;30511:168::-;30594:11;30628:6;30623:3;30616:19;30668:4;30663:3;30659:14;30644:29;;30511:168;;;;:::o;30685:360::-;30771:3;30799:38;30831:5;30799:38;:::i;:::-;30853:70;30916:6;30911:3;30853:70;:::i;:::-;30846:77;;30932:52;30977:6;30972:3;30965:4;30958:5;30954:16;30932:52;:::i;:::-;31009:29;31031:6;31009:29;:::i;:::-;31004:3;31000:39;30993:46;;30775:270;30685:360;;;;:::o;31051:640::-;31246:4;31284:3;31273:9;31269:19;31261:27;;31298:71;31366:1;31355:9;31351:17;31342:6;31298:71;:::i;:::-;31379:72;31447:2;31436:9;31432:18;31423:6;31379:72;:::i;:::-;31461;31529:2;31518:9;31514:18;31505:6;31461:72;:::i;:::-;31580:9;31574:4;31570:20;31565:2;31554:9;31550:18;31543:48;31608:76;31679:4;31670:6;31608:76;:::i;:::-;31600:84;;31051:640;;;;;;;:::o;31697:141::-;31753:5;31784:6;31778:13;31769:22;;31800:32;31826:5;31800:32;:::i;:::-;31697:141;;;;:::o;31844:349::-;31913:6;31962:2;31950:9;31941:7;31937:23;31933:32;31930:119;;;31968:79;;:::i;:::-;31930:119;32088:1;32113:63;32168:7;32159:6;32148:9;32144:22;32113:63;:::i;:::-;32103:73;;32059:127;31844:349;;;;:::o;32199:233::-;32238:3;32261:24;32279:5;32261:24;:::i;:::-;32252:33;;32307:66;32300:5;32297:77;32294:103;;32377:18;;:::i;:::-;32294:103;32424:1;32417:5;32413:13;32406:20;;32199:233;;;:::o;32438:180::-;32486:77;32483:1;32476:88;32583:4;32580:1;32573:15;32607:4;32604:1;32597:15;32624:185;32664:1;32681:20;32699:1;32681:20;:::i;:::-;32676:25;;32715:20;32733:1;32715:20;:::i;:::-;32710:25;;32754:1;32744:35;;32759:18;;:::i;:::-;32744:35;32801:1;32798;32794:9;32789:14;;32624:185;;;;:::o;32815:191::-;32855:4;32875:20;32893:1;32875:20;:::i;:::-;32870:25;;32909:20;32927:1;32909:20;:::i;:::-;32904:25;;32948:1;32945;32942:8;32939:34;;;32953:18;;:::i;:::-;32939:34;32998:1;32995;32991:9;32983:17;;32815:191;;;;:::o;33012:176::-;33044:1;33061:20;33079:1;33061:20;:::i;:::-;33056:25;;33095:20;33113:1;33095:20;:::i;:::-;33090:25;;33134:1;33124:35;;33139:18;;:::i;:::-;33124:35;33180:1;33177;33173:9;33168:14;;33012:176;;;;:::o;33194:305::-;33234:3;33253:20;33271:1;33253:20;:::i;:::-;33248:25;;33287:20;33305:1;33287:20;:::i;:::-;33282:25;;33441:1;33373:66;33369:74;33366:1;33363:81;33360:107;;;33447:18;;:::i;:::-;33360:107;33491:1;33488;33484:9;33477:16;;33194:305;;;;:::o;33505:143::-;33562:5;33593:6;33587:13;33578:22;;33609:33;33636:5;33609:33;:::i;:::-;33505:143;;;;:::o;33654:351::-;33724:6;33773:2;33761:9;33752:7;33748:23;33744:32;33741:119;;;33779:79;;:::i;:::-;33741:119;33899:1;33924:64;33980:7;33971:6;33960:9;33956:22;33924:64;:::i;:::-;33914:74;;33870:128;33654:351;;;;:::o;34011:180::-;34059:77;34056:1;34049:88;34156:4;34153:1;34146:15;34180:4;34177:1;34170:15;34197:332;34318:4;34356:2;34345:9;34341:18;34333:26;;34369:71;34437:1;34426:9;34422:17;34413:6;34369:71;:::i;:::-;34450:72;34518:2;34507:9;34503:18;34494:6;34450:72;:::i;:::-;34197:332;;;;;:::o
Swarm Source
ipfs://9b9832035cbe2f11b3ae77aef04a8389d80b163e2966407e0e5e1cc172f43ea9
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.