More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Base URI | 15533088 | 857 days ago | IN | 0 ETH | 0.0006705 |
Loading...
Loading
Contract Name:
AOW_Character_Base
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-14 */ /** *Submitted for verification at Etherscan.io on 2022-09-10 */ // File: contracts/alloutwar_character.sol /** *Submitted for verification at Etherscan.io on 2022-09-10 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // 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/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/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: contracts/alloutwar_character.sol // _ _ _ _ _ ___ _ __ __ // _| || |_ / \ | | |/ _ \ _ _| |\ \ / /_ _ _ __ // |_ .. _|/ _ \ | | | | | | | | | __\ \ /\ / / _` | '__| // |_ _/ ___ \| | | |_| | |_| | |_ \ V V / (_| | | // |_||_|/_/ \_\_|_|\___/ \__,_|\__| \_/\_/ \__,_|_| pragma solidity ^0.8.1; interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 public currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address owner = ERC721A.ownerOf(tokenId); _beforeTokenTransfers(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721A.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _addressData[owner].balance -= 1; } delete _ownerships[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfers(owner, address(0), tokenId,1); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFromContract( address to, uint256 tokenId, bytes memory _data ) internal { _transferFromContract(address(this), to, tokenId); require( _checkOnERC721Received(address(this), to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } function _safeMintDirect( address to, uint256 tokenId, bytes memory _data ) internal { require(to != address(0), "ERC721A: mint to the zero address"); _beforeTokenTransfers(address(0), to, tokenId, 1); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(1), addressData.numberMinted + uint128(1) ); _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); emit Transfer(address(0), to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); _afterTokenTransfers(address(0), to, tokenId, 1); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _transferFromContract( address from, address to, uint256 tokenId ) internal { TokenOwnership memory prevOwnership = ownershipOf(tokenId); require(from == address(this), "ERC721A: transfer from non contract"); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } interface AOW_OLD { function tokensOfOwner(address owner) view external returns (uint256[] memory); function balanceOf(address account) external view returns (uint256); function _burn(uint256 tokenId) external; } contract AOW_Character_Base is ERC721A, Ownable { // errors error NOT_OWNER(); error NO_CONTRACTS_ALLOWED(); error TOTAL_EXCEEDED(uint256 limit); error WALLET_LIMIT_EXCEEDED(uint256 limit); error NO_MORE_AVAILABLE(); error CANT_MINT_SAME_BLOCK(); error NOT_ENOUGH_FUNDS(uint256 amountRequired); error SALE_ENDED(); // Numbers uint256 public PRICE = 0.0065 ether; uint256 public CLAIMABLE_COUNT = 2400; uint256 public PUB_COUNT = 5600; uint256 constant public TOTAL = 8001; uint256 private MINT_LIMIT = 10; uint256 public BLOODMARK_BUY_AMOUNT = 150 * (10**18); uint256 public BLOODMARK_SELL_AMOUNT = 50 * (10**18); uint256 public BLOODMARK_BUY_PRICE = 500000000000; uint256 public BLOODMARK_PURCHASE_LIMIT = 15000 * (10**18); mapping(address => uint256) ADDRESS_BLOCK_BOUGHT; mapping(uint16 => uint8) public CLASS_MAPPING; mapping(uint16 => uint8) public FACTION_MAPPING; AOW_OLD oldWarContract = AOW_OLD(0x08066d3ED45c68dC7DEAcE081d55F9ABB63432ED); IERC20 public bloodMark = IERC20(0x58321AF7dB82d462aB8C3567F0e5AddDaAb30310); IERC721 public warpass = IERC721(0x546155D606eb696AD108eC89EE839a8cD7cb2F0D); // addresses address private GAME_WALLET = 0xbb43fcEFF7Cb40F87f88D34F37f9b7b311D3a6fD; address public constant OWNER = 0xD3090CF8D7ECD9c1f41ebFb07c915B637BF4F466; //TC address public constant MARKETING = 0xb23e3c30CEE40b6F07cee3705E3Ab2198c3b9F2D; //LL event minted(uint256 count); event minted_free(); event purchased(uint256 count); event burnt(uint256 tokenId); string private baseURI = "https://api.alloutwar.io"; constructor() ERC721A("AllOutWar", "AOW_CHARS", 2400, 200000) { _safeMint(address(this), 2400); } modifier isAllowed() { if(msg.sender != owner() || msg.sender != address(GAME_WALLET)) revert NOT_OWNER(); _; } modifier securityChecks() { if(msg.sender != tx.origin) revert NO_CONTRACTS_ALLOWED(); if(ADDRESS_BLOCK_BOUGHT[msg.sender] == block.timestamp) revert CANT_MINT_SAME_BLOCK(); _; } modifier canWithdraw() { require( msg.sender == owner() || msg.sender == OWNER || msg.sender == MARKETING, "Only specific wallets can withdraw" ); _; } function Mint( uint256 numberOfToken ) external payable securityChecks() { if(totalSupply() + numberOfToken > TOTAL) revert TOTAL_EXCEEDED(TOTAL); if( PUB_COUNT == 0 || PUB_COUNT < numberOfToken) revert NO_MORE_AVAILABLE(); if( numberOfToken > MINT_LIMIT || numberMinted(msg.sender) + numberOfToken > MINT_LIMIT) revert WALLET_LIMIT_EXCEEDED(2); if(msg.value < PRICE * numberOfToken) revert NOT_ENOUGH_FUNDS(PRICE * numberOfToken); ADDRESS_BLOCK_BOUGHT[msg.sender] = block.timestamp; PUB_COUNT -= 1; _safeMint(msg.sender, numberOfToken); emit minted(numberOfToken); } function burn(uint256 tokenId) external isAllowed { _burn(tokenId); emit burnt(tokenId); } function batchBurn(uint256[] memory token) external isAllowed { for (uint256 i = 0; i < token.length; i++) { this.burn(token[i]); } } function setBaseURI(string calldata URI) external onlyOwner { baseURI = URI; } // Allow holder to claim token in old contract function claim() external { if(msg.sender != tx.origin) revert NO_CONTRACTS_ALLOWED(); if(oldWarContract.balanceOf(msg.sender) == 0) revert NO_MORE_AVAILABLE(); uint256[] memory balances = oldWarContract.tokensOfOwner(msg.sender); for (uint256 i = 0; i < balances.length; i++) { if(ownerOf(balances[i]) == address(this)) { safeTransferFromContract(msg.sender,balances[i],"CLAIM"); } } emit minted_free(); } function merge(uint256[] memory tokenIds) external { require(tokenIds.length == 4 || (warpass.balanceOf(msg.sender) > 0 && tokenIds.length ==3), "Must be 4 token or 3 if you hold a warpass"); require(PUB_COUNT > 0, "No more new tokens available"); require(ownerOf(tokenIds[0]) == msg.sender, "Must be owner of first token"); for (uint256 i = 1; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Must be owner of all tokens"); _burn(tokenIds[i]); emit burnt(tokenIds[i]); } _safeMint(msg.sender, 1); bloodMark.transferFrom(GAME_WALLET,msg.sender , BLOODMARK_SELL_AMOUNT); emit minted(1); } function sellToken(uint256 tokenId) external { if(msg.sender != tx.origin) revert NO_CONTRACTS_ALLOWED(); require(ownerOf(tokenId) == msg.sender, "Must be owner of token"); _burn(tokenId); bloodMark.transferFrom(GAME_WALLET,msg.sender , BLOODMARK_SELL_AMOUNT); emit burnt(tokenId); } function buyToken() external { if(msg.sender != tx.origin) revert NO_CONTRACTS_ALLOWED(); require(bloodMark.balanceOf(msg.sender) > BLOODMARK_BUY_AMOUNT, "You do not own enough BloodMark"); bloodMark.transferFrom(msg.sender, GAME_WALLET, BLOODMARK_BUY_AMOUNT); _safeMint(msg.sender, 1); emit purchased(currentIndex); } function buyBloodMark(uint256 amount) external payable { if(msg.sender != tx.origin) revert NO_CONTRACTS_ALLOWED(); require(bloodMark.balanceOf(GAME_WALLET) > BLOODMARK_BUY_PRICE, "The bank is currently empty!"); require(amount < BLOODMARK_PURCHASE_LIMIT, "You can only buy 150 BloodMark at a time"); require(msg.value >= amount * BLOODMARK_BUY_PRICE, "You did not sent enough ETH"); bloodMark.transferFrom(GAME_WALLET, msg.sender, amount * (10**18) ); } // Allow both owner and marketing to call withdraw function withdraw() external canWithdraw { require(address(this).balance > 0, "No balance to withdraw"); uint256 balance = address(this).balance; payable(OWNER).transfer(balance / 100 * 80); // 70% of balance payable(MARKETING).transfer(balance / 100 * 20); // 30% of balance } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"Token not minted yet"); return string(abi.encodePacked( baseURI,"/meta/", Strings.toString(tokenId))); } function contractURI() public view returns (string memory) { return string(abi.encodePacked(baseURI,"/meta/contract")); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function setMintLimit(uint256 _mintLimit) external onlyOwner{ MINT_LIMIT = _mintLimit; } function setGameWallet(address gameWalletAddress) external onlyOwner { GAME_WALLET = gameWalletAddress; } function setPrice(uint256 _pubPrice) external onlyOwner { PRICE = _pubPrice; } function setLimits(uint256 BM_LIMIT, uint256 _BUY_AMOUNT, uint256 _SELL_AMOUNT, uint256 _BUY_PRICE) external onlyOwner{ BLOODMARK_PURCHASE_LIMIT = BM_LIMIT; BLOODMARK_BUY_AMOUNT = _BUY_AMOUNT; BLOODMARK_SELL_AMOUNT = _SELL_AMOUNT; BLOODMARK_BUY_PRICE = _BUY_PRICE; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CANT_MINT_SAME_BLOCK","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountRequired","type":"uint256"}],"name":"NOT_ENOUGH_FUNDS","type":"error"},{"inputs":[],"name":"NOT_OWNER","type":"error"},{"inputs":[],"name":"NO_CONTRACTS_ALLOWED","type":"error"},{"inputs":[],"name":"NO_MORE_AVAILABLE","type":"error"},{"inputs":[],"name":"SALE_ENDED","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"TOTAL_EXCEEDED","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"WALLET_LIMIT_EXCEEDED","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"minted","type":"event"},{"anonymous":false,"inputs":[],"name":"minted_free","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"purchased","type":"event"},{"inputs":[],"name":"BLOODMARK_BUY_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOODMARK_BUY_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOODMARK_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOODMARK_SELL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLAIMABLE_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"CLASS_MAPPING","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"FACTION_MAPPING","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKETING","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfToken","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OWNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUB_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"token","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bloodMark","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyBloodMark","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"sellToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gameWalletAddress","type":"address"}],"name":"setGameWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BM_LIMIT","type":"uint256"},{"internalType":"uint256","name":"_BUY_AMOUNT","type":"uint256"},{"internalType":"uint256","name":"_SELL_AMOUNT","type":"uint256"},{"internalType":"uint256","name":"_BUY_PRICE","type":"uint256"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pubPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"warpass","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000808055600755661717b72f0a4000600955610960600a9081556115e0600b55600c55680821ab0d4414980000600d556802b5e3af16b1880000600e5564746a528800600f5569032d26d12e980b600000601055601480546001600160a01b03199081167308066d3ed45c68dc7deace081d55f9abb63432ed179091556015805482167358321af7db82d462ab8c3567f0e5adddaab3031017905560168054821673546155d606eb696ad108ec89ee839a8cd7cb2f0d1790556017805490911673bb43fceff7cb40f87f88d34f37f9b7b311d3a6fd179055610100604052601860c08181527f68747470733a2f2f6170692e616c6c6f75747761722e696f000000000000000060e0526200011590826200081c565b503480156200012357600080fd5b506040518060400160405280600981526020016820b63627baba2bb0b960b91b81525060405180604001604052806009815260200168414f575f434841525360b81b81525061096062030d4060008111620001dc5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200023e5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001d3565b60016200024c85826200081c565b5060026200025b84826200081c565b5060a091909152608052506200027390503362000287565b6200028130610960620002d9565b620009ea565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002fb828260405180602001604052806000815250620002ff60201b60201c565b5050565b6000546001600160a01b038416620003645760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401620001d3565b62000370816000541190565b15620003bf5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401620001d3565b60a0518311156200041e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401620001d3565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906200047c908790620008fe565b6001600160801b031681526020018583602001516200049c9190620008fe565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015620006005760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46200058260008884886200060f565b620005db5760405162461bcd60e51b815260206004820152603360248201526000805160206200454083398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620001d3565b81620005e78162000928565b9250508080620005f79062000928565b91505062000532565b5060008190555b505050505050565b600062000630846001600160a01b03166200076c60201b6200217c1760201c565b156200076057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200066a90339089908890889060040162000944565b6020604051808303816000875af1925050508015620006a8575060408051601f3d908101601f19168201909252620006a591810190620009b7565b60015b62000745573d808015620006d9576040519150601f19603f3d011682016040523d82523d6000602084013e620006de565b606091505b5080516000036200073d5760405162461bcd60e51b815260206004820152603360248201526000805160206200454083398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620001d3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000764565b5060015b949350505050565b6001600160a01b03163b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007a657607f821691505b602082108103620007c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200081757600081815260208120601f850160051c81016020861015620007f65750805b601f850160051c820191505b81811015620006075782815560010162000802565b505050565b81516001600160401b038111156200083857620008386200077b565b620008508162000849845462000791565b84620007cd565b602080601f8311600181146200088857600084156200086f5750858301515b600019600386901b1c1916600185901b17855562000607565b600085815260208120601f198616915b82811015620008b95788860151825594840194600190910190840162000898565b5085821015620008d85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6001600160801b03818116838216019080821115620009215762000921620008e8565b5092915050565b6000600182016200093d576200093d620008e8565b5060010190565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620009935785810182015185820160a00152810162000975565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b600060208284031215620009ca57600080fd5b81516001600160e01b031981168114620009e357600080fd5b9392505050565b60805160a051613b2562000a1b6000396000818161275f015281816127890152612c5b015260005050613b256000f3fe60806040526004361061033f5760003560e01c8063808a0a01116101b0578063b88d4fde116100ec578063dc8e92ea11610095578063e8a3d4851161006f578063e8a3d4851461091a578063e985e9c51461092f578063eb35167c14610978578063f2fde38b1461098e57600080fd5b8063dc8e92ea146108b2578063de62d842146108d2578063e530a7d0146108f257600080fd5b8063c87b56dd116100c6578063c87b56dd1461085c578063d7224ba01461087c578063dc33e6811461089257600080fd5b8063b88d4fde146107ec578063b8d18f9a1461080c578063c3b577cf1461082c57600080fd5b806395d89b4111610159578063a075b7c711610133578063a075b7c714610781578063a22cb465146107a1578063a4821719146107c1578063a8dd6c5c146107d657600080fd5b806395d89b411461070a5780639a95e0a71461071f5780639e6a1d7d1461076157600080fd5b80638d859f3e1161018a5780638d859f3e146106b65780638da5cb5b146106cc57806391b7f5ed146106ea57600080fd5b8063808a0a01146106535780638462151c146106735780638a551795146106a057600080fd5b8063372ff0b11161027f5780634f6ccce71161022857806370a082311161020257806370a08231146105e8578063715018a614610608578063741816f01461061d57806375d2fc2a1461063d57600080fd5b80634f6ccce71461058857806355f804b3146105a85780636352211e146105c857600080fd5b806342842e0e1161025957806342842e0e1461053357806342966c68146105535780634e71d92d1461057357600080fd5b8063372ff0b1146104f55780633ac8a3cd146105085780633ccfd60b1461051e57600080fd5b8063117803e3116102ec57806323b872dd116102c657806323b872dd1461048957806326987b60146104a957806327efc086146104bf5780632f745c59146104d557600080fd5b8063117803e31461042c57806318160ddd146104545780632397e4d71461046957600080fd5b8063081812fc1161031d578063081812fc146103b0578063095ea7b3146103e85780630e3218b01461040857600080fd5b806301ffc9a71461034457806306fdde0314610379578063078837031461039b575b600080fd5b34801561035057600080fd5b5061036461035f3660046131c9565b6109ae565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061038e610a1b565b604051610370919061323d565b6103ae6103a9366004613250565b610aad565b005b3480156103bc57600080fd5b506103d06103cb366004613250565b610c5a565b6040516001600160a01b039091168152602001610370565b3480156103f457600080fd5b506103ae610403366004613285565b610ce5565b34801561041457600080fd5b5061041e600b5481565b604051908152602001610370565b34801561043857600080fd5b506103d073d3090cf8d7ecd9c1f41ebfb07c915b637bf4f46681565b34801561046057600080fd5b5060005461041e565b34801561047557600080fd5b506103ae610484366004613250565b610dfc565b34801561049557600080fd5b506103ae6104a43660046132af565b610f39565b3480156104b557600080fd5b5061041e60005481565b3480156104cb57600080fd5b5061041e611f4181565b3480156104e157600080fd5b5061041e6104f0366004613285565b610f44565b6103ae610503366004613250565b6110b0565b34801561051457600080fd5b5061041e60105481565b34801561052a57600080fd5b506103ae6112f6565b34801561053f57600080fd5b506103ae61054e3660046132af565b611495565b34801561055f57600080fd5b506103ae61056e366004613250565b6114b0565b34801561057f57600080fd5b506103ae61152c565b34801561059457600080fd5b5061041e6105a3366004613250565b611711565b3480156105b457600080fd5b506103ae6105c33660046132eb565b611773565b3480156105d457600080fd5b506103d06105e3366004613250565b611788565b3480156105f457600080fd5b5061041e61060336600461335d565b61179a565b34801561061457600080fd5b506103ae61182b565b34801561062957600080fd5b506015546103d0906001600160a01b031681565b34801561064957600080fd5b5061041e600e5481565b34801561065f57600080fd5b506103ae61066e36600461335d565b61183f565b34801561067f57600080fd5b5061069361068e36600461335d565b611869565b6040516103709190613378565b3480156106ac57600080fd5b5061041e600a5481565b3480156106c257600080fd5b5061041e60095481565b3480156106d857600080fd5b506008546001600160a01b03166103d0565b3480156106f657600080fd5b506103ae610705366004613250565b61190b565b34801561071657600080fd5b5061038e611918565b34801561072b57600080fd5b5061074f61073a3660046133bc565b60136020526000908152604090205460ff1681565b60405160ff9091168152602001610370565b34801561076d57600080fd5b506103ae61077c366004613250565b611927565b34801561078d57600080fd5b506103ae61079c3660046133e0565b611934565b3480156107ad57600080fd5b506103ae6107bc366004613420565b611950565b3480156107cd57600080fd5b506103ae611a14565b3480156107e257600080fd5b5061041e600d5481565b3480156107f857600080fd5b506103ae61080736600461349e565b611bbc565b34801561081857600080fd5b506016546103d0906001600160a01b031681565b34801561083857600080fd5b5061074f6108473660046133bc565b60126020526000908152604090205460ff1681565b34801561086857600080fd5b5061038e610877366004613250565b611bf5565b34801561088857600080fd5b5061041e60075481565b34801561089e57600080fd5b5061041e6108ad36600461335d565b611c80565b3480156108be57600080fd5b506103ae6108cd366004613582565b611c8b565b3480156108de57600080fd5b506103ae6108ed366004613582565b611d66565b3480156108fe57600080fd5b506103d073b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d81565b34801561092657600080fd5b5061038e6120db565b34801561093b57600080fd5b5061036461094a366004613618565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b5061041e600f5481565b34801561099a57600080fd5b506103ae6109a936600461335d565b612103565b60006001600160e01b031982166380ac58cd60e01b14806109df57506001600160e01b03198216635b5e139f60e01b145b806109fa57506001600160e01b0319821663780e9d6360e01b145b80610a1557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a2a9061364b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a569061364b565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b333214610acd5760405163336b562960e21b815260040160405180910390fd5b33600090815260116020526040902054429003610afd576040516319c8004760e11b815260040160405180910390fd5b611f4181610b0a60005490565b610b14919061369b565b1115610b3c57604051635fbff39b60e01b8152611f4160048201526024015b60405180910390fd5b600b541580610b4c575080600b54105b15610b6a5760405163245d60b160e21b815260040160405180910390fd5b600c54811180610b8e5750600c5481610b8233611c80565b610b8c919061369b565b115b15610baf57604051639af0c6e960e01b815260026004820152602401610b33565b80600954610bbd91906136ae565b341015610bee5780600954610bd291906136ae565b60405163b80241a560e01b8152600401610b3391815260200190565b336000908152601160205260408120429055600b805460019290610c139084906136c5565b90915550610c239050338261218b565b6040518181527f7dc0bf3ff15656545da2c5f0567962839fe379f74aacdfc4e8025bb24e0c082d906020015b60405180910390a150565b6000610c67826000541190565b610cc95760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610b33565b506000908152600560205260409020546001600160a01b031690565b6000610cf082611788565b9050806001600160a01b0316836001600160a01b031603610d5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b33565b336001600160a01b0382161480610d7a5750610d7a813361094a565b610dec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b33565b610df78383836121a5565b505050565b333214610e1c5760405163336b562960e21b815260040160405180910390fd5b33610e2682611788565b6001600160a01b031614610e7c5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265206f776e6572206f6620746f6b656e000000000000000000006044820152606401610b33565b610e8581612201565b601554601754600e546040516323b872dd60e01b81526001600160a01b03928316600482015233602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0891906136d8565b506040518181527f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f90602001610c4f565b610df78383836122bd565b6000610f4f8361179a565b8210610fa85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b33565b600080549080805b83811015611050576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561100357805192505b876001600160a01b0316836001600160a01b03160361103d5786840361102f57509350610a1592505050565b83611039816136f5565b9450505b5080611048816136f5565b915050610fb0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b33565b3332146110d05760405163336b562960e21b815260040160405180910390fd5b600f546015546017546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561111f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611143919061370e565b116111905760405162461bcd60e51b815260206004820152601c60248201527f5468652062616e6b2069732063757272656e746c7920656d70747921000000006044820152606401610b33565b60105481106111f25760405162461bcd60e51b815260206004820152602860248201527f596f752063616e206f6e6c79206275792031353020426c6f6f644d61726b20616044820152677420612074696d6560c01b6064820152608401610b33565b600f546111ff90826136ae565b34101561124e5760405162461bcd60e51b815260206004820152601b60248201527f596f7520646964206e6f742073656e7420656e6f7567682045544800000000006044820152606401610b33565b6015546017546001600160a01b03918216916323b872dd91163361127a85670de0b6b3a76400006136ae565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f291906136d8565b5050565b6008546001600160a01b031633148061132257503373d3090cf8d7ecd9c1f41ebfb07c915b637bf4f466145b8061134057503373b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d145b6113975760405162461bcd60e51b815260206004820152602260248201527f4f6e6c792073706563696669632077616c6c6574732063616e20776974686472604482015261617760f01b6064820152608401610b33565b600047116113e75760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f207769746864726177000000000000000000006044820152606401610b33565b4773d3090cf8d7ecd9c1f41ebfb07c915b637bf4f4666108fc61140b60648461373d565b6114169060506136ae565b6040518115909202916000818181858888f1935050505015801561143e573d6000803e3d6000fd5b5073b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d6108fc61146260648461373d565b61146d9060146136ae565b6040518115909202916000818181858888f193505050501580156112f2573d6000803e3d6000fd5b610df783838360405180602001604052806000815250611bbc565b6008546001600160a01b0316331415806114d557506017546001600160a01b03163314155b156114f3576040516338ebc58960e11b815260040160405180910390fd5b6114fc81612201565b6040518181527f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f90602001610c4f565b33321461154c5760405163336b562960e21b815260040160405180910390fd5b6014546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b8919061370e565b6000036115d85760405163245d60b160e21b815260040160405180910390fd5b601454604051632118854760e21b81523360048201526000916001600160a01b031690638462151c90602401600060405180830381865afa158015611621573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116499190810190613751565b905060005b81518110156116e457306001600160a01b0316611683838381518110611676576116766137d7565b6020026020010151611788565b6001600160a01b0316036116d2576116d2338383815181106116a7576116a76137d7565b602002602001015160405180604001604052806005815260200164434c41494d60d81b815250612650565b806116dc816136f5565b91505061164e565b506040517ff9fae62af5d702faa1117d68c0815b8c210705695265cbf03e3fd57500918da690600090a150565b60008054821061176f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b33565b5090565b61177b612683565b6018610df7828483613833565b6000611793826126dd565b5192915050565b60006001600160a01b0382166118065760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b33565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b611833612683565b61183d6000612887565b565b611847612683565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060006118768361179a565b905060008167ffffffffffffffff81111561189357611893613457565b6040519080825280602002602001820160405280156118bc578160200160208202803683370190505b50905060005b82811015611903576118d48582610f44565b8282815181106118e6576118e66137d7565b6020908102919091010152806118fb816136f5565b9150506118c2565b509392505050565b611913612683565b600955565b606060028054610a2a9061364b565b61192f612683565b600c55565b61193c612683565b601093909355600d91909155600e55600f55565b336001600160a01b038316036119a85760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b33565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b333214611a345760405163336b562960e21b815260040160405180910390fd5b600d546015546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061370e565b11611af05760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f206e6f74206f776e20656e6f75676820426c6f6f644d61726b006044820152606401610b33565b601554601754600d546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7391906136d8565b50611b7f33600161218b565b7fd9ae93d2c3ae55f98c789c0162d132e4583844836b3bcb5974d0587d0f4f5a2c600054604051611bb291815260200190565b60405180910390a1565b611bc78484846122bd565b611bd3848484846128d9565b611bef5760405162461bcd60e51b8152600401610b33906138f3565b50505050565b6060611c02826000541190565b611c4e5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e206e6f74206d696e746564207965740000000000000000000000006044820152606401610b33565b6018611c59836129db565b604051602001611c6a9291906139c3565b6040516020818303038152906040529050919050565b6000610a1582612af4565b6008546001600160a01b031633141580611cb057506017546001600160a01b03163314155b15611cce576040516338ebc58960e11b815260040160405180910390fd5b60005b81518110156112f257306001600160a01b03166342966c68838381518110611cfb57611cfb6137d7565b60200260200101516040518263ffffffff1660e01b8152600401611d2191815260200190565b600060405180830381600087803b158015611d3b57600080fd5b505af1158015611d4f573d6000803e3d6000fd5b505050508080611d5e906136f5565b915050611cd1565b805160041480611dec57506016546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde919061370e565b118015611dec575080516003145b611e4b5760405162461bcd60e51b815260206004820152602a60248201527f4d757374206265203420746f6b656e206f72203320696620796f7520686f6c646044820152692061207761727061737360b01b6064820152608401610b33565b6000600b5411611e9d5760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265206e657720746f6b656e7320617661696c61626c65000000006044820152606401610b33565b336001600160a01b0316611ebd82600081518110611676576116766137d7565b6001600160a01b031614611f135760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265206f776e6572206f6620666972737420746f6b656e000000006044820152606401610b33565b60015b815181101561201a57336001600160a01b0316611f3e838381518110611676576116766137d7565b6001600160a01b031614611f945760405162461bcd60e51b815260206004820152601b60248201527f4d757374206265206f776e6572206f6620616c6c20746f6b656e7300000000006044820152606401610b33565b611fb6828281518110611fa957611fa96137d7565b6020026020010151612201565b7f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f828281518110611fe957611fe96137d7565b602002602001015160405161200091815260200190565b60405180910390a180612012816136f5565b915050611f16565b5061202633600161218b565b601554601754600e546040516323b872dd60e01b81526001600160a01b03928316600482015233602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015612085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a991906136d8565b50604051600181527f7dc0bf3ff15656545da2c5f0567962839fe379f74aacdfc4e8025bb24e0c082d90602001610c4f565b606060186040516020016120ef91906139fa565b604051602081830303815290604052905090565b61210b612683565b6001600160a01b0381166121705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b33565b61217981612887565b50565b6001600160a01b03163b151590565b6112f2828260405180602001604052806000815250612b9e565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061220c82611788565b905061221782611788565b600083815260056020908152604080832080546001600160a01b03191690556001600160a01b0384168084526004835281842080546fffffffffffffffffffffffffffffffff1981166001600160801b0391821660001901909116179055868452600390925280832080546001600160e01b03191690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006122c8826126dd565b80519091506000906001600160a01b0316336001600160a01b031614806122ff5750336122f484610c5a565b6001600160a01b0316145b8061231157508151612311903361094a565b9050806123865760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610b33565b846001600160a01b031682600001516001600160a01b0316146123fa5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b33565b6001600160a01b03841661245e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b33565b61246e60008484600001516121a5565b6001600160a01b03851660009081526004602052604081208054600192906124a09084906001600160801b0316613a24565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926124ec91859116613a4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561257484600161369b565b6000818152600360205260409020549091506001600160a01b03166126065761259e816000541190565b156126065760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61265b308484612e79565b612667308484846128d9565b610df75760405162461bcd60e51b8152600401610b33906138f3565b6008546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b33565b60408051808201909152600080825260208201526126fc826000541190565b61275b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b33565b60007f000000000000000000000000000000000000000000000000000000000000000083106127bc576127ae7f0000000000000000000000000000000000000000000000000000000000000000846136c5565b6127b990600161369b565b90505b825b818110612826576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561281357949350505050565b508061281e81613a6b565b9150506127be565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b33565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156129cf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061291d903390899088908890600401613a82565b6020604051808303816000875af1925050508015612958575060408051601f3d908101601f1916820190925261295591810190613abe565b60015b6129b5573d808015612986576040519150601f19603f3d011682016040523d82523d6000602084013e61298b565b606091505b5080516000036129ad5760405162461bcd60e51b8152600401610b33906138f3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506129d3565b5060015b949350505050565b606081600003612a025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a2c5780612a16816136f5565b9150612a259050600a8361373d565b9150612a06565b60008167ffffffffffffffff811115612a4757612a47613457565b6040519080825280601f01601f191660200182016040528015612a71576020820181803683370190505b5090505b84156129d357612a866001836136c5565b9150612a93600a86613adb565b612a9e90603061369b565b60f81b818381518110612ab357612ab36137d7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612aed600a8661373d565b9450612a75565b60006001600160a01b038216612b725760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f20616464726573730000000000000000000000000000006064820152608401610b33565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612c015760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b33565b612c0c816000541190565b15612c595760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b33565b7f0000000000000000000000000000000000000000000000000000000000000000831115612cd45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b33565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612d30908790613a4b565b6001600160801b03168152602001858360200151612d4e9190613a4b565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612e6e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612e3260008884886128d9565b612e4e5760405162461bcd60e51b8152600401610b33906138f3565b81612e58816136f5565b9250508080612e66906136f5565b915050612de5565b506000819055612648565b6000612e84826126dd565b90506001600160a01b0384163014612eea5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207472616e736665722066726f6d206e6f6e20636f6e74726044820152621858dd60ea1b6064820152608401610b33565b836001600160a01b031681600001516001600160a01b031614612f5e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b33565b6001600160a01b038316612fc25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b33565b612fd260008383600001516121a5565b6001600160a01b03841660009081526004602052604081208054600192906130049084906001600160801b0316613a24565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0385166000908152600460205260408120805460019450909261305091859116613a4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808616825267ffffffffffffffff428116602080850191825260008881526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556130d883600161369b565b6000818152600360205260409020549091506001600160a01b031661316a57613102816000541190565b1561316a5760408051808201825283516001600160a01b03908116825260208086015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6001600160e01b03198116811461217957600080fd5b6000602082840312156131db57600080fd5b81356131e6816131b3565b9392505050565b60005b838110156132085781810151838201526020016131f0565b50506000910152565b600081518084526132298160208601602086016131ed565b601f01601f19169290920160200192915050565b6020815260006131e66020830184613211565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461328057600080fd5b919050565b6000806040838503121561329857600080fd5b6132a183613269565b946020939093013593505050565b6000806000606084860312156132c457600080fd5b6132cd84613269565b92506132db60208501613269565b9150604084013590509250925092565b600080602083850312156132fe57600080fd5b823567ffffffffffffffff8082111561331657600080fd5b818501915085601f83011261332a57600080fd5b81358181111561333957600080fd5b86602082850101111561334b57600080fd5b60209290920196919550909350505050565b60006020828403121561336f57600080fd5b6131e682613269565b6020808252825182820181905260009190848201906040850190845b818110156133b057835183529284019291840191600101613394565b50909695505050505050565b6000602082840312156133ce57600080fd5b813561ffff811681146131e657600080fd5b600080600080608085870312156133f657600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461217957600080fd5b6000806040838503121561343357600080fd5b61343c83613269565b9150602083013561344c81613412565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349657613496613457565b604052919050565b600080600080608085870312156134b457600080fd5b6134bd85613269565b935060206134cc818701613269565b935060408601359250606086013567ffffffffffffffff808211156134f057600080fd5b818801915088601f83011261350457600080fd5b81358181111561351657613516613457565b613528601f8201601f1916850161346d565b9150808252898482850101111561353e57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff82111561357857613578613457565b5060051b60200190565b6000602080838503121561359557600080fd5b823567ffffffffffffffff8111156135ac57600080fd5b8301601f810185136135bd57600080fd5b80356135d06135cb8261355e565b61346d565b81815260059190911b820183019083810190878311156135ef57600080fd5b928401925b8284101561360d578335825292840192908401906135f4565b979650505050505050565b6000806040838503121561362b57600080fd5b61363483613269565b915061364260208401613269565b90509250929050565b600181811c9082168061365f57607f821691505b60208210810361367f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a1557610a15613685565b8082028115828204841417610a1557610a15613685565b81810381811115610a1557610a15613685565b6000602082840312156136ea57600080fd5b81516131e681613412565b60006001820161370757613707613685565b5060010190565b60006020828403121561372057600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261374c5761374c613727565b500490565b6000602080838503121561376457600080fd5b825167ffffffffffffffff81111561377b57600080fd5b8301601f8101851361378c57600080fd5b805161379a6135cb8261355e565b81815260059190911b820183019083810190878311156137b957600080fd5b928401925b8284101561360d578351825292840192908401906137be565b634e487b7160e01b600052603260045260246000fd5b601f821115610df757600081815260208120601f850160051c810160208610156138145750805b601f850160051c820191505b8181101561264857828155600101613820565b67ffffffffffffffff83111561384b5761384b613457565b61385f83613859835461364b565b836137ed565b6000601f841160018114613893576000851561387b5750838201355b600019600387901b1c1916600186901b1783556131ac565b600083815260209020601f19861690835b828110156138c457868501358255602094850194600190920191016138a4565b50868210156138e15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527f6563656976657220696d706c656d656e74657200000000000000000000000000606082015260800190565b6000815461395d8161364b565b60018281168015613975576001811461398a576139b9565b60ff19841687528215158302870194506139b9565b8560005260208060002060005b858110156139b05781548a820152908401908201613997565b50505082870194505b5050505092915050565b60006139cf8285613950565b652f6d6574612f60d01b815283516139ee8160068401602088016131ed565b01600601949350505050565b6000613a068284613950565b6d0bdb595d184bd8dbdb9d1c9858dd60921b8152600e019392505050565b6001600160801b03828116828216039080821115613a4457613a44613685565b5092915050565b6001600160801b03818116838216019080821115613a4457613a44613685565b600081613a7a57613a7a613685565b506000190190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ab46080830184613211565b9695505050505050565b600060208284031215613ad057600080fd5b81516131e6816131b3565b600082613aea57613aea613727565b50069056fea26469706673582212203990fd673a2da65a80d7169c3d14b6f9c9703a3f883e7726af0ac2010d862cf464736f6c63430008110033455243373231413a207472616e7366657220746f206e6f6e2045524337323152
Deployed Bytecode
0x60806040526004361061033f5760003560e01c8063808a0a01116101b0578063b88d4fde116100ec578063dc8e92ea11610095578063e8a3d4851161006f578063e8a3d4851461091a578063e985e9c51461092f578063eb35167c14610978578063f2fde38b1461098e57600080fd5b8063dc8e92ea146108b2578063de62d842146108d2578063e530a7d0146108f257600080fd5b8063c87b56dd116100c6578063c87b56dd1461085c578063d7224ba01461087c578063dc33e6811461089257600080fd5b8063b88d4fde146107ec578063b8d18f9a1461080c578063c3b577cf1461082c57600080fd5b806395d89b4111610159578063a075b7c711610133578063a075b7c714610781578063a22cb465146107a1578063a4821719146107c1578063a8dd6c5c146107d657600080fd5b806395d89b411461070a5780639a95e0a71461071f5780639e6a1d7d1461076157600080fd5b80638d859f3e1161018a5780638d859f3e146106b65780638da5cb5b146106cc57806391b7f5ed146106ea57600080fd5b8063808a0a01146106535780638462151c146106735780638a551795146106a057600080fd5b8063372ff0b11161027f5780634f6ccce71161022857806370a082311161020257806370a08231146105e8578063715018a614610608578063741816f01461061d57806375d2fc2a1461063d57600080fd5b80634f6ccce71461058857806355f804b3146105a85780636352211e146105c857600080fd5b806342842e0e1161025957806342842e0e1461053357806342966c68146105535780634e71d92d1461057357600080fd5b8063372ff0b1146104f55780633ac8a3cd146105085780633ccfd60b1461051e57600080fd5b8063117803e3116102ec57806323b872dd116102c657806323b872dd1461048957806326987b60146104a957806327efc086146104bf5780632f745c59146104d557600080fd5b8063117803e31461042c57806318160ddd146104545780632397e4d71461046957600080fd5b8063081812fc1161031d578063081812fc146103b0578063095ea7b3146103e85780630e3218b01461040857600080fd5b806301ffc9a71461034457806306fdde0314610379578063078837031461039b575b600080fd5b34801561035057600080fd5b5061036461035f3660046131c9565b6109ae565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061038e610a1b565b604051610370919061323d565b6103ae6103a9366004613250565b610aad565b005b3480156103bc57600080fd5b506103d06103cb366004613250565b610c5a565b6040516001600160a01b039091168152602001610370565b3480156103f457600080fd5b506103ae610403366004613285565b610ce5565b34801561041457600080fd5b5061041e600b5481565b604051908152602001610370565b34801561043857600080fd5b506103d073d3090cf8d7ecd9c1f41ebfb07c915b637bf4f46681565b34801561046057600080fd5b5060005461041e565b34801561047557600080fd5b506103ae610484366004613250565b610dfc565b34801561049557600080fd5b506103ae6104a43660046132af565b610f39565b3480156104b557600080fd5b5061041e60005481565b3480156104cb57600080fd5b5061041e611f4181565b3480156104e157600080fd5b5061041e6104f0366004613285565b610f44565b6103ae610503366004613250565b6110b0565b34801561051457600080fd5b5061041e60105481565b34801561052a57600080fd5b506103ae6112f6565b34801561053f57600080fd5b506103ae61054e3660046132af565b611495565b34801561055f57600080fd5b506103ae61056e366004613250565b6114b0565b34801561057f57600080fd5b506103ae61152c565b34801561059457600080fd5b5061041e6105a3366004613250565b611711565b3480156105b457600080fd5b506103ae6105c33660046132eb565b611773565b3480156105d457600080fd5b506103d06105e3366004613250565b611788565b3480156105f457600080fd5b5061041e61060336600461335d565b61179a565b34801561061457600080fd5b506103ae61182b565b34801561062957600080fd5b506015546103d0906001600160a01b031681565b34801561064957600080fd5b5061041e600e5481565b34801561065f57600080fd5b506103ae61066e36600461335d565b61183f565b34801561067f57600080fd5b5061069361068e36600461335d565b611869565b6040516103709190613378565b3480156106ac57600080fd5b5061041e600a5481565b3480156106c257600080fd5b5061041e60095481565b3480156106d857600080fd5b506008546001600160a01b03166103d0565b3480156106f657600080fd5b506103ae610705366004613250565b61190b565b34801561071657600080fd5b5061038e611918565b34801561072b57600080fd5b5061074f61073a3660046133bc565b60136020526000908152604090205460ff1681565b60405160ff9091168152602001610370565b34801561076d57600080fd5b506103ae61077c366004613250565b611927565b34801561078d57600080fd5b506103ae61079c3660046133e0565b611934565b3480156107ad57600080fd5b506103ae6107bc366004613420565b611950565b3480156107cd57600080fd5b506103ae611a14565b3480156107e257600080fd5b5061041e600d5481565b3480156107f857600080fd5b506103ae61080736600461349e565b611bbc565b34801561081857600080fd5b506016546103d0906001600160a01b031681565b34801561083857600080fd5b5061074f6108473660046133bc565b60126020526000908152604090205460ff1681565b34801561086857600080fd5b5061038e610877366004613250565b611bf5565b34801561088857600080fd5b5061041e60075481565b34801561089e57600080fd5b5061041e6108ad36600461335d565b611c80565b3480156108be57600080fd5b506103ae6108cd366004613582565b611c8b565b3480156108de57600080fd5b506103ae6108ed366004613582565b611d66565b3480156108fe57600080fd5b506103d073b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d81565b34801561092657600080fd5b5061038e6120db565b34801561093b57600080fd5b5061036461094a366004613618565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b5061041e600f5481565b34801561099a57600080fd5b506103ae6109a936600461335d565b612103565b60006001600160e01b031982166380ac58cd60e01b14806109df57506001600160e01b03198216635b5e139f60e01b145b806109fa57506001600160e01b0319821663780e9d6360e01b145b80610a1557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a2a9061364b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a569061364b565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b333214610acd5760405163336b562960e21b815260040160405180910390fd5b33600090815260116020526040902054429003610afd576040516319c8004760e11b815260040160405180910390fd5b611f4181610b0a60005490565b610b14919061369b565b1115610b3c57604051635fbff39b60e01b8152611f4160048201526024015b60405180910390fd5b600b541580610b4c575080600b54105b15610b6a5760405163245d60b160e21b815260040160405180910390fd5b600c54811180610b8e5750600c5481610b8233611c80565b610b8c919061369b565b115b15610baf57604051639af0c6e960e01b815260026004820152602401610b33565b80600954610bbd91906136ae565b341015610bee5780600954610bd291906136ae565b60405163b80241a560e01b8152600401610b3391815260200190565b336000908152601160205260408120429055600b805460019290610c139084906136c5565b90915550610c239050338261218b565b6040518181527f7dc0bf3ff15656545da2c5f0567962839fe379f74aacdfc4e8025bb24e0c082d906020015b60405180910390a150565b6000610c67826000541190565b610cc95760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610b33565b506000908152600560205260409020546001600160a01b031690565b6000610cf082611788565b9050806001600160a01b0316836001600160a01b031603610d5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b33565b336001600160a01b0382161480610d7a5750610d7a813361094a565b610dec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b33565b610df78383836121a5565b505050565b333214610e1c5760405163336b562960e21b815260040160405180910390fd5b33610e2682611788565b6001600160a01b031614610e7c5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265206f776e6572206f6620746f6b656e000000000000000000006044820152606401610b33565b610e8581612201565b601554601754600e546040516323b872dd60e01b81526001600160a01b03928316600482015233602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0891906136d8565b506040518181527f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f90602001610c4f565b610df78383836122bd565b6000610f4f8361179a565b8210610fa85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b33565b600080549080805b83811015611050576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561100357805192505b876001600160a01b0316836001600160a01b03160361103d5786840361102f57509350610a1592505050565b83611039816136f5565b9450505b5080611048816136f5565b915050610fb0565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b33565b3332146110d05760405163336b562960e21b815260040160405180910390fd5b600f546015546017546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa15801561111f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611143919061370e565b116111905760405162461bcd60e51b815260206004820152601c60248201527f5468652062616e6b2069732063757272656e746c7920656d70747921000000006044820152606401610b33565b60105481106111f25760405162461bcd60e51b815260206004820152602860248201527f596f752063616e206f6e6c79206275792031353020426c6f6f644d61726b20616044820152677420612074696d6560c01b6064820152608401610b33565b600f546111ff90826136ae565b34101561124e5760405162461bcd60e51b815260206004820152601b60248201527f596f7520646964206e6f742073656e7420656e6f7567682045544800000000006044820152606401610b33565b6015546017546001600160a01b03918216916323b872dd91163361127a85670de0b6b3a76400006136ae565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f291906136d8565b5050565b6008546001600160a01b031633148061132257503373d3090cf8d7ecd9c1f41ebfb07c915b637bf4f466145b8061134057503373b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d145b6113975760405162461bcd60e51b815260206004820152602260248201527f4f6e6c792073706563696669632077616c6c6574732063616e20776974686472604482015261617760f01b6064820152608401610b33565b600047116113e75760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f207769746864726177000000000000000000006044820152606401610b33565b4773d3090cf8d7ecd9c1f41ebfb07c915b637bf4f4666108fc61140b60648461373d565b6114169060506136ae565b6040518115909202916000818181858888f1935050505015801561143e573d6000803e3d6000fd5b5073b23e3c30cee40b6f07cee3705e3ab2198c3b9f2d6108fc61146260648461373d565b61146d9060146136ae565b6040518115909202916000818181858888f193505050501580156112f2573d6000803e3d6000fd5b610df783838360405180602001604052806000815250611bbc565b6008546001600160a01b0316331415806114d557506017546001600160a01b03163314155b156114f3576040516338ebc58960e11b815260040160405180910390fd5b6114fc81612201565b6040518181527f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f90602001610c4f565b33321461154c5760405163336b562960e21b815260040160405180910390fd5b6014546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b8919061370e565b6000036115d85760405163245d60b160e21b815260040160405180910390fd5b601454604051632118854760e21b81523360048201526000916001600160a01b031690638462151c90602401600060405180830381865afa158015611621573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116499190810190613751565b905060005b81518110156116e457306001600160a01b0316611683838381518110611676576116766137d7565b6020026020010151611788565b6001600160a01b0316036116d2576116d2338383815181106116a7576116a76137d7565b602002602001015160405180604001604052806005815260200164434c41494d60d81b815250612650565b806116dc816136f5565b91505061164e565b506040517ff9fae62af5d702faa1117d68c0815b8c210705695265cbf03e3fd57500918da690600090a150565b60008054821061176f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b33565b5090565b61177b612683565b6018610df7828483613833565b6000611793826126dd565b5192915050565b60006001600160a01b0382166118065760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b33565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b611833612683565b61183d6000612887565b565b611847612683565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b606060006118768361179a565b905060008167ffffffffffffffff81111561189357611893613457565b6040519080825280602002602001820160405280156118bc578160200160208202803683370190505b50905060005b82811015611903576118d48582610f44565b8282815181106118e6576118e66137d7565b6020908102919091010152806118fb816136f5565b9150506118c2565b509392505050565b611913612683565b600955565b606060028054610a2a9061364b565b61192f612683565b600c55565b61193c612683565b601093909355600d91909155600e55600f55565b336001600160a01b038316036119a85760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b33565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b333214611a345760405163336b562960e21b815260040160405180910390fd5b600d546015546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061370e565b11611af05760405162461bcd60e51b815260206004820152601f60248201527f596f7520646f206e6f74206f776e20656e6f75676820426c6f6f644d61726b006044820152606401610b33565b601554601754600d546040516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7391906136d8565b50611b7f33600161218b565b7fd9ae93d2c3ae55f98c789c0162d132e4583844836b3bcb5974d0587d0f4f5a2c600054604051611bb291815260200190565b60405180910390a1565b611bc78484846122bd565b611bd3848484846128d9565b611bef5760405162461bcd60e51b8152600401610b33906138f3565b50505050565b6060611c02826000541190565b611c4e5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e206e6f74206d696e746564207965740000000000000000000000006044820152606401610b33565b6018611c59836129db565b604051602001611c6a9291906139c3565b6040516020818303038152906040529050919050565b6000610a1582612af4565b6008546001600160a01b031633141580611cb057506017546001600160a01b03163314155b15611cce576040516338ebc58960e11b815260040160405180910390fd5b60005b81518110156112f257306001600160a01b03166342966c68838381518110611cfb57611cfb6137d7565b60200260200101516040518263ffffffff1660e01b8152600401611d2191815260200190565b600060405180830381600087803b158015611d3b57600080fd5b505af1158015611d4f573d6000803e3d6000fd5b505050508080611d5e906136f5565b915050611cd1565b805160041480611dec57506016546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde919061370e565b118015611dec575080516003145b611e4b5760405162461bcd60e51b815260206004820152602a60248201527f4d757374206265203420746f6b656e206f72203320696620796f7520686f6c646044820152692061207761727061737360b01b6064820152608401610b33565b6000600b5411611e9d5760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265206e657720746f6b656e7320617661696c61626c65000000006044820152606401610b33565b336001600160a01b0316611ebd82600081518110611676576116766137d7565b6001600160a01b031614611f135760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265206f776e6572206f6620666972737420746f6b656e000000006044820152606401610b33565b60015b815181101561201a57336001600160a01b0316611f3e838381518110611676576116766137d7565b6001600160a01b031614611f945760405162461bcd60e51b815260206004820152601b60248201527f4d757374206265206f776e6572206f6620616c6c20746f6b656e7300000000006044820152606401610b33565b611fb6828281518110611fa957611fa96137d7565b6020026020010151612201565b7f8e08917378b8dc75fa50b0765f092a71d0acf92655530c0ffe5f862af06db55f828281518110611fe957611fe96137d7565b602002602001015160405161200091815260200190565b60405180910390a180612012816136f5565b915050611f16565b5061202633600161218b565b601554601754600e546040516323b872dd60e01b81526001600160a01b03928316600482015233602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015612085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a991906136d8565b50604051600181527f7dc0bf3ff15656545da2c5f0567962839fe379f74aacdfc4e8025bb24e0c082d90602001610c4f565b606060186040516020016120ef91906139fa565b604051602081830303815290604052905090565b61210b612683565b6001600160a01b0381166121705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b33565b61217981612887565b50565b6001600160a01b03163b151590565b6112f2828260405180602001604052806000815250612b9e565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061220c82611788565b905061221782611788565b600083815260056020908152604080832080546001600160a01b03191690556001600160a01b0384168084526004835281842080546fffffffffffffffffffffffffffffffff1981166001600160801b0391821660001901909116179055868452600390925280832080546001600160e01b03191690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006122c8826126dd565b80519091506000906001600160a01b0316336001600160a01b031614806122ff5750336122f484610c5a565b6001600160a01b0316145b8061231157508151612311903361094a565b9050806123865760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610b33565b846001600160a01b031682600001516001600160a01b0316146123fa5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b33565b6001600160a01b03841661245e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b33565b61246e60008484600001516121a5565b6001600160a01b03851660009081526004602052604081208054600192906124a09084906001600160801b0316613a24565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926124ec91859116613a4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561257484600161369b565b6000818152600360205260409020549091506001600160a01b03166126065761259e816000541190565b156126065760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61265b308484612e79565b612667308484846128d9565b610df75760405162461bcd60e51b8152600401610b33906138f3565b6008546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b33565b60408051808201909152600080825260208201526126fc826000541190565b61275b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b33565b60007f000000000000000000000000000000000000000000000000000000000000096083106127bc576127ae7f0000000000000000000000000000000000000000000000000000000000000960846136c5565b6127b990600161369b565b90505b825b818110612826576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561281357949350505050565b508061281e81613a6b565b9150506127be565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b33565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156129cf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061291d903390899088908890600401613a82565b6020604051808303816000875af1925050508015612958575060408051601f3d908101601f1916820190925261295591810190613abe565b60015b6129b5573d808015612986576040519150601f19603f3d011682016040523d82523d6000602084013e61298b565b606091505b5080516000036129ad5760405162461bcd60e51b8152600401610b33906138f3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506129d3565b5060015b949350505050565b606081600003612a025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a2c5780612a16816136f5565b9150612a259050600a8361373d565b9150612a06565b60008167ffffffffffffffff811115612a4757612a47613457565b6040519080825280601f01601f191660200182016040528015612a71576020820181803683370190505b5090505b84156129d357612a866001836136c5565b9150612a93600a86613adb565b612a9e90603061369b565b60f81b818381518110612ab357612ab36137d7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612aed600a8661373d565b9450612a75565b60006001600160a01b038216612b725760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f20616464726573730000000000000000000000000000006064820152608401610b33565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612c015760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b33565b612c0c816000541190565b15612c595760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b33565b7f0000000000000000000000000000000000000000000000000000000000000960831115612cd45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b33565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612d30908790613a4b565b6001600160801b03168152602001858360200151612d4e9190613a4b565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612e6e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612e3260008884886128d9565b612e4e5760405162461bcd60e51b8152600401610b33906138f3565b81612e58816136f5565b9250508080612e66906136f5565b915050612de5565b506000819055612648565b6000612e84826126dd565b90506001600160a01b0384163014612eea5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207472616e736665722066726f6d206e6f6e20636f6e74726044820152621858dd60ea1b6064820152608401610b33565b836001600160a01b031681600001516001600160a01b031614612f5e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b33565b6001600160a01b038316612fc25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b33565b612fd260008383600001516121a5565b6001600160a01b03841660009081526004602052604081208054600192906130049084906001600160801b0316613a24565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0385166000908152600460205260408120805460019450909261305091859116613a4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808616825267ffffffffffffffff428116602080850191825260008881526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556130d883600161369b565b6000818152600360205260409020549091506001600160a01b031661316a57613102816000541190565b1561316a5760408051808201825283516001600160a01b03908116825260208086015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6001600160e01b03198116811461217957600080fd5b6000602082840312156131db57600080fd5b81356131e6816131b3565b9392505050565b60005b838110156132085781810151838201526020016131f0565b50506000910152565b600081518084526132298160208601602086016131ed565b601f01601f19169290920160200192915050565b6020815260006131e66020830184613211565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461328057600080fd5b919050565b6000806040838503121561329857600080fd5b6132a183613269565b946020939093013593505050565b6000806000606084860312156132c457600080fd5b6132cd84613269565b92506132db60208501613269565b9150604084013590509250925092565b600080602083850312156132fe57600080fd5b823567ffffffffffffffff8082111561331657600080fd5b818501915085601f83011261332a57600080fd5b81358181111561333957600080fd5b86602082850101111561334b57600080fd5b60209290920196919550909350505050565b60006020828403121561336f57600080fd5b6131e682613269565b6020808252825182820181905260009190848201906040850190845b818110156133b057835183529284019291840191600101613394565b50909695505050505050565b6000602082840312156133ce57600080fd5b813561ffff811681146131e657600080fd5b600080600080608085870312156133f657600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461217957600080fd5b6000806040838503121561343357600080fd5b61343c83613269565b9150602083013561344c81613412565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349657613496613457565b604052919050565b600080600080608085870312156134b457600080fd5b6134bd85613269565b935060206134cc818701613269565b935060408601359250606086013567ffffffffffffffff808211156134f057600080fd5b818801915088601f83011261350457600080fd5b81358181111561351657613516613457565b613528601f8201601f1916850161346d565b9150808252898482850101111561353e57600080fd5b808484018584013760008482840101525080935050505092959194509250565b600067ffffffffffffffff82111561357857613578613457565b5060051b60200190565b6000602080838503121561359557600080fd5b823567ffffffffffffffff8111156135ac57600080fd5b8301601f810185136135bd57600080fd5b80356135d06135cb8261355e565b61346d565b81815260059190911b820183019083810190878311156135ef57600080fd5b928401925b8284101561360d578335825292840192908401906135f4565b979650505050505050565b6000806040838503121561362b57600080fd5b61363483613269565b915061364260208401613269565b90509250929050565b600181811c9082168061365f57607f821691505b60208210810361367f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a1557610a15613685565b8082028115828204841417610a1557610a15613685565b81810381811115610a1557610a15613685565b6000602082840312156136ea57600080fd5b81516131e681613412565b60006001820161370757613707613685565b5060010190565b60006020828403121561372057600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261374c5761374c613727565b500490565b6000602080838503121561376457600080fd5b825167ffffffffffffffff81111561377b57600080fd5b8301601f8101851361378c57600080fd5b805161379a6135cb8261355e565b81815260059190911b820183019083810190878311156137b957600080fd5b928401925b8284101561360d578351825292840192908401906137be565b634e487b7160e01b600052603260045260246000fd5b601f821115610df757600081815260208120601f850160051c810160208610156138145750805b601f850160051c820191505b8181101561264857828155600101613820565b67ffffffffffffffff83111561384b5761384b613457565b61385f83613859835461364b565b836137ed565b6000601f841160018114613893576000851561387b5750838201355b600019600387901b1c1916600186901b1783556131ac565b600083815260209020601f19861690835b828110156138c457868501358255602094850194600190920191016138a4565b50868210156138e15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527f6563656976657220696d706c656d656e74657200000000000000000000000000606082015260800190565b6000815461395d8161364b565b60018281168015613975576001811461398a576139b9565b60ff19841687528215158302870194506139b9565b8560005260208060002060005b858110156139b05781548a820152908401908201613997565b50505082870194505b5050505092915050565b60006139cf8285613950565b652f6d6574612f60d01b815283516139ee8160068401602088016131ed565b01600601949350505050565b6000613a068284613950565b6d0bdb595d184bd8dbdb9d1c9858dd60921b8152600e019392505050565b6001600160801b03828116828216039080821115613a4457613a44613685565b5092915050565b6001600160801b03818116838216019080821115613a4457613a44613685565b600081613a7a57613a7a613685565b506000190190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ab46080830184613211565b9695505050505050565b600060208284031215613ad057600080fd5b81516131e6816131b3565b600082613aea57613aea613727565b50069056fea26469706673582212203990fd673a2da65a80d7169c3d14b6f9c9703a3f883e7726af0ac2010d862cf464736f6c63430008110033
Deployed Bytecode Sourcemap
57442:8092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41098:422;;;;;;;;;;-1:-1:-1;41098:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;41098:422:0;;;;;;;;43063:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59897:663::-;;;;;;:::i;:::-;;:::i;:::-;;44758:292;;;;;;;;;;-1:-1:-1;44758:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:55:1;;;1679:74;;1667:2;1652:18;44758:292:0;1533:226:1;44279:413:0;;;;;;;;;;-1:-1:-1;44279:413:0;;;;;:::i;:::-;;:::i;57913:31::-;;;;;;;;;;;;;;;;;;;2370:25:1;;;2358:2;2343:18;57913:31:0;2224:177:1;58788:74:0;;;;;;;;;;;;58820:42;58788:74;;38306:100;;;;;;;;;;-1:-1:-1;38359:7:0;38386:12;38306:100;;62283:333;;;;;;;;;;-1:-1:-1;62283:333:0;;;;;:::i;:::-;;:::i;45785:162::-;;;;;;;;;;-1:-1:-1;45785:162:0;;;;;:::i;:::-;;:::i;36740:31::-;;;;;;;;;;;;;;;;57951:36;;;;;;;;;;;;57983:4;57951:36;;40162:864;;;;;;;;;;-1:-1:-1;40162:864:0;;;;;:::i;:::-;;:::i;63001:504::-;;;;;;:::i;:::-;;:::i;58208:58::-;;;;;;;;;;;;;;;;63569:322;;;;;;;;;;;;;:::i;46018:177::-;;;;;;;;;;-1:-1:-1;46018:177:0;;;;;:::i;:::-;;:::i;60568:113::-;;;;;;;;;;-1:-1:-1;60568:113:0;;;;;:::i;:::-;;:::i;61018:512::-;;;;;;;;;;;;;:::i;38483:228::-;;;;;;;;;;-1:-1:-1;38483:228:0;;;;;:::i;:::-;;:::i;60866:92::-;;;;;;;;;;-1:-1:-1;60866:92:0;;;;;:::i;:::-;;:::i;42870:124::-;;;;;;;;;;-1:-1:-1;42870:124:0;;;;;:::i;:::-;;:::i;41584:258::-;;;;;;;;;;-1:-1:-1;41584:258:0;;;;;:::i;:::-;;:::i;11517:103::-;;;;;;;;;;;;;:::i;58523:76::-;;;;;;;;;;-1:-1:-1;58523:76:0;;;;-1:-1:-1;;;;;58523:76:0;;;58093:52;;;;;;;;;;;;;;;;64995:119;;;;;;;;;;-1:-1:-1;64995:119:0;;;;;:::i;:::-;;:::i;64379:376::-;;;;;;;;;;-1:-1:-1;64379:376:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57869:37::-;;;;;;;;;;;;;;;;57827:35;;;;;;;;;;;;;;;;10869:87;;;;;;;;;;-1:-1:-1;10942:6:0;;-1:-1:-1;;;;;10942:6:0;10869:87;;65122:92;;;;;;;;;;-1:-1:-1;65122:92:0;;;;;:::i;:::-;;:::i;43232:104::-;;;;;;;;;;;;;:::i;58382:47::-;;;;;;;;;;-1:-1:-1;58382:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4859:4:1;4847:17;;;4829:36;;4817:2;4802:18;58382:47:0;4687:184:1;64885:102:0;;;;;;;;;;-1:-1:-1;64885:102:0;;;;;:::i;:::-;;:::i;65222:307::-;;;;;;;;;;-1:-1:-1;65222:307:0;;;;;:::i;:::-;;:::i;45122:311::-;;;;;;;;;;-1:-1:-1;45122:311:0;;;;;:::i;:::-;;:::i;62624:369::-;;;;;;;;;;;;;:::i;58034:52::-;;;;;;;;;;;;;;;;46266:355;;;;;;;;;;-1:-1:-1;46266:355:0;;;;;:::i;:::-;;:::i;58606:76::-;;;;;;;;;;-1:-1:-1;58606:76:0;;;;-1:-1:-1;;;;;58606:76:0;;;58330:45;;;;;;;;;;-1:-1:-1;58330:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63899:329;;;;;;;;;;-1:-1:-1;63899:329:0;;;;;:::i;:::-;;:::i;53330:43::-;;;;;;;;;;;;;;;;64763:113;;;;;;;;;;-1:-1:-1;64763:113:0;;;;;:::i;:::-;;:::i;60689:169::-;;;;;;;;;;-1:-1:-1;60689:169:0;;;;;:::i;:::-;;:::i;61538:737::-;;;;;;;;;;-1:-1:-1;61538:737:0;;;;;:::i;:::-;;:::i;58874:78::-;;;;;;;;;;;;58910:42;58874:78;;64236:135;;;;;;;;;;;;;:::i;45504:214::-;;;;;;;;;;-1:-1:-1;45504:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;45675:25:0;;;45646:4;45675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45504:214;58152:49;;;;;;;;;;;;;;;;11775:201;;;;;;;;;;-1:-1:-1;11775:201:0;;;;;:::i;:::-;;:::i;41098:422::-;41245:4;-1:-1:-1;;;;;;41287:40:0;;-1:-1:-1;;;41287:40:0;;:105;;-1:-1:-1;;;;;;;41344:48:0;;-1:-1:-1;;;41344:48:0;41287:105;:172;;;-1:-1:-1;;;;;;;41409:50:0;;-1:-1:-1;;;41409:50:0;41287:172;:225;;;-1:-1:-1;;;;;;;;;;17776:40:0;;;41476:36;41267:245;41098:422;-1:-1:-1;;41098:422:0:o;43063:100::-;43117:13;43150:5;43143:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43063:100;:::o;59897:663::-;59462:10;59476:9;59462:23;59459:57;;59494:22;;-1:-1:-1;;;59494:22:0;;;;;;;;;;;59459:57;59550:10;59529:32;;;;:20;:32;;;;;;59565:15;59529:51;;59526:85;;59589:22;;-1:-1:-1;;;59589:22:0;;;;;;;;;;;59526:85;57983:4:::1;60017:13;60001;38359:7:::0;38386:12;;38306:100;60001:13:::1;:29;;;;:::i;:::-;:37;59998:70;;;60047:21;::::0;-1:-1:-1;;;60047:21:0;;57983:4:::1;60047:21;::::0;::::1;2370:25:1::0;2343:18;;60047:21:0::1;;;;;;;;59998:70;60083:9;::::0;:14;;:43:::1;;;60113:13;60101:9;;:25;60083:43;60079:75;;;60135:19;;-1:-1:-1::0;;;60135:19:0::1;;;;;;;;;;;60079:75;60185:10;;60169:13;:26;:83;;;;60242:10;;60226:13;60199:24;60212:10;60199:12;:24::i;:::-;:40;;;;:::i;:::-;:53;60169:83;60165:120;;;60261:24;::::0;-1:-1:-1;;;60261:24:0;;60283:1:::1;60261:24;::::0;::::1;2370:25:1::0;2343:18;;60261:24:0::1;2224:177:1::0;60165:120:0::1;60319:13;60311:5;;:21;;;;:::i;:::-;60299:9;:33;60296:84;;;60366:13;60358:5;;:21;;;;:::i;:::-;60341:39;;-1:-1:-1::0;;;60341:39:0::1;;;;;;2370:25:1::0;;2358:2;2343:18;;2224:177;60296:84:0::1;60414:10;60393:32;::::0;;;:20:::1;:32;::::0;;;;60428:15:::1;60393:50:::0;;60454:9:::1;:14:::0;;60467:1:::1;::::0;60393:32;60454:14:::1;::::0;60467:1;;60454:14:::1;:::i;:::-;::::0;;;-1:-1:-1;60479:36:0::1;::::0;-1:-1:-1;60489:10:0::1;60501:13:::0;60479:9:::1;:36::i;:::-;60531:21;::::0;2370:25:1;;;60531:21:0::1;::::0;2358:2:1;2343:18;60531:21:0::1;;;;;;;;59897:663:::0;:::o;44758:292::-;44862:7;44909:16;44917:7;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;44909:16;44887:111;;;;-1:-1:-1;;;44887:111:0;;10046:2:1;44887:111:0;;;10028:21:1;10085:2;10065:18;;;10058:30;10124:34;10104:18;;;10097:62;-1:-1:-1;;;10175:18:1;;;10168:43;10228:19;;44887:111:0;9844:409:1;44887:111:0;-1:-1:-1;45018:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45018:24:0;;44758:292::o;44279:413::-;44352:13;44368:24;44384:7;44368:15;:24::i;:::-;44352:40;;44417:5;-1:-1:-1;;;;;44411:11:0;:2;-1:-1:-1;;;;;44411:11:0;;44403:58;;;;-1:-1:-1;;;44403:58:0;;10460:2:1;44403:58:0;;;10442:21:1;10499:2;10479:18;;;10472:30;10538:34;10518:18;;;10511:62;-1:-1:-1;;;10589:18:1;;;10582:32;10631:19;;44403:58:0;10258:398:1;44403:58:0;9500:10;-1:-1:-1;;;;;44496:21:0;;;;:62;;-1:-1:-1;44521:37:0;44538:5;9500:10;45504:214;:::i;44521:37::-;44474:169;;;;-1:-1:-1;;;44474:169:0;;10863:2:1;44474:169:0;;;10845:21:1;10902:2;10882:18;;;10875:30;10941:34;10921:18;;;10914:62;11012:27;10992:18;;;10985:55;11057:19;;44474:169:0;10661:421:1;44474:169:0;44656:28;44665:2;44669:7;44678:5;44656:8;:28::i;:::-;44341:351;44279:413;;:::o;62283:333::-;62342:10;62356:9;62342:23;62339:57;;62374:22;;-1:-1:-1;;;62374:22:0;;;;;;;;;;;62339:57;62435:10;62415:16;62423:7;62415;:16::i;:::-;-1:-1:-1;;;;;62415:30:0;;62407:65;;;;-1:-1:-1;;;62407:65:0;;11289:2:1;62407:65:0;;;11271:21:1;11328:2;11308:18;;;11301:30;11367:24;11347:18;;;11340:52;11409:18;;62407:65:0;11087:346:1;62407:65:0;62483:14;62489:7;62483:5;:14::i;:::-;62508:9;;62531:11;;62556:21;;62508:70;;-1:-1:-1;;;62508:70:0;;-1:-1:-1;;;;;62531:11:0;;;62508:70;;;11701:34:1;62543:10:0;11751:18:1;;;11744:43;11803:18;;;11796:34;;;;62508:9:0;;;:22;;11613:18:1;;62508:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;62594:14:0;;2370:25:1;;;62594:14:0;;2358:2:1;2343:18;62594:14:0;2224:177:1;45785:162:0;45911:28;45921:4;45927:2;45931:7;45911:9;:28::i;40162:864::-;40287:7;40328:16;40338:5;40328:9;:16::i;:::-;40320:5;:24;40312:71;;;;-1:-1:-1;;;40312:71:0;;12293:2:1;40312:71:0;;;12275:21:1;12332:2;12312:18;;;12305:30;12371:34;12351:18;;;12344:62;-1:-1:-1;;;12422:18:1;;;12415:32;12464:19;;40312:71:0;12091:398:1;40312:71:0;40394:22;38386:12;;;40394:22;;40526:426;40550:14;40546:1;:18;40526:426;;;40586:31;40620:14;;;:11;:14;;;;;;;;;40586:48;;;;;;;;;-1:-1:-1;;;;;40586:48:0;;;;;-1:-1:-1;;;40586:48:0;;;;;;;;;;;;40653:28;40649:103;;40722:14;;;-1:-1:-1;40649:103:0;40791:5;-1:-1:-1;;;;;40770:26:0;:17;-1:-1:-1;;;;;40770:26:0;;40766:175;;40836:5;40821:11;:20;40817:77;;-1:-1:-1;40873:1:0;-1:-1:-1;40866:8:0;;-1:-1:-1;;;40866:8:0;40817:77;40912:13;;;;:::i;:::-;;;;40766:175;-1:-1:-1;40566:3:0;;;;:::i;:::-;;;;40526:426;;;-1:-1:-1;40962:56:0;;-1:-1:-1;;;40962:56:0;;12836:2:1;40962:56:0;;;12818:21:1;12875:2;12855:18;;;12848:30;12914:34;12894:18;;;12887:62;-1:-1:-1;;;12965:18:1;;;12958:44;13019:19;;40962:56:0;12634:410:1;63001:504:0;63070:10;63084:9;63070:23;63067:57;;63102:22;;-1:-1:-1;;;63102:22:0;;;;;;;;;;;63067:57;63178:19;;63143:9;;63163:11;;63143:32;;-1:-1:-1;;;63143:32:0;;-1:-1:-1;;;;;63163:11:0;;;63143:32;;;1679:74:1;63143:9:0;;;:19;;1652:18:1;;63143:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;63135:95;;;;-1:-1:-1;;;63135:95:0;;13440:2:1;63135:95:0;;;13422:21:1;13479:2;13459:18;;;13452:30;13518;13498:18;;;13491:58;13566:18;;63135:95:0;13238:352:1;63135:95:0;63258:24;;63249:6;:33;63241:86;;;;-1:-1:-1;;;63241:86:0;;13797:2:1;63241:86:0;;;13779:21:1;13836:2;13816:18;;;13809:30;13875:34;13855:18;;;13848:62;-1:-1:-1;;;13926:18:1;;;13919:38;13974:19;;63241:86:0;13595:404:1;63241:86:0;63368:19;;63359:28;;:6;:28;:::i;:::-;63346:9;:41;;63338:81;;;;-1:-1:-1;;;63338:81:0;;14206:2:1;63338:81:0;;;14188:21:1;14245:2;14225:18;;;14218:30;14284:29;14264:18;;;14257:57;14331:18;;63338:81:0;14004:351:1;63338:81:0;63430:9;;63453:11;;-1:-1:-1;;;;;63430:9:0;;;;:22;;63453:11;63466:10;63478:17;:6;63488;63478:17;:::i;:::-;63430:67;;-1:-1:-1;;;;;;63430:67:0;;;;;;;-1:-1:-1;;;;;11719:15:1;;;63430:67:0;;;11701:34:1;11771:15;;;;11751:18;;;11744:43;11803:18;;;11796:34;11613:18;;63430:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63001:504;:::o;63569:322::-;10942:6;;-1:-1:-1;;;;;10942:6:0;59696:10;:21;;:59;;-1:-1:-1;59736:10:0;58820:42;59736:19;59696:59;:99;;;-1:-1:-1;59772:10:0;58910:42;59772:23;59696:99;59674:183;;;;-1:-1:-1;;;59674:183:0;;14562:2:1;59674:183:0;;;14544:21:1;14601:2;14581:18;;;14574:30;14640:34;14620:18;;;14613:62;-1:-1:-1;;;14691:18:1;;;14684:32;14733:19;;59674:183:0;14360:398:1;59674:183:0;63653:1:::1;63629:21;:25;63621:60;;;::::0;-1:-1:-1;;;63621:60:0;;14965:2:1;63621:60:0::1;::::0;::::1;14947:21:1::0;15004:2;14984:18;;;14977:30;15043:24;15023:18;;;15016:52;15085:18;;63621:60:0::1;14763:346:1::0;63621:60:0::1;63712:21;58820:42;63746:43;63770:13;63780:3;63712:21:::0;63770:13:::1;:::i;:::-;:18;::::0;63786:2:::1;63770:18;:::i;:::-;63746:43;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;58910:42:0::1;63818:47;63846:13;63856:3;63846:7:::0;:13:::1;:::i;:::-;:18;::::0;63862:2:::1;63846:18;:::i;:::-;63818:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;46018:177:::0;46148:39;46165:4;46171:2;46175:7;46148:39;;;;;;;;;;;;:16;:39::i;60568:113::-;10942:6;;-1:-1:-1;;;;;10942:6:0;59315:10;:21;;;:59;;-1:-1:-1;59362:11:0;;-1:-1:-1;;;;;59362:11:0;59340:10;:34;;59315:59;59312:82;;;59383:11;;-1:-1:-1;;;59383:11:0;;;;;;;;;;;59312:82;60629:14:::1;60635:7;60629:5;:14::i;:::-;60659;::::0;2370:25:1;;;60659:14:0::1;::::0;2358:2:1;2343:18;60659:14:0::1;2224:177:1::0;61018:512:0;61065:10;61079:9;61065:23;61062:57;;61097:22;;-1:-1:-1;;;61097:22:0;;;;;;;;;;;61062:57;61133:14;;:36;;-1:-1:-1;;;61133:36:0;;61158:10;61133:36;;;1679:74:1;-1:-1:-1;;;;;61133:14:0;;;;:24;;1652:18:1;;61133:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61173:1;61133:41;61130:72;;61183:19;;-1:-1:-1;;;61183:19:0;;;;;;;;;;;61130:72;61241:14;;:40;;-1:-1:-1;;;61241:40:0;;61270:10;61241:40;;;1679:74:1;61213:25:0;;-1:-1:-1;;;;;61241:14:0;;:28;;1652:18:1;;61241:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61241:40:0;;;;;;;;;;;;:::i;:::-;61213:68;;61299:9;61294:200;61318:8;:15;61314:1;:19;61294:200;;;61389:4;-1:-1:-1;;;;;61357:37:0;:20;61365:8;61374:1;61365:11;;;;;;;;:::i;:::-;;;;;;;61357:7;:20::i;:::-;-1:-1:-1;;;;;61357:37:0;;61354:129;;61411:56;61436:10;61447:8;61456:1;61447:11;;;;;;;;:::i;:::-;;;;;;;61411:56;;;;;;;;;;;;;-1:-1:-1;;;61411:56:0;;;:24;:56::i;:::-;61335:3;;;;:::i;:::-;;;;61294:200;;;-1:-1:-1;61509:13:0;;;;;;;61044:486;61018:512::o;38483:228::-;38586:7;38386:12;;38619:5;:21;38611:69;;;;-1:-1:-1;;;38611:69:0;;16591:2:1;38611:69:0;;;16573:21:1;16630:2;16610:18;;;16603:30;16669:34;16649:18;;;16642:62;-1:-1:-1;;;16720:18:1;;;16713:33;16763:19;;38611:69:0;16389:399:1;38611:69:0;-1:-1:-1;38698:5:0;38483:228::o;60866:92::-;10755:13;:11;:13::i;:::-;60937:7:::1;:13;60947:3:::0;;60937:7;:13:::1;:::i;42870:124::-:0;42934:7;42961:20;42973:7;42961:11;:20::i;:::-;:25;;42870:124;-1:-1:-1;;42870:124:0:o;41584:258::-;41648:7;-1:-1:-1;;;;;41690:19:0;;41668:112;;;;-1:-1:-1;;;41668:112:0;;19053:2:1;41668:112:0;;;19035:21:1;19092:2;19072:18;;;19065:30;19131:34;19111:18;;;19104:62;-1:-1:-1;;;19182:18:1;;;19175:41;19233:19;;41668:112:0;18851:407:1;41668:112:0;-1:-1:-1;;;;;;41806:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;41806:27:0;;41584:258::o;11517:103::-;10755:13;:11;:13::i;:::-;11582:30:::1;11609:1;11582:18;:30::i;:::-;11517:103::o:0;64995:119::-;10755:13;:11;:13::i;:::-;65075:11:::1;:31:::0;;-1:-1:-1;;;;;;65075:31:0::1;-1:-1:-1::0;;;;;65075:31:0;;;::::1;::::0;;;::::1;::::0;;64995:119::o;64379:376::-;64465:16;64499:18;64520:16;64530:5;64520:9;:16::i;:::-;64499:37;;64547:25;64589:10;64575:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64575:25:0;;64547:53;;64616:9;64611:111;64635:10;64631:1;:14;64611:111;;;64681:29;64701:5;64708:1;64681:19;:29::i;:::-;64667:8;64676:1;64667:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;64647:3;;;;:::i;:::-;;;;64611:111;;;-1:-1:-1;64739:8:0;64379:376;-1:-1:-1;;;64379:376:0:o;65122:92::-;10755:13;:11;:13::i;:::-;65189:5:::1;:17:::0;65122:92::o;43232:104::-;43288:13;43321:7;43314:14;;;;;:::i;64885:102::-;10755:13;:11;:13::i;:::-;64956:10:::1;:23:::0;64885:102::o;65222:307::-;10755:13;:11;:13::i;:::-;65351:24:::1;:35:::0;;;;65397:20:::1;:34:::0;;;;65442:21:::1;:36:::0;65489:19:::1;:32:::0;65222:307::o;45122:311::-;9500:10;-1:-1:-1;;;;;45240:24:0;;;45232:63;;;;-1:-1:-1;;;45232:63:0;;19465:2:1;45232:63:0;;;19447:21:1;19504:2;19484:18;;;19477:30;19543:28;19523:18;;;19516:56;19589:18;;45232:63:0;19263:350:1;45232:63:0;9500:10;45308:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45308:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45308:53:0;;;;;;;;;;45377:48;;540:41:1;;;45308:42:0;;9500:10;45377:48;;513:18:1;45377:48:0;;;;;;;45122:311;;:::o;62624:369::-;62667:10;62681:9;62667:23;62664:57;;62699:22;;-1:-1:-1;;;62699:22:0;;;;;;;;;;;62664:57;62774:20;;62740:9;;:31;;-1:-1:-1;;;62740:31:0;;62760:10;62740:31;;;1679:74:1;-1:-1:-1;;;;;62740:9:0;;;;:19;;1652:18:1;;62740:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;62732:98;;;;-1:-1:-1;;;62732:98:0;;19820:2:1;62732:98:0;;;19802:21:1;19859:2;19839:18;;;19832:30;19898:33;19878:18;;;19871:61;19949:18;;62732:98:0;19618:355:1;62732:98:0;62841:9;;62876:11;;62889:20;;62841:69;;-1:-1:-1;;;62841:69:0;;62864:10;62841:69;;;11701:34:1;-1:-1:-1;;;;;62876:11:0;;;11751:18:1;;;11744:43;11803:18;;;11796:34;;;;62841:9:0;;;:22;;11613:18:1;;62841:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62921:24;62931:10;62943:1;62921:9;:24::i;:::-;62962:23;62972:12;;62962:23;;;;2370:25:1;;2358:2;2343:18;;2224:177;62962:23:0;;;;;;;;62624:369::o;46266:355::-;46425:28;46435:4;46441:2;46445:7;46425:9;:28::i;:::-;46486:48;46509:4;46515:2;46519:7;46528:5;46486:22;:48::i;:::-;46464:149;;;;-1:-1:-1;;;46464:149:0;;;;;;;:::i;:::-;46266:355;;;;:::o;63899:329::-;64017:13;64056:16;64064:7;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;64056:16;64048:48;;;;-1:-1:-1;;;64048:48:0;;20600:2:1;64048:48:0;;;20582:21:1;20639:2;20619:18;;;20612:30;20678:22;20658:18;;;20651:50;20718:18;;64048:48:0;20398:344:1;64048:48:0;64162:7;64193:25;64210:7;64193:16;:25::i;:::-;64131:88;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64117:103;;63899:329;;;:::o;64763:113::-;64821:7;64848:20;64862:5;64848:13;:20::i;60689:169::-;10942:6;;-1:-1:-1;;;;;10942:6:0;59315:10;:21;;;:59;;-1:-1:-1;59362:11:0;;-1:-1:-1;;;;;59362:11:0;59340:10;:34;;59315:59;59312:82;;;59383:11;;-1:-1:-1;;;59383:11:0;;;;;;;;;;;59312:82;60767:9:::1;60762:89;60786:5;:12;60782:1;:16;60762:89;;;60820:4;-1:-1:-1::0;;;;;60820:9:0::1;;60830:5;60836:1;60830:8;;;;;;;;:::i;:::-;;;;;;;60820:19;;;;;;;;;;;;;2370:25:1::0;;2358:2;2343:18;;2224:177;60820:19:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60800:3;;;;;:::i;:::-;;;;60762:89;;61538:737:::0;61608:8;:15;61627:1;61608:20;:82;;;-1:-1:-1;61633:7:0;;:29;;-1:-1:-1;;;61633:29:0;;61651:10;61633:29;;;1679:74:1;61665:1:0;;-1:-1:-1;;;;;61633:7:0;;:17;;1652:18:1;;61633:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;:56;;;;;61670:8;:15;61688:1;61670:19;61633:56;61600:137;;;;-1:-1:-1;;;61600:137:0;;22216:2:1;61600:137:0;;;22198:21:1;22255:2;22235:18;;;22228:30;22294:34;22274:18;;;22267:62;-1:-1:-1;;;22345:18:1;;;22338:40;22395:19;;61600:137:0;22014:406:1;61600:137:0;61768:1;61756:9;;:13;61748:54;;;;-1:-1:-1;;;61748:54:0;;22627:2:1;61748:54:0;;;22609:21:1;22666:2;22646:18;;;22639:30;22705;22685:18;;;22678:58;22753:18;;61748:54:0;22425:352:1;61748:54:0;61845:10;-1:-1:-1;;;;;61821:34:0;:20;61829:8;61838:1;61829:11;;;;;;;;:::i;61821:20::-;-1:-1:-1;;;;;61821:34:0;;61813:75;;;;-1:-1:-1;;;61813:75:0;;22984:2:1;61813:75:0;;;22966:21:1;23023:2;23003:18;;;22996:30;23062;23042:18;;;23035:58;23110:18;;61813:75:0;22782:352:1;61813:75:0;61926:1;61909:218;61933:8;:15;61929:1;:19;61909:218;;;62002:10;-1:-1:-1;;;;;61978:34:0;:20;61986:8;61995:1;61986:11;;;;;;;;:::i;61978:20::-;-1:-1:-1;;;;;61978:34:0;;61970:74;;;;-1:-1:-1;;;61970:74:0;;23341:2:1;61970:74:0;;;23323:21:1;23380:2;23360:18;;;23353:30;23419:29;23399:18;;;23392:57;23466:18;;61970:74:0;23139:351:1;61970:74:0;62059:18;62065:8;62074:1;62065:11;;;;;;;;:::i;:::-;;;;;;;62059:5;:18::i;:::-;62097;62103:8;62112:1;62103:11;;;;;;;;:::i;:::-;;;;;;;62097:18;;;;2370:25:1;;2358:2;2343:18;;2224:177;62097:18:0;;;;;;;;61950:3;;;;:::i;:::-;;;;61909:218;;;;62137:24;62147:10;62159:1;62137:9;:24::i;:::-;62172:9;;62195:11;;62220:21;;62172:70;;-1:-1:-1;;;62172:70:0;;-1:-1:-1;;;;;62195:11:0;;;62172:70;;;11701:34:1;62207:10:0;11751:18:1;;;11744:43;11803:18;;;11796:34;;;;62172:9:0;;;:22;;11613:18:1;;62172:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;62258:9:0;;62265:1;2370:25:1;;62258:9:0;;2358:2:1;2343:18;62258:9:0;2224:177:1;64236:135:0;64280:13;64337:7;64320:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;64306:57;;64236:135;:::o;11775:201::-;10755:13;:11;:13::i;:::-;-1:-1:-1;;;;;11864:22:0;::::1;11856:73;;;::::0;-1:-1:-1;;;11856:73:0;;24257:2:1;11856:73:0::1;::::0;::::1;24239:21:1::0;24296:2;24276:18;;;24269:30;24335:34;24315:18;;;24308:62;-1:-1:-1;;;24386:18:1;;;24379:36;24432:19;;11856:73:0::1;24055:402:1::0;11856:73:0::1;11940:28;11959:8;11940:18;:28::i;:::-;11775:201:::0;:::o;1421:326::-;-1:-1:-1;;;;;1716:19:0;;:23;;;1421:326::o;47431:104::-;47500:27;47510:2;47514:8;47500:27;;;;;;;;;;;;:9;:27::i;53126:196::-;53241:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53241:29:0;-1:-1:-1;;;;;53241:29:0;;;;;;;;;53286:28;;53241:24;;53286:28;;;;;;;53126:196;;;:::o;39052:805::-;39104:13;39120:24;39136:7;39120:15;:24::i;:::-;39104:40;;39334:24;39350:7;39334:15;:24::i;:::-;39406;;;;:15;:24;;;;;;;;39399:31;;-1:-1:-1;;;;;;39399:31:0;;;-1:-1:-1;;;;;39651:19:0;;;;;:12;:19;;;;;:32;;-1:-1:-1;;39651:32:0;;-1:-1:-1;;;;;39651:32:0;;;-1:-1:-1;;39651:32:0;;;;;;;39712:20;;;:11;:20;;;;;;39705:27;;-1:-1:-1;;;;;;39705:27:0;;;39750:36;39651:19;;-1:-1:-1;39406:24:0;;39750:36;;39406:24;;39750:36;63430:67;63001:504;:::o;51299:1709::-;51414:35;51452:20;51464:7;51452:11;:20::i;:::-;51527:18;;51414:58;;-1:-1:-1;51485:22:0;;-1:-1:-1;;;;;51511:34:0;9500:10;-1:-1:-1;;;;;51511:34:0;;:87;;;-1:-1:-1;9500:10:0;51562:20;51574:7;51562:11;:20::i;:::-;-1:-1:-1;;;;;51562:36:0;;51511:87;:154;;;-1:-1:-1;51632:18:0;;51615:50;;9500:10;45504:214;:::i;51615:50::-;51485:181;;51701:17;51679:117;;;;-1:-1:-1;;;51679:117:0;;24664:2:1;51679:117:0;;;24646:21:1;24703:2;24683:18;;;24676:30;24742:34;24722:18;;;24715:62;24813:20;24793:18;;;24786:48;24851:19;;51679:117:0;24462:414:1;51679:117:0;51853:4;-1:-1:-1;;;;;51831:26:0;:13;:18;;;-1:-1:-1;;;;;51831:26:0;;51809:114;;;;-1:-1:-1;;;51809:114:0;;25083:2:1;51809:114:0;;;25065:21:1;25122:2;25102:18;;;25095:30;25161:34;25141:18;;;25134:62;-1:-1:-1;;;25212:18:1;;;25205:36;25258:19;;51809:114:0;24881:402:1;51809:114:0;-1:-1:-1;;;;;51942:16:0;;51934:66;;;;-1:-1:-1;;;51934:66:0;;25490:2:1;51934:66:0;;;25472:21:1;25529:2;25509:18;;;25502:30;25568:34;25548:18;;;25541:62;-1:-1:-1;;;25619:18:1;;;25612:35;25664:19;;51934:66:0;25288:401:1;51934:66:0;52121:49;52138:1;52142:7;52151:13;:18;;;52121:8;:49::i;:::-;-1:-1:-1;;;;;52183:18:0;;;;;;:12;:18;;;;;:31;;52213:1;;52183:18;:31;;52213:1;;-1:-1:-1;;;;;52183:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;52183:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52225:16:0;;-1:-1:-1;52225:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;52225:16:0;;:29;;-1:-1:-1;;52225:29:0;;:::i;:::-;;;-1:-1:-1;;;;;52225:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52288:43:0;;;;;;;;-1:-1:-1;;;;;52288:43:0;;;;;;52314:15;52288:43;;;;;;;;;-1:-1:-1;52265:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;52265:66:0;-1:-1:-1;;;;;;52265:66:0;;;;;;;;;;;52593:11;52277:7;-1:-1:-1;52593:11:0;:::i;:::-;52660:1;52619:24;;;:11;:24;;;;;:29;52571:33;;-1:-1:-1;;;;;;52619:29:0;52615:288;;52683:20;52691:11;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;52683:20;52679:213;;;52751:125;;;;;;;;52788:18;;-1:-1:-1;;;;;52751:125:0;;;;;;52829:28;;;;52751:125;;;;;;;;;;-1:-1:-1;52724:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;52724:152:0;-1:-1:-1;;;;;;52724:152:0;;;;;;;;;;;;52679:213;52939:7;52935:2;-1:-1:-1;;;;;52920:27:0;52929:4;-1:-1:-1;;;;;52920:27:0;;;;;;;;;;;52958:42;51403:1605;;;51299:1709;;;:::o;46692:363::-;46829:49;46859:4;46866:2;46870:7;46829:21;:49::i;:::-;46911:57;46942:4;46949:2;46953:7;46962:5;46911:22;:57::i;:::-;46889:158;;;;-1:-1:-1;;;46889:158:0;;;;;;;:::i;11034:132::-;10942:6;;-1:-1:-1;;;;;10942:6:0;9500:10;11098:23;11090:68;;;;-1:-1:-1;;;11090:68:0;;26303:2:1;11090:68:0;;;26285:21:1;;;26322:18;;;26315:30;26381:34;26361:18;;;26354:62;26433:18;;11090:68:0;26101:356:1;42124:682:0;-1:-1:-1;;;;;;;;;;;;;;;;;42259:16:0;42267:7;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;42259:16;42251:71;;;;-1:-1:-1;;;42251:71:0;;26664:2:1;42251:71:0;;;26646:21:1;26703:2;26683:18;;;26676:30;26742:34;26722:18;;;26715:62;-1:-1:-1;;;26793:18:1;;;26786:40;26843:19;;42251:71:0;26462:406:1;42251:71:0;42335:26;42387:12;42376:7;:23;42372:103;;42437:22;42447:12;42437:7;:22;:::i;:::-;:26;;42462:1;42437:26;:::i;:::-;42416:47;;42372:103;42507:7;42487:242;42524:18;42516:4;:26;42487:242;;42567:31;42601:17;;;:11;:17;;;;;;;;;42567:51;;;;;;;;;-1:-1:-1;;;;;42567:51:0;;;;;-1:-1:-1;;;42567:51:0;;;;;;;;;;;;42637:28;42633:85;;42693:9;42124:682;-1:-1:-1;;;;42124:682:0:o;42633:85::-;-1:-1:-1;42544:6:0;;;;:::i;:::-;;;;42487:242;;;-1:-1:-1;42741:57:0;;-1:-1:-1;;;42741:57:0;;27216:2:1;42741:57:0;;;27198:21:1;27255:2;27235:18;;;27228:30;27294:34;27274:18;;;27267:62;-1:-1:-1;;;27345:18:1;;;27338:45;27400:19;;42741:57:0;27014:411:1;12136:191:0;12229:6;;;-1:-1:-1;;;;;12246:17:0;;;-1:-1:-1;;;;;;12246:17:0;;;;;;;12279:40;;12229:6;;;12246:17;12229:6;;12279:40;;12210:16;;12279:40;12199:128;12136:191;:::o;55001:985::-;55156:4;-1:-1:-1;;;;;55177:13:0;;1716:19;:23;55173:806;;55230:175;;-1:-1:-1;;;55230:175:0;;-1:-1:-1;;;;;55230:36:0;;;;;:175;;9500:10;;55324:4;;55351:7;;55381:5;;55230:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55230:175:0;;;;;;;;-1:-1:-1;;55230:175:0;;;;;;;;;;;;:::i;:::-;;;55209:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55592:6;:13;55609:1;55592:18;55588:321;;55635:109;;-1:-1:-1;;;55635:109:0;;;;;;;:::i;55588:321::-;55859:6;55853:13;55844:6;55840:2;55836:15;55829:38;55209:715;-1:-1:-1;;;;;;55469:55:0;-1:-1:-1;;;55469:55:0;;-1:-1:-1;55462:62:0;;55173:806;-1:-1:-1;55963:4:0;55173:806;55001:985;;;;;;:::o;12764:723::-;12820:13;13041:5;13050:1;13041:10;13037:53;;-1:-1:-1;;13068:10:0;;;;;;;;;;;;-1:-1:-1;;;13068:10:0;;;;;12764:723::o;13037:53::-;13115:5;13100:12;13156:78;13163:9;;13156:78;;13189:8;;;;:::i;:::-;;-1:-1:-1;13212:10:0;;-1:-1:-1;13220:2:0;13212:10;;:::i;:::-;;;13156:78;;;13244:19;13276:6;13266:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13266:17:0;;13244:39;;13294:154;13301:10;;13294:154;;13328:11;13338:1;13328:11;;:::i;:::-;;-1:-1:-1;13397:10:0;13405:2;13397:5;:10;:::i;:::-;13384:24;;:2;:24;:::i;:::-;13371:39;;13354:6;13361;13354:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;13425:11:0;13434:2;13425:11;;:::i;:::-;;;13294:154;;41850:266;41911:7;-1:-1:-1;;;;;41953:19:0;;41931:118;;;;-1:-1:-1;;;41931:118:0;;28520:2:1;41931:118:0;;;28502:21:1;28559:2;28539:18;;;28532:30;28598:34;28578:18;;;28571:62;28669:19;28649:18;;;28642:47;28706:19;;41931:118:0;28318:413:1;41931:118:0;-1:-1:-1;;;;;;42075:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;42075:32:0;;-1:-1:-1;;;;;42075:32:0;;41850:266::o;48399:1400::-;48522:20;48545:12;-1:-1:-1;;;;;48576:16:0;;48568:62;;;;-1:-1:-1;;;48568:62:0;;28938:2:1;48568:62:0;;;28920:21:1;28977:2;28957:18;;;28950:30;29016:34;28996:18;;;28989:62;-1:-1:-1;;;29067:18:1;;;29060:31;29108:19;;48568:62:0;28736:397:1;48568:62:0;48775:21;48783:12;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;48775:21;48774:22;48766:64;;;;-1:-1:-1;;;48766:64:0;;29340:2:1;48766:64:0;;;29322:21:1;29379:2;29359:18;;;29352:30;29418:31;29398:18;;;29391:59;29467:18;;48766:64:0;29138:353:1;48766:64:0;48861:12;48849:8;:24;;48841:71;;;;-1:-1:-1;;;48841:71:0;;29698:2:1;48841:71:0;;;29680:21:1;29737:2;29717:18;;;29710:30;29776:34;29756:18;;;29749:62;-1:-1:-1;;;29827:18:1;;;29820:32;29869:19;;48841:71:0;29496:398:1;48841:71:0;-1:-1:-1;;;;;49032:16:0;;48999:30;49032:16;;;:12;:16;;;;;;;;;48999:49;;;;;;;;;-1:-1:-1;;;;;48999:49:0;;;;;-1:-1:-1;;;48999:49:0;;;;;;;;;;;49078:135;;;;;;;;49104:19;;48999:49;;49078:135;;;49104:39;;49134:8;;49104:39;:::i;:::-;-1:-1:-1;;;;;49078:135:0;;;;;49193:8;49158:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;49078:135:0;;;;;;-1:-1:-1;;;;;49059:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;49059:154:0;;;;;;;;;;;;49252:43;;;;;;;;;;;49278:15;49252:43;;;;;;;;49224:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;49224:71:0;-1:-1:-1;;;;;;49224:71:0;;;;;;;;;;;;;;;;;;49236:12;;49356:325;49380:8;49376:1;:12;49356:325;;;49415:38;;49440:12;;-1:-1:-1;;;;;49415:38:0;;;49432:1;;49415:38;;49432:1;;49415:38;49494:59;49525:1;49529:2;49533:12;49547:5;49494:22;:59::i;:::-;49468:172;;;;-1:-1:-1;;;49468:172:0;;;;;;;:::i;:::-;49655:14;;;;:::i;:::-;;;;49390:3;;;;;:::i;:::-;;;;49356:325;;;-1:-1:-1;49693:12:0;:27;;;49731:60;46266:355;49809:1480;49937:35;49975:20;49987:7;49975:11;:20::i;:::-;49937:58;-1:-1:-1;;;;;;50016:21:0;;50032:4;50016:21;50008:69;;;;-1:-1:-1;;;50008:69:0;;30101:2:1;50008:69:0;;;30083:21:1;30140:2;30120:18;;;30113:30;30179:34;30159:18;;;30152:62;-1:-1:-1;;;30230:18:1;;;30223:33;30273:19;;50008:69:0;29899:399:1;50008:69:0;50134:4;-1:-1:-1;;;;;50112:26:0;:13;:18;;;-1:-1:-1;;;;;50112:26:0;;50090:114;;;;-1:-1:-1;;;50090:114:0;;25083:2:1;50090:114:0;;;25065:21:1;25122:2;25102:18;;;25095:30;25161:34;25141:18;;;25134:62;-1:-1:-1;;;25212:18:1;;;25205:36;25258:19;;50090:114:0;24881:402:1;50090:114:0;-1:-1:-1;;;;;50223:16:0;;50215:66;;;;-1:-1:-1;;;50215:66:0;;25490:2:1;50215:66:0;;;25472:21:1;25529:2;25509:18;;;25502:30;25568:34;25548:18;;;25541:62;-1:-1:-1;;;25619:18:1;;;25612:35;25664:19;;50215:66:0;25288:401:1;50215:66:0;50402:49;50419:1;50423:7;50432:13;:18;;;50402:8;:49::i;:::-;-1:-1:-1;;;;;50464:18:0;;;;;;:12;:18;;;;;:31;;50494:1;;50464:18;:31;;50494:1;;-1:-1:-1;;;;;50464:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;50464:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50506:16:0;;-1:-1:-1;50506:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;50506:16:0;;:29;;-1:-1:-1;;50506:29:0;;:::i;:::-;;;-1:-1:-1;;;;;50506:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50569:43:0;;;;;;;;-1:-1:-1;;;;;50569:43:0;;;;;;50595:15;50569:43;;;;;;;;;-1:-1:-1;50546:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;50546:66:0;-1:-1:-1;;;;;;50546:66:0;;;;;;;;;;;50874:11;50558:7;-1:-1:-1;50874:11:0;:::i;:::-;50941:1;50900:24;;;:11;:24;;;;;:29;50852:33;;-1:-1:-1;;;;;;50900:29:0;50896:288;;50964:20;50972:11;47369:4;47403:12;-1:-1:-1;47393:22:0;47312:111;50964:20;50960:213;;;51032:125;;;;;;;;51069:18;;-1:-1:-1;;;;;51032:125:0;;;;;;51110:28;;;;51032:125;;;;;;;;;;-1:-1:-1;51005:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;51005:152:0;-1:-1:-1;;;;;;51005:152:0;;;;;;;;;;;;50960:213;51220:7;51216:2;-1:-1:-1;;;;;51201:27:0;51210:4;-1:-1:-1;;;;;51201:27:0;;;;;;;;;;;51239:42;49926:1363;;49809:1480;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1764:196::-;1832:20;;-1:-1:-1;;;;;1881:54:1;;1871:65;;1861:93;;1950:1;1947;1940:12;1861:93;1764:196;;;:::o;1965:254::-;2033:6;2041;2094:2;2082:9;2073:7;2069:23;2065:32;2062:52;;;2110:1;2107;2100:12;2062:52;2133:29;2152:9;2133:29;:::i;:::-;2123:39;2209:2;2194:18;;;;2181:32;;-1:-1:-1;;;1965:254:1:o;2406:328::-;2483:6;2491;2499;2552:2;2540:9;2531:7;2527:23;2523:32;2520:52;;;2568:1;2565;2558:12;2520:52;2591:29;2610:9;2591:29;:::i;:::-;2581:39;;2639:38;2673:2;2662:9;2658:18;2639:38;:::i;:::-;2629:48;;2724:2;2713:9;2709:18;2696:32;2686:42;;2406:328;;;;;:::o;2739:592::-;2810:6;2818;2871:2;2859:9;2850:7;2846:23;2842:32;2839:52;;;2887:1;2884;2877:12;2839:52;2927:9;2914:23;2956:18;2997:2;2989:6;2986:14;2983:34;;;3013:1;3010;3003:12;2983:34;3051:6;3040:9;3036:22;3026:32;;3096:7;3089:4;3085:2;3081:13;3077:27;3067:55;;3118:1;3115;3108:12;3067:55;3158:2;3145:16;3184:2;3176:6;3173:14;3170:34;;;3200:1;3197;3190:12;3170:34;3245:7;3240:2;3231:6;3227:2;3223:15;3219:24;3216:37;3213:57;;;3266:1;3263;3256:12;3213:57;3297:2;3289:11;;;;;3319:6;;-1:-1:-1;2739:592:1;;-1:-1:-1;;;;2739:592:1:o;3336:186::-;3395:6;3448:2;3436:9;3427:7;3423:23;3419:32;3416:52;;;3464:1;3461;3454:12;3416:52;3487:29;3506:9;3487:29;:::i;3773:632::-;3944:2;3996:21;;;4066:13;;3969:18;;;4088:22;;;3915:4;;3944:2;4167:15;;;;4141:2;4126:18;;;3915:4;4210:169;4224:6;4221:1;4218:13;4210:169;;;4285:13;;4273:26;;4354:15;;;;4319:12;;;;4246:1;4239:9;4210:169;;;-1:-1:-1;4396:3:1;;3773:632;-1:-1:-1;;;;;;3773:632:1:o;4410:272::-;4468:6;4521:2;4509:9;4500:7;4496:23;4492:32;4489:52;;;4537:1;4534;4527:12;4489:52;4576:9;4563:23;4626:6;4619:5;4615:18;4608:5;4605:29;4595:57;;4648:1;4645;4638:12;4876:385;4962:6;4970;4978;4986;5039:3;5027:9;5018:7;5014:23;5010:33;5007:53;;;5056:1;5053;5046:12;5007:53;-1:-1:-1;;5079:23:1;;;5149:2;5134:18;;5121:32;;-1:-1:-1;5200:2:1;5185:18;;5172:32;;5251:2;5236:18;5223:32;;-1:-1:-1;4876:385:1;-1:-1:-1;4876:385:1:o;5266:118::-;5352:5;5345:13;5338:21;5331:5;5328:32;5318:60;;5374:1;5371;5364:12;5389:315;5454:6;5462;5515:2;5503:9;5494:7;5490:23;5486:32;5483:52;;;5531:1;5528;5521:12;5483:52;5554:29;5573:9;5554:29;:::i;:::-;5544:39;;5633:2;5622:9;5618:18;5605:32;5646:28;5668:5;5646:28;:::i;:::-;5693:5;5683:15;;;5389:315;;;;;:::o;5709:127::-;5770:10;5765:3;5761:20;5758:1;5751:31;5801:4;5798:1;5791:15;5825:4;5822:1;5815:15;5841:275;5912:2;5906:9;5977:2;5958:13;;-1:-1:-1;;5954:27:1;5942:40;;6012:18;5997:34;;6033:22;;;5994:62;5991:88;;;6059:18;;:::i;:::-;6095:2;6088:22;5841:275;;-1:-1:-1;5841:275:1:o;6121:980::-;6216:6;6224;6232;6240;6293:3;6281:9;6272:7;6268:23;6264:33;6261:53;;;6310:1;6307;6300:12;6261:53;6333:29;6352:9;6333:29;:::i;:::-;6323:39;;6381:2;6402:38;6436:2;6425:9;6421:18;6402:38;:::i;:::-;6392:48;;6487:2;6476:9;6472:18;6459:32;6449:42;;6542:2;6531:9;6527:18;6514:32;6565:18;6606:2;6598:6;6595:14;6592:34;;;6622:1;6619;6612:12;6592:34;6660:6;6649:9;6645:22;6635:32;;6705:7;6698:4;6694:2;6690:13;6686:27;6676:55;;6727:1;6724;6717:12;6676:55;6763:2;6750:16;6785:2;6781;6778:10;6775:36;;;6791:18;;:::i;:::-;6833:53;6876:2;6857:13;;-1:-1:-1;;6853:27:1;6849:36;;6833:53;:::i;:::-;6820:66;;6909:2;6902:5;6895:17;6949:7;6944:2;6939;6935;6931:11;6927:20;6924:33;6921:53;;;6970:1;6967;6960:12;6921:53;7025:2;7020;7016;7012:11;7007:2;7000:5;6996:14;6983:45;7069:1;7064:2;7059;7052:5;7048:14;7044:23;7037:34;;7090:5;7080:15;;;;;6121:980;;;;;;;:::o;7352:183::-;7412:4;7445:18;7437:6;7434:30;7431:56;;;7467:18;;:::i;:::-;-1:-1:-1;7512:1:1;7508:14;7524:4;7504:25;;7352:183::o;7540:891::-;7624:6;7655:2;7698;7686:9;7677:7;7673:23;7669:32;7666:52;;;7714:1;7711;7704:12;7666:52;7754:9;7741:23;7787:18;7779:6;7776:30;7773:50;;;7819:1;7816;7809:12;7773:50;7842:22;;7895:4;7887:13;;7883:27;-1:-1:-1;7873:55:1;;7924:1;7921;7914:12;7873:55;7960:2;7947:16;7983:60;7999:43;8039:2;7999:43;:::i;:::-;7983:60;:::i;:::-;8077:15;;;8159:1;8155:10;;;;8147:19;;8143:28;;;8108:12;;;;8183:19;;;8180:39;;;8215:1;8212;8205:12;8180:39;8239:11;;;;8259:142;8275:6;8270:3;8267:15;8259:142;;;8341:17;;8329:30;;8292:12;;;;8379;;;;8259:142;;;8420:5;7540:891;-1:-1:-1;;;;;;;7540:891:1:o;8436:260::-;8504:6;8512;8565:2;8553:9;8544:7;8540:23;8536:32;8533:52;;;8581:1;8578;8571:12;8533:52;8604:29;8623:9;8604:29;:::i;:::-;8594:39;;8652:38;8686:2;8675:9;8671:18;8652:38;:::i;:::-;8642:48;;8436:260;;;;;:::o;8701:380::-;8780:1;8776:12;;;;8823;;;8844:61;;8898:4;8890:6;8886:17;8876:27;;8844:61;8951:2;8943:6;8940:14;8920:18;8917:38;8914:161;;8997:10;8992:3;8988:20;8985:1;8978:31;9032:4;9029:1;9022:15;9060:4;9057:1;9050:15;8914:161;;8701:380;;;:::o;9086:127::-;9147:10;9142:3;9138:20;9135:1;9128:31;9178:4;9175:1;9168:15;9202:4;9199:1;9192:15;9218:125;9283:9;;;9304:10;;;9301:36;;;9317:18;;:::i;9538:168::-;9611:9;;;9642;;9659:15;;;9653:22;;9639:37;9629:71;;9680:18;;:::i;9711:128::-;9778:9;;;9799:11;;;9796:37;;;9813:18;;:::i;11841:245::-;11908:6;11961:2;11949:9;11940:7;11936:23;11932:32;11929:52;;;11977:1;11974;11967:12;11929:52;12009:9;12003:16;12028:28;12050:5;12028:28;:::i;12494:135::-;12533:3;12554:17;;;12551:43;;12574:18;;:::i;:::-;-1:-1:-1;12621:1:1;12610:13;;12494:135::o;13049:184::-;13119:6;13172:2;13160:9;13151:7;13147:23;13143:32;13140:52;;;13188:1;13185;13178:12;13140:52;-1:-1:-1;13211:16:1;;13049:184;-1:-1:-1;13049:184:1:o;15114:127::-;15175:10;15170:3;15166:20;15163:1;15156:31;15206:4;15203:1;15196:15;15230:4;15227:1;15220:15;15246:120;15286:1;15312;15302:35;;15317:18;;:::i;:::-;-1:-1:-1;15351:9:1;;15246:120::o;15371:881::-;15466:6;15497:2;15540;15528:9;15519:7;15515:23;15511:32;15508:52;;;15556:1;15553;15546:12;15508:52;15589:9;15583:16;15622:18;15614:6;15611:30;15608:50;;;15654:1;15651;15644:12;15608:50;15677:22;;15730:4;15722:13;;15718:27;-1:-1:-1;15708:55:1;;15759:1;15756;15749:12;15708:55;15788:2;15782:9;15811:60;15827:43;15867:2;15827:43;:::i;15811:60::-;15905:15;;;15987:1;15983:10;;;;15975:19;;15971:28;;;15936:12;;;;16011:19;;;16008:39;;;16043:1;16040;16033:12;16008:39;16067:11;;;;16087:135;16103:6;16098:3;16095:15;16087:135;;;16169:10;;16157:23;;16120:12;;;;16200;;;;16087:135;;16257:127;16318:10;16313:3;16309:20;16306:1;16299:31;16349:4;16346:1;16339:15;16373:4;16370:1;16363:15;16919:545;17021:2;17016:3;17013:11;17010:448;;;17057:1;17082:5;17078:2;17071:17;17127:4;17123:2;17113:19;17197:2;17185:10;17181:19;17178:1;17174:27;17168:4;17164:38;17233:4;17221:10;17218:20;17215:47;;;-1:-1:-1;17256:4:1;17215:47;17311:2;17306:3;17302:12;17299:1;17295:20;17289:4;17285:31;17275:41;;17366:82;17384:2;17377:5;17374:13;17366:82;;;17429:17;;;17410:1;17399:13;17366:82;;17640:1206;17764:18;17759:3;17756:27;17753:53;;;17786:18;;:::i;:::-;17815:94;17905:3;17865:38;17897:4;17891:11;17865:38;:::i;:::-;17859:4;17815:94;:::i;:::-;17935:1;17960:2;17955:3;17952:11;17977:1;17972:616;;;;18632:1;18649:3;18646:93;;;-1:-1:-1;18705:19:1;;;18692:33;18646:93;-1:-1:-1;;17597:1:1;17593:11;;;17589:24;17585:29;17575:40;17621:1;17617:11;;;17572:57;18752:78;;17945:895;;17972:616;16866:1;16859:14;;;16903:4;16890:18;;-1:-1:-1;;18008:17:1;;;18109:9;18131:229;18145:7;18142:1;18139:14;18131:229;;;18234:19;;;18221:33;18206:49;;18341:4;18326:20;;;;18294:1;18282:14;;;;18161:12;18131:229;;;18135:3;18388;18379:7;18376:16;18373:159;;;18512:1;18508:6;18502:3;18496;18493:1;18489:11;18485:21;18481:34;18477:39;18464:9;18459:3;18455:19;18442:33;18438:79;18430:6;18423:95;18373:159;;;18575:1;18569:3;18566:1;18562:11;18558:19;18552:4;18545:33;17945:895;;17640:1206;;;:::o;19978:415::-;20180:2;20162:21;;;20219:2;20199:18;;;20192:30;20258:34;20253:2;20238:18;;20231:62;20329:21;20324:2;20309:18;;20302:49;20383:3;20368:19;;19978:415::o;20747:722::-;20797:3;20838:5;20832:12;20867:36;20893:9;20867:36;:::i;:::-;20922:1;20939:18;;;20966:133;;;;21113:1;21108:355;;;;20932:531;;20966:133;-1:-1:-1;;20999:24:1;;20987:37;;21072:14;;21065:22;21053:35;;21044:45;;;-1:-1:-1;20966:133:1;;21108:355;21139:5;21136:1;21129:16;21168:4;21213:2;21210:1;21200:16;21238:1;21252:165;21266:6;21263:1;21260:13;21252:165;;;21344:14;;21331:11;;;21324:35;21387:16;;;;21281:10;;21252:165;;;21256:3;;;21446:6;21441:3;21437:16;21430:23;;20932:531;;;;;20747:722;;;;:::o;21474:535::-;21751:3;21779:38;21813:3;21805:6;21779:38;:::i;:::-;-1:-1:-1;;;21833:2:1;21826:20;21875:6;21869:13;21891:73;21957:6;21953:1;21949:2;21945:10;21938:4;21930:6;21926:17;21891:73;:::i;:::-;21984:15;22001:1;21980:23;;21474:535;-1:-1:-1;;;;21474:535:1:o;23685:365::-;23914:3;23942:38;23976:3;23968:6;23942:38;:::i;:::-;-1:-1:-1;;;23989:28:1;;24041:2;24033:11;;23685:365;-1:-1:-1;;;23685:365:1:o;25694:200::-;-1:-1:-1;;;;;25830:10:1;;;25818;;;25814:27;;25853:12;;;25850:38;;;25868:18;;:::i;:::-;25850:38;25694:200;;;;:::o;25899:197::-;-1:-1:-1;;;;;26021:10:1;;;26033;;;26017:27;;26056:11;;;26053:37;;;26070:18;;:::i;26873:136::-;26912:3;26940:5;26930:39;;26949:18;;:::i;:::-;-1:-1:-1;;;26985:18:1;;26873:136::o;27430:512::-;27624:4;-1:-1:-1;;;;;27734:2:1;27726:6;27722:15;27711:9;27704:34;27786:2;27778:6;27774:15;27769:2;27758:9;27754:18;27747:43;;27826:6;27821:2;27810:9;27806:18;27799:34;27869:3;27864:2;27853:9;27849:18;27842:31;27890:46;27931:3;27920:9;27916:19;27908:6;27890:46;:::i;:::-;27882:54;27430:512;-1:-1:-1;;;;;;27430:512:1:o;27947:249::-;28016:6;28069:2;28057:9;28048:7;28044:23;28040:32;28037:52;;;28085:1;28082;28075:12;28037:52;28117:9;28111:16;28136:30;28160:5;28136:30;:::i;28201:112::-;28233:1;28259;28249:35;;28264:18;;:::i;:::-;-1:-1:-1;28298:9:1;;28201:112::o
Swarm Source
ipfs://3990fd673a2da65a80d7169c3d14b6f9c9703a3f883e7726af0ac2010d862cf4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.