ERC-20
DeFi
Overview
Max Total Supply
2,087,453.042332467921090842 fireFBX
Holders
1,347 (0.00%)
Market
Price
$0.00 @ 0.000000 POL
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
447,015.56602766752807873 fireFBXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FireVaultFBXV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-10-27 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // 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/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // 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/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // 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/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. * However, to ensure consistency with the upgradeable transpiler, we will continue * to reserve a slot. * @custom:oz-renamed-from _PERMIT_TYPEHASH */ // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File: contracts/FireVaultFBXV2.sol pragma solidity ^0.8.17; interface IEP is IERC20 { function dailyFBXEmission() external view returns (uint256); function claimRewards() external returns (uint256); function mintEP(uint256 amountEP) external; function stakeEP(uint256 amountEP) external; function userInfos(address account) external view returns (uint256 stakedEP, uint256 lastClaim, uint256 amountClaimed); } interface ISushiRouter { function getAmountsOut(uint256 amountIn, address[] memory path) external view returns (uint256[] memory amounts); function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); } contract FireVaultFBXV2 is ERC20, ERC20Permit { using SafeERC20 for IERC20; using SafeERC20 for IEP; IERC20 public constant FBX = IERC20(0xD125443F38A69d776177c2B9c041f462936F8218); IEP public constant EP = IEP(0x60Ed6aCEF3a96F8CDaF0c0D207BbAfA66e751af2); ISushiRouter public constant SUSHI_ROUTER = ISushiRouter(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); address[] public sushiPath; uint256 public constant REWARD_VALUATION_MULTIPLIER = 270; uint256 public withdrawalRate = 0; event Deposit(address indexed account, uint256 amountFBX); event Withdraw(address indexed account, uint256 amountFBX); constructor() ERC20("FireVault FBX", "fireFBX") ERC20Permit("FireVault FBX") { _mint(msg.sender, 1683464363070200594102143); // Airdrop for V1 fireFBX owners sushiPath = new address[](2); sushiPath[0] = address(FBX); sushiPath[1] = address(EP); } function EPValuation() public view returns (uint256) { return REWARD_VALUATION_MULTIPLIER * 1e18 * EP.dailyFBXEmission() / EP.totalSupply(); } function totalEPValuation() public view returns (uint256) { (uint256 stakedEP,,) = EP.userInfos(address(this)); return EPValuation() * stakedEP / 1e18; } function totalFBXBalance() public view returns (uint256) { return FBX.balanceOf(address(this)); } function totalAssetsValuation() public view returns (uint256) { return totalEPValuation() + totalFBXBalance(); } function claimRewardsAndBalance() public { // Claim rewards uint256 rewards = EP.claimRewards(); if (rewards > 0) { // Balance portfolio uint256 toSpend = rewards * totalFBXBalance() / totalAssetsValuation(); if (toSpend > 0) { uint256 buyableAmount = SUSHI_ROUTER.getAmountsOut(toSpend, sushiPath)[1]; if (buyableAmount > toSpend / 300) { FBX.approve(address(SUSHI_ROUTER), toSpend); SUSHI_ROUTER.swapExactTokensForTokens(toSpend, buyableAmount * 995 / 1000, sushiPath, address(this), block.timestamp + 1); } else { FBX.approve(address(EP), toSpend); EP.mintEP(toSpend / 300); } } } // Stake unstaked EP uint256 unstakedEP = EP.balanceOf(address(this)); if (unstakedEP > 0) { EP.stakeEP(unstakedEP); } // Refresh fireFBX->FBX rate uint256 currentValuation = 1e18 * totalAssetsValuation() / totalSupply(); if (currentValuation > withdrawalRate) { withdrawalRate = currentValuation; } } function deposit(uint256 amountFBX) external returns (uint256 amountFireFBX) { require(amountFBX > 0, "Amount to deposit should be greater than 0."); claimRewardsAndBalance(); FBX.safeTransferFrom(msg.sender, address(this), amountFBX); amountFireFBX = 1e18 * amountFBX / withdrawalRate; _mint(msg.sender, amountFireFBX); emit Deposit(msg.sender, amountFBX); } function withdraw(uint256 amountFireFBX) external returns (uint256 amountFBX) { require(amountFireFBX > 0, "Amount to withdraw should be greater than 0."); claimRewardsAndBalance(); _burn(msg.sender, amountFireFBX); amountFBX = amountFireFBX * withdrawalRate / 1e18; FBX.safeTransfer(msg.sender, amountFBX); emit Withdraw(msg.sender, amountFBX); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFBX","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountFBX","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EP","outputs":[{"internalType":"contract IEP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPValuation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBX","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_VALUATION_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUSHI_ROUTER","outputs":[{"internalType":"contract ISushiRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewardsAndBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountFBX","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"amountFireFBX","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sushiPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssetsValuation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEPValuation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFBXBalance","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountFireFBX","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"amountFBX","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61014060405260006008553480156200001757600080fd5b506040518060400160405280600d81526020017f466972655661756c742046425800000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600d81526020017f466972655661756c7420464258000000000000000000000000000000000000008152506040518060400160405280600781526020017f6669726546425800000000000000000000000000000000000000000000000000815250816003908162000102919062000823565b50806004908162000114919062000823565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001808184846200033d60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001e7336a01647cc93673e27a10f77f6200037960201b60201c565b600267ffffffffffffffff811115620002055762000204620005b4565b5b604051908082528060200260200182016040528015620002345781602001602082028036833780820191505090505b50600790805190602001906200024c929190620004fb565b5073d125443f38a69d776177c2b9c041f462936f821860076000815481106200027a57620002796200090a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507360ed6acef3a96f8cdaf0c0d207bbafa66e751af26007600181548110620002ef57620002ee6200090a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000b11565b600083838346306040516020016200035a959493929190620009aa565b6040516020818303038152906040528051906020012090509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e29062000a68565b60405180910390fd5b620003ff60008383620004f160201b60201c565b806002600082825462000413919062000ab9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200046a919062000ab9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004d1919062000af4565b60405180910390a3620004ed60008383620004f660201b60201c565b5050565b505050565b505050565b82805482825590600052602060002090810192821562000577579160200282015b82811115620005765782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200051c565b5b5090506200058691906200058a565b5090565b5b80821115620005a55760008160009055506001016200058b565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062b57607f821691505b602082108103620006415762000640620005e3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200066c565b620006b786836200066c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000704620006fe620006f884620006cf565b620006d9565b620006cf565b9050919050565b6000819050919050565b6200072083620006e3565b620007386200072f826200070b565b84845462000679565b825550505050565b600090565b6200074f62000740565b6200075c81848462000715565b505050565b5b8181101562000784576200077860008262000745565b60018101905062000762565b5050565b601f821115620007d3576200079d8162000647565b620007a8846200065c565b81016020851015620007b8578190505b620007d0620007c7856200065c565b83018262000761565b50505b505050565b600082821c905092915050565b6000620007f860001984600802620007d8565b1980831691505092915050565b6000620008138383620007e5565b9150826002028217905092915050565b6200082e82620005a9565b67ffffffffffffffff8111156200084a5762000849620005b4565b5b62000856825462000612565b6200086382828562000788565b600060209050601f8311600181146200089b576000841562000886578287015190505b62000892858262000805565b86555062000902565b601f198416620008ab8662000647565b60005b82811015620008d557848901518255600182019150602085019450602081019050620008ae565b86831015620008f55784890151620008f1601f891682620007e5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6200094e8162000939565b82525050565b6200095f81620006cf565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009928262000965565b9050919050565b620009a48162000985565b82525050565b600060a082019050620009c1600083018862000943565b620009d0602083018762000943565b620009df604083018662000943565b620009ee606083018562000954565b620009fd608083018462000999565b9695505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000a50601f8362000a07565b915062000a5d8262000a18565b602082019050919050565b6000602082019050818103600083015262000a838162000a41565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ac682620006cf565b915062000ad383620006cf565b925082820190508082111562000aee5762000aed62000a8a565b5b92915050565b600060208201905062000b0b600083018462000954565b92915050565b60805160a05160c05160e0516101005161012051613f2a62000b616000396000611d2b01526000611d6d01526000611d4c01526000611c8101526000611cd701526000611d000152613f2a6000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80637ee24056116100f9578063beba222b11610097578063dd62ed3e11610071578063dd62ed3e146104ec578063e43b16fd1461051c578063e90725b21461053a578063ea78958314610558576101a9565b8063beba222b14610494578063d505accf146104b2578063d93e819a146104ce576101a9565b8063a457c2d7116100d3578063a457c2d7146103e6578063a9059cbb14610416578063b10abe4414610446578063b6b55f2514610464576101a9565b80637ee24056146103a05780638b68f891146103be57806395d89b41146103c8576101a9565b80632e432e9911610166578063395093511161014057806339509351146102f2578063583d26231461032257806370a08231146103405780637ecebe0014610370576101a9565b80632e432e9914610298578063313ce567146102b65780633644e515146102d4576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780630c24f4fa146101fc57806318160ddd1461021a57806323b872dd146102385780632e1a7d4d14610268575b600080fd5b6101b6610588565b6040516101c391906126a2565b60405180910390f35b6101e660048036038101906101e1919061276c565b61061a565b6040516101f391906127c7565b60405180910390f35b61020461063d565b6040516102119190612841565b60405180910390f35b610222610655565b60405161022f919061286b565b60405180910390f35b610252600480360381019061024d9190612886565b61065f565b60405161025f91906127c7565b60405180910390f35b610282600480360381019061027d91906128d9565b61068e565b60405161028f919061286b565b60405180910390f35b6102a0610799565b6040516102ad919061286b565b60405180910390f35b6102be6108d0565b6040516102cb9190612922565b60405180910390f35b6102dc6108d9565b6040516102e99190612956565b60405180910390f35b61030c6004803603810190610307919061276c565b6108e8565b60405161031991906127c7565b60405180910390f35b61032a61091f565b604051610337919061286b565b60405180910390f35b61035a60048036038101906103559190612971565b610925565b604051610367919061286b565b60405180910390f35b61038a60048036038101906103859190612971565b61096d565b604051610397919061286b565b60405180910390f35b6103a86109bd565b6040516103b5919061286b565b60405180910390f35b6103c6610a7e565b005b6103d0611018565b6040516103dd91906126a2565b60405180910390f35b61040060048036038101906103fb919061276c565b6110aa565b60405161040d91906127c7565b60405180910390f35b610430600480360381019061042b919061276c565b611121565b60405161043d91906127c7565b60405180910390f35b61044e611144565b60405161045b91906129bf565b60405180910390f35b61047e600480360381019061047991906128d9565b61115c565b60405161048b919061286b565b60405180910390f35b61049c611269565b6040516104a991906129fb565b60405180910390f35b6104cc60048036038101906104c79190612a6e565b611281565b005b6104d66113c3565b6040516104e3919061286b565b60405180910390f35b61050660048036038101906105019190612b10565b611458565b604051610513919061286b565b60405180910390f35b6105246114df565b604051610531919061286b565b60405180910390f35b610542611500565b60405161054f919061286b565b60405180910390f35b610572600480360381019061056d91906128d9565b611506565b60405161057f9190612b5f565b60405180910390f35b60606003805461059790612ba9565b80601f01602080910402602001604051908101604052809291908181526020018280546105c390612ba9565b80156106105780601f106105e557610100808354040283529160200191610610565b820191906000526020600020905b8154815290600101906020018083116105f357829003601f168201915b5050505050905090565b600080610625611545565b905061063281858561154d565b600191505092915050565b731b02da8cb0d097eb8d57a175b88c7d8b4799750681565b6000600254905090565b60008061066a611545565b9050610677858285611716565b6106828585856117a2565b60019150509392505050565b60008082116106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c990612c4c565b60405180910390fd5b6106da610a7e565b6106e43383611a21565b670de0b6b3a7640000600854836106fb9190612c9b565b6107059190612d0c565b9050610746338273d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff16611bf79092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648260405161078c919061286b565b60405180910390a2919050565b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081e9190612d52565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663f90c8fd16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a19190612d52565b670de0b6b3a764000061010e6108b79190612c9b565b6108c19190612c9b565b6108cb9190612d0c565b905090565b60006012905090565b60006108e3611c7d565b905090565b6000806108f3611545565b90506109148185856109058589611458565b61090f9190612d7f565b61154d565b600191505092915050565b60085481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006109b6600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d97565b9050919050565b6000807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166343b0215f306040518263ffffffff1660e01b8152600401610a0d9190612b5f565b606060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190612db3565b50509050670de0b6b3a764000081610a64610799565b610a6e9190612c9b565b610a789190612d0c565b91505090565b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190612d52565b90506000811115610eb5576000610b1a6114df565b610b226113c3565b83610b2d9190612c9b565b610b379190612d0c565b90506000811115610eb3576000731b02da8cb0d097eb8d57a175b88c7d8b4799750673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8360076040518363ffffffff1660e01b8152600401610b94929190612f2a565b600060405180830381865afa158015610bb1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bda91906130a2565b600181518110610bed57610bec6130eb565b5b6020026020010151905061012c82610c059190612d0c565b811115610d7d5773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3731b02da8cb0d097eb8d57a175b88c7d8b47997506846040518363ffffffff1660e01b8152600401610c6f92919061311a565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb2919061316f565b50731b02da8cb0d097eb8d57a175b88c7d8b4799750673ffffffffffffffffffffffffffffffffffffffff166338ed1739836103e86103e385610cf59190612c9b565b610cff9190612d0c565b600730600142610d0f9190612d7f565b6040518663ffffffff1660e01b8152600401610d2f95949392919061319c565b6000604051808303816000875af1158015610d4e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7791906130a2565b50610eb1565b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37360ed6acef3a96f8cdaf0c0d207bbafa66e751af2846040518363ffffffff1660e01b8152600401610de092919061311a565b6020604051808303816000875af1158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e23919061316f565b507360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663c36d308a61012c84610e629190612d0c565b6040518263ffffffff1660e01b8152600401610e7e919061286b565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505b505b505b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f049190612b5f565b602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f459190612d52565b90506000811115610fd0577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16630dd0b38c826040518263ffffffff1660e01b8152600401610f9d919061286b565b600060405180830381600087803b158015610fb757600080fd5b505af1158015610fcb573d6000803e3d6000fd5b505050505b6000610fda610655565b610fe26114df565b670de0b6b3a7640000610ff59190612c9b565b610fff9190612d0c565b905060085481111561101357806008819055505b505050565b60606004805461102790612ba9565b80601f016020809104026020016040519081016040528092919081815260200182805461105390612ba9565b80156110a05780601f10611075576101008083540402835291602001916110a0565b820191906000526020600020905b81548152906001019060200180831161108357829003601f168201915b5050505050905090565b6000806110b5611545565b905060006110c38286611458565b905083811015611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613268565b60405180910390fd5b611115828686840361154d565b60019250505092915050565b60008061112c611545565b90506111398185856117a2565b600191505092915050565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af281565b60008082116111a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611197906132fa565b60405180910390fd5b6111a8610a7e565b6111e933308473d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff16611da5909392919063ffffffff16565b60085482670de0b6b3a76400006112009190612c9b565b61120a9190612d0c565b90506112163382611e2e565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8360405161125c919061286b565b60405180910390a2919050565b73d125443f38a69d776177c2b9c041f462936f821881565b834211156112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613366565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112f38c611f8d565b8960405160200161130996959493929190613386565b604051602081830303815290604052805190602001209050600061132c82611feb565b9050600061133c82878787612005565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613433565b60405180910390fd5b6113b78a8a8a61154d565b50505050505050505050565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114129190612b5f565b602060405180830381865afa15801561142f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114539190612d52565b905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006114e96113c3565b6114f16109bd565b6114fb9190612d7f565b905090565b61010e81565b6007818154811061151657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b3906134c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290613557565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611709919061286b565b60405180910390a3505050565b60006117228484611458565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179c578181101561178e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611785906135c3565b60405180910390fd5b61179b848484840361154d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613655565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611880576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611877906136e7565b60405180910390fd5b61188b838383612030565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890613779565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a49190612d7f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a08919061286b565b60405180910390a3611a1b848484612035565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a879061380b565b60405180910390fd5b611a9c82600083612030565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b199061389d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611b7991906138bd565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bde919061286b565b60405180910390a3611bf283600084612035565b505050565b611c788363a9059cbb60e01b8484604051602401611c1692919061311a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061203a565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611cf957507f000000000000000000000000000000000000000000000000000000000000000046145b15611d26577f00000000000000000000000000000000000000000000000000000000000000009050611d94565b611d917f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612101565b90505b90565b600081600001549050919050565b611e28846323b872dd60e01b858585604051602401611dc6939291906138f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061203a565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490613974565b60405180910390fd5b611ea960008383612030565b8060026000828254611ebb9190612d7f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f109190612d7f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f75919061286b565b60405180910390a3611f8960008383612035565b5050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611fda81611d97565b9150611fe58161213b565b50919050565b6000611ffe611ff8611c7d565b83612151565b9050919050565b600080600061201687878787612184565b9150915061202381612290565b8192505050949350505050565b505050565b505050565b600061209c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661245c9092919063ffffffff16565b90506000815111156120fc57808060200190518101906120bc919061316f565b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290613a06565b60405180910390fd5b5b505050565b6000838383463060405160200161211c959493929190613a26565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001612166929190613af1565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156121bf576000600391509150612287565b601b8560ff16141580156121d75750601c8560ff1614155b156121e9576000600491509150612287565b60006001878787876040516000815260200160405260405161220e9493929190613b28565b6020604051602081039080840390855afa158015612230573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361227e57600060019250925050612287565b80600092509250505b94509492505050565b600060048111156122a4576122a3613b6d565b5b8160048111156122b7576122b6613b6d565b5b031561245957600160048111156122d1576122d0613b6d565b5b8160048111156122e4576122e3613b6d565b5b03612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90613be8565b60405180910390fd5b6002600481111561233857612337613b6d565b5b81600481111561234b5761234a613b6d565b5b0361238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290613c54565b60405180910390fd5b6003600481111561239f5761239e613b6d565b5b8160048111156123b2576123b1613b6d565b5b036123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613ce6565b60405180910390fd5b60048081111561240557612404613b6d565b5b81600481111561241857612417613b6d565b5b03612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90613d78565b60405180910390fd5b5b50565b606061246b8484600085612474565b90509392505050565b6060824710156124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090613e0a565b60405180910390fd5b6124c285612588565b612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890613e76565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161252a9190613edd565b60006040518083038185875af1925050503d8060008114612567576040519150601f19603f3d011682016040523d82523d6000602084013e61256c565b606091505b509150915061257c8282866125ab565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156125bb5782905061260b565b6000835111156125ce5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260291906126a2565b60405180910390fd5b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561264c578082015181840152602081019050612631565b60008484015250505050565b6000601f19601f8301169050919050565b600061267482612612565b61267e818561261d565b935061268e81856020860161262e565b61269781612658565b840191505092915050565b600060208201905081810360008301526126bc8184612669565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612703826126d8565b9050919050565b612713816126f8565b811461271e57600080fd5b50565b6000813590506127308161270a565b92915050565b6000819050919050565b61274981612736565b811461275457600080fd5b50565b60008135905061276681612740565b92915050565b60008060408385031215612783576127826126ce565b5b600061279185828601612721565b92505060206127a285828601612757565b9150509250929050565b60008115159050919050565b6127c1816127ac565b82525050565b60006020820190506127dc60008301846127b8565b92915050565b6000819050919050565b60006128076128026127fd846126d8565b6127e2565b6126d8565b9050919050565b6000612819826127ec565b9050919050565b600061282b8261280e565b9050919050565b61283b81612820565b82525050565b60006020820190506128566000830184612832565b92915050565b61286581612736565b82525050565b6000602082019050612880600083018461285c565b92915050565b60008060006060848603121561289f5761289e6126ce565b5b60006128ad86828701612721565b93505060206128be86828701612721565b92505060406128cf86828701612757565b9150509250925092565b6000602082840312156128ef576128ee6126ce565b5b60006128fd84828501612757565b91505092915050565b600060ff82169050919050565b61291c81612906565b82525050565b60006020820190506129376000830184612913565b92915050565b6000819050919050565b6129508161293d565b82525050565b600060208201905061296b6000830184612947565b92915050565b600060208284031215612987576129866126ce565b5b600061299584828501612721565b91505092915050565b60006129a98261280e565b9050919050565b6129b98161299e565b82525050565b60006020820190506129d460008301846129b0565b92915050565b60006129e58261280e565b9050919050565b6129f5816129da565b82525050565b6000602082019050612a1060008301846129ec565b92915050565b612a1f81612906565b8114612a2a57600080fd5b50565b600081359050612a3c81612a16565b92915050565b612a4b8161293d565b8114612a5657600080fd5b50565b600081359050612a6881612a42565b92915050565b600080600080600080600060e0888a031215612a8d57612a8c6126ce565b5b6000612a9b8a828b01612721565b9750506020612aac8a828b01612721565b9650506040612abd8a828b01612757565b9550506060612ace8a828b01612757565b9450506080612adf8a828b01612a2d565b93505060a0612af08a828b01612a59565b92505060c0612b018a828b01612a59565b91505092959891949750929550565b60008060408385031215612b2757612b266126ce565b5b6000612b3585828601612721565b9250506020612b4685828601612721565b9150509250929050565b612b59816126f8565b82525050565b6000602082019050612b746000830184612b50565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bc157607f821691505b602082108103612bd457612bd3612b7a565b5b50919050565b7f416d6f756e7420746f2077697468647261772073686f756c642062652067726560008201527f61746572207468616e20302e0000000000000000000000000000000000000000602082015250565b6000612c36602c8361261d565b9150612c4182612bda565b604082019050919050565b60006020820190508181036000830152612c6581612c29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ca682612736565b9150612cb183612736565b9250828202612cbf81612736565b91508282048414831517612cd657612cd5612c6c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d1782612736565b9150612d2283612736565b925082612d3257612d31612cdd565b5b828204905092915050565b600081519050612d4c81612740565b92915050565b600060208284031215612d6857612d676126ce565b5b6000612d7684828501612d3d565b91505092915050565b6000612d8a82612736565b9150612d9583612736565b9250828201905080821115612dad57612dac612c6c565b5b92915050565b600080600060608486031215612dcc57612dcb6126ce565b5b6000612dda86828701612d3d565b9350506020612deb86828701612d3d565b9250506040612dfc86828701612d3d565b9150509250925092565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b612e40816126f8565b82525050565b6000612e528383612e37565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e9e612e9983612e5e565b612e6b565b9050919050565b6000612eb18254612e8b565b9050919050565b6000600182019050919050565b6000612ed082612e06565b612eda8185612e11565b9350612ee583612e22565b8060005b83811015612f1d57612efa82612ea5565b612f048882612e46565b9750612f0f83612eb8565b925050600181019050612ee9565b5085935050505092915050565b6000604082019050612f3f600083018561285c565b8181036020830152612f518184612ec5565b90509392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9782612658565b810181811067ffffffffffffffff82111715612fb657612fb5612f5f565b5b80604052505050565b6000612fc96126c4565b9050612fd58282612f8e565b919050565b600067ffffffffffffffff821115612ff557612ff4612f5f565b5b602082029050602081019050919050565b600080fd5b600061301e61301984612fda565b612fbf565b9050808382526020820190506020840283018581111561304157613040613006565b5b835b8181101561306a57806130568882612d3d565b845260208401935050602081019050613043565b5050509392505050565b600082601f83011261308957613088612f5a565b5b815161309984826020860161300b565b91505092915050565b6000602082840312156130b8576130b76126ce565b5b600082015167ffffffffffffffff8111156130d6576130d56126d3565b5b6130e284828501613074565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061312f6000830185612b50565b61313c602083018461285c565b9392505050565b61314c816127ac565b811461315757600080fd5b50565b60008151905061316981613143565b92915050565b600060208284031215613185576131846126ce565b5b60006131938482850161315a565b91505092915050565b600060a0820190506131b1600083018861285c565b6131be602083018761285c565b81810360408301526131d08186612ec5565b90506131df6060830185612b50565b6131ec608083018461285c565b9695505050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325260258361261d565b915061325d826131f6565b604082019050919050565b6000602082019050818103600083015261328181613245565b9050919050565b7f416d6f756e7420746f206465706f7369742073686f756c64206265206772656160008201527f746572207468616e20302e000000000000000000000000000000000000000000602082015250565b60006132e4602b8361261d565b91506132ef82613288565b604082019050919050565b60006020820190508181036000830152613313816132d7565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613350601d8361261d565b915061335b8261331a565b602082019050919050565b6000602082019050818103600083015261337f81613343565b9050919050565b600060c08201905061339b6000830189612947565b6133a86020830188612b50565b6133b56040830187612b50565b6133c2606083018661285c565b6133cf608083018561285c565b6133dc60a083018461285c565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061341d601e8361261d565b9150613428826133e7565b602082019050919050565b6000602082019050818103600083015261344c81613410565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134af60248361261d565b91506134ba82613453565b604082019050919050565b600060208201905081810360008301526134de816134a2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061354160228361261d565b915061354c826134e5565b604082019050919050565b6000602082019050818103600083015261357081613534565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006135ad601d8361261d565b91506135b882613577565b602082019050919050565b600060208201905081810360008301526135dc816135a0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061363f60258361261d565b915061364a826135e3565b604082019050919050565b6000602082019050818103600083015261366e81613632565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136d160238361261d565b91506136dc82613675565b604082019050919050565b60006020820190508181036000830152613700816136c4565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061376360268361261d565b915061376e82613707565b604082019050919050565b6000602082019050818103600083015261379281613756565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006137f560218361261d565b915061380082613799565b604082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061388760228361261d565b91506138928261382b565b604082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138c882612736565b91506138d383612736565b92508282039050818111156138eb576138ea612c6c565b5b92915050565b60006060820190506139066000830186612b50565b6139136020830185612b50565b613920604083018461285c565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061395e601f8361261d565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006139f0602a8361261d565b91506139fb82613994565b604082019050919050565b60006020820190508181036000830152613a1f816139e3565b9050919050565b600060a082019050613a3b6000830188612947565b613a486020830187612947565b613a556040830186612947565b613a62606083018561285c565b613a6f6080830184612b50565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613aba600283613a79565b9150613ac582613a84565b600282019050919050565b6000819050919050565b613aeb613ae68261293d565b613ad0565b82525050565b6000613afc82613aad565b9150613b088285613ada565b602082019150613b188284613ada565b6020820191508190509392505050565b6000608082019050613b3d6000830187612947565b613b4a6020830186612913565b613b576040830185612947565b613b646060830184612947565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bd260188361261d565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c3e601f8361261d565b9150613c4982613c08565b602082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cd060228361261d565b9150613cdb82613c74565b604082019050919050565b60006020820190508181036000830152613cff81613cc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d6260228361261d565b9150613d6d82613d06565b604082019050919050565b60006020820190508181036000830152613d9181613d55565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613df460268361261d565b9150613dff82613d98565b604082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613e60601d8361261d565b9150613e6b82613e2a565b602082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b600081519050919050565b600081905092915050565b6000613eb782613e96565b613ec18185613ea1565b9350613ed181856020860161262e565b80840191505092915050565b6000613ee98284613eac565b91508190509291505056fea26469706673582212207ef6ed1fe5c442db9a4c2f8204ecce5da0f583f5478ff246e08ef68d76a4202a64736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80637ee24056116100f9578063beba222b11610097578063dd62ed3e11610071578063dd62ed3e146104ec578063e43b16fd1461051c578063e90725b21461053a578063ea78958314610558576101a9565b8063beba222b14610494578063d505accf146104b2578063d93e819a146104ce576101a9565b8063a457c2d7116100d3578063a457c2d7146103e6578063a9059cbb14610416578063b10abe4414610446578063b6b55f2514610464576101a9565b80637ee24056146103a05780638b68f891146103be57806395d89b41146103c8576101a9565b80632e432e9911610166578063395093511161014057806339509351146102f2578063583d26231461032257806370a08231146103405780637ecebe0014610370576101a9565b80632e432e9914610298578063313ce567146102b65780633644e515146102d4576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780630c24f4fa146101fc57806318160ddd1461021a57806323b872dd146102385780632e1a7d4d14610268575b600080fd5b6101b6610588565b6040516101c391906126a2565b60405180910390f35b6101e660048036038101906101e1919061276c565b61061a565b6040516101f391906127c7565b60405180910390f35b61020461063d565b6040516102119190612841565b60405180910390f35b610222610655565b60405161022f919061286b565b60405180910390f35b610252600480360381019061024d9190612886565b61065f565b60405161025f91906127c7565b60405180910390f35b610282600480360381019061027d91906128d9565b61068e565b60405161028f919061286b565b60405180910390f35b6102a0610799565b6040516102ad919061286b565b60405180910390f35b6102be6108d0565b6040516102cb9190612922565b60405180910390f35b6102dc6108d9565b6040516102e99190612956565b60405180910390f35b61030c6004803603810190610307919061276c565b6108e8565b60405161031991906127c7565b60405180910390f35b61032a61091f565b604051610337919061286b565b60405180910390f35b61035a60048036038101906103559190612971565b610925565b604051610367919061286b565b60405180910390f35b61038a60048036038101906103859190612971565b61096d565b604051610397919061286b565b60405180910390f35b6103a86109bd565b6040516103b5919061286b565b60405180910390f35b6103c6610a7e565b005b6103d0611018565b6040516103dd91906126a2565b60405180910390f35b61040060048036038101906103fb919061276c565b6110aa565b60405161040d91906127c7565b60405180910390f35b610430600480360381019061042b919061276c565b611121565b60405161043d91906127c7565b60405180910390f35b61044e611144565b60405161045b91906129bf565b60405180910390f35b61047e600480360381019061047991906128d9565b61115c565b60405161048b919061286b565b60405180910390f35b61049c611269565b6040516104a991906129fb565b60405180910390f35b6104cc60048036038101906104c79190612a6e565b611281565b005b6104d66113c3565b6040516104e3919061286b565b60405180910390f35b61050660048036038101906105019190612b10565b611458565b604051610513919061286b565b60405180910390f35b6105246114df565b604051610531919061286b565b60405180910390f35b610542611500565b60405161054f919061286b565b60405180910390f35b610572600480360381019061056d91906128d9565b611506565b60405161057f9190612b5f565b60405180910390f35b60606003805461059790612ba9565b80601f01602080910402602001604051908101604052809291908181526020018280546105c390612ba9565b80156106105780601f106105e557610100808354040283529160200191610610565b820191906000526020600020905b8154815290600101906020018083116105f357829003601f168201915b5050505050905090565b600080610625611545565b905061063281858561154d565b600191505092915050565b731b02da8cb0d097eb8d57a175b88c7d8b4799750681565b6000600254905090565b60008061066a611545565b9050610677858285611716565b6106828585856117a2565b60019150509392505050565b60008082116106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c990612c4c565b60405180910390fd5b6106da610a7e565b6106e43383611a21565b670de0b6b3a7640000600854836106fb9190612c9b565b6107059190612d0c565b9050610746338273d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff16611bf79092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648260405161078c919061286b565b60405180910390a2919050565b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081e9190612d52565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663f90c8fd16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a19190612d52565b670de0b6b3a764000061010e6108b79190612c9b565b6108c19190612c9b565b6108cb9190612d0c565b905090565b60006012905090565b60006108e3611c7d565b905090565b6000806108f3611545565b90506109148185856109058589611458565b61090f9190612d7f565b61154d565b600191505092915050565b60085481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006109b6600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d97565b9050919050565b6000807360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166343b0215f306040518263ffffffff1660e01b8152600401610a0d9190612b5f565b606060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190612db3565b50509050670de0b6b3a764000081610a64610799565b610a6e9190612c9b565b610a789190612d0c565b91505090565b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663372500ab6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190612d52565b90506000811115610eb5576000610b1a6114df565b610b226113c3565b83610b2d9190612c9b565b610b379190612d0c565b90506000811115610eb3576000731b02da8cb0d097eb8d57a175b88c7d8b4799750673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8360076040518363ffffffff1660e01b8152600401610b94929190612f2a565b600060405180830381865afa158015610bb1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bda91906130a2565b600181518110610bed57610bec6130eb565b5b6020026020010151905061012c82610c059190612d0c565b811115610d7d5773d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3731b02da8cb0d097eb8d57a175b88c7d8b47997506846040518363ffffffff1660e01b8152600401610c6f92919061311a565b6020604051808303816000875af1158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb2919061316f565b50731b02da8cb0d097eb8d57a175b88c7d8b4799750673ffffffffffffffffffffffffffffffffffffffff166338ed1739836103e86103e385610cf59190612c9b565b610cff9190612d0c565b600730600142610d0f9190612d7f565b6040518663ffffffff1660e01b8152600401610d2f95949392919061319c565b6000604051808303816000875af1158015610d4e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d7791906130a2565b50610eb1565b73d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37360ed6acef3a96f8cdaf0c0d207bbafa66e751af2846040518363ffffffff1660e01b8152600401610de092919061311a565b6020604051808303816000875af1158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e23919061316f565b507360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff1663c36d308a61012c84610e629190612d0c565b6040518263ffffffff1660e01b8152600401610e7e919061286b565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505b505b505b60007360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f049190612b5f565b602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f459190612d52565b90506000811115610fd0577360ed6acef3a96f8cdaf0c0d207bbafa66e751af273ffffffffffffffffffffffffffffffffffffffff16630dd0b38c826040518263ffffffff1660e01b8152600401610f9d919061286b565b600060405180830381600087803b158015610fb757600080fd5b505af1158015610fcb573d6000803e3d6000fd5b505050505b6000610fda610655565b610fe26114df565b670de0b6b3a7640000610ff59190612c9b565b610fff9190612d0c565b905060085481111561101357806008819055505b505050565b60606004805461102790612ba9565b80601f016020809104026020016040519081016040528092919081815260200182805461105390612ba9565b80156110a05780601f10611075576101008083540402835291602001916110a0565b820191906000526020600020905b81548152906001019060200180831161108357829003601f168201915b5050505050905090565b6000806110b5611545565b905060006110c38286611458565b905083811015611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613268565b60405180910390fd5b611115828686840361154d565b60019250505092915050565b60008061112c611545565b90506111398185856117a2565b600191505092915050565b7360ed6acef3a96f8cdaf0c0d207bbafa66e751af281565b60008082116111a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611197906132fa565b60405180910390fd5b6111a8610a7e565b6111e933308473d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff16611da5909392919063ffffffff16565b60085482670de0b6b3a76400006112009190612c9b565b61120a9190612d0c565b90506112163382611e2e565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8360405161125c919061286b565b60405180910390a2919050565b73d125443f38a69d776177c2b9c041f462936f821881565b834211156112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613366565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112f38c611f8d565b8960405160200161130996959493929190613386565b604051602081830303815290604052805190602001209050600061132c82611feb565b9050600061133c82878787612005565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613433565b60405180910390fd5b6113b78a8a8a61154d565b50505050505050505050565b600073d125443f38a69d776177c2b9c041f462936f821873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114129190612b5f565b602060405180830381865afa15801561142f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114539190612d52565b905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006114e96113c3565b6114f16109bd565b6114fb9190612d7f565b905090565b61010e81565b6007818154811061151657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b3906134c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290613557565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611709919061286b565b60405180910390a3505050565b60006117228484611458565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179c578181101561178e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611785906135c3565b60405180910390fd5b61179b848484840361154d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613655565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611880576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611877906136e7565b60405180910390fd5b61188b838383612030565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890613779565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a49190612d7f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a08919061286b565b60405180910390a3611a1b848484612035565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a879061380b565b60405180910390fd5b611a9c82600083612030565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b199061389d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611b7991906138bd565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bde919061286b565b60405180910390a3611bf283600084612035565b505050565b611c788363a9059cbb60e01b8484604051602401611c1692919061311a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061203a565b505050565b60007f000000000000000000000000960d43be128585ca45365cd74a7773b9d814dfbe73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611cf957507f000000000000000000000000000000000000000000000000000000000000008946145b15611d26577f1133b49db4b79f00b394d054d9f427e9708c7d246e9e32eb5179c51670c147ef9050611d94565b611d917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f808c1e9b8578fca18146caf0b1bf3ef954c2281293812ae4cb5faa73433550e97fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612101565b90505b90565b600081600001549050919050565b611e28846323b872dd60e01b858585604051602401611dc6939291906138f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061203a565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490613974565b60405180910390fd5b611ea960008383612030565b8060026000828254611ebb9190612d7f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f109190612d7f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f75919061286b565b60405180910390a3611f8960008383612035565b5050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611fda81611d97565b9150611fe58161213b565b50919050565b6000611ffe611ff8611c7d565b83612151565b9050919050565b600080600061201687878787612184565b9150915061202381612290565b8192505050949350505050565b505050565b505050565b600061209c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661245c9092919063ffffffff16565b90506000815111156120fc57808060200190518101906120bc919061316f565b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290613a06565b60405180910390fd5b5b505050565b6000838383463060405160200161211c959493929190613a26565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001612166929190613af1565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156121bf576000600391509150612287565b601b8560ff16141580156121d75750601c8560ff1614155b156121e9576000600491509150612287565b60006001878787876040516000815260200160405260405161220e9493929190613b28565b6020604051602081039080840390855afa158015612230573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361227e57600060019250925050612287565b80600092509250505b94509492505050565b600060048111156122a4576122a3613b6d565b5b8160048111156122b7576122b6613b6d565b5b031561245957600160048111156122d1576122d0613b6d565b5b8160048111156122e4576122e3613b6d565b5b03612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90613be8565b60405180910390fd5b6002600481111561233857612337613b6d565b5b81600481111561234b5761234a613b6d565b5b0361238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290613c54565b60405180910390fd5b6003600481111561239f5761239e613b6d565b5b8160048111156123b2576123b1613b6d565b5b036123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613ce6565b60405180910390fd5b60048081111561240557612404613b6d565b5b81600481111561241857612417613b6d565b5b03612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90613d78565b60405180910390fd5b5b50565b606061246b8484600085612474565b90509392505050565b6060824710156124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090613e0a565b60405180910390fd5b6124c285612588565b612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890613e76565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161252a9190613edd565b60006040518083038185875af1925050503d8060008114612567576040519150601f19603f3d011682016040523d82523d6000602084013e61256c565b606091505b509150915061257c8282866125ab565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156125bb5782905061260b565b6000835111156125ce5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260291906126a2565b60405180910390fd5b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561264c578082015181840152602081019050612631565b60008484015250505050565b6000601f19601f8301169050919050565b600061267482612612565b61267e818561261d565b935061268e81856020860161262e565b61269781612658565b840191505092915050565b600060208201905081810360008301526126bc8184612669565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612703826126d8565b9050919050565b612713816126f8565b811461271e57600080fd5b50565b6000813590506127308161270a565b92915050565b6000819050919050565b61274981612736565b811461275457600080fd5b50565b60008135905061276681612740565b92915050565b60008060408385031215612783576127826126ce565b5b600061279185828601612721565b92505060206127a285828601612757565b9150509250929050565b60008115159050919050565b6127c1816127ac565b82525050565b60006020820190506127dc60008301846127b8565b92915050565b6000819050919050565b60006128076128026127fd846126d8565b6127e2565b6126d8565b9050919050565b6000612819826127ec565b9050919050565b600061282b8261280e565b9050919050565b61283b81612820565b82525050565b60006020820190506128566000830184612832565b92915050565b61286581612736565b82525050565b6000602082019050612880600083018461285c565b92915050565b60008060006060848603121561289f5761289e6126ce565b5b60006128ad86828701612721565b93505060206128be86828701612721565b92505060406128cf86828701612757565b9150509250925092565b6000602082840312156128ef576128ee6126ce565b5b60006128fd84828501612757565b91505092915050565b600060ff82169050919050565b61291c81612906565b82525050565b60006020820190506129376000830184612913565b92915050565b6000819050919050565b6129508161293d565b82525050565b600060208201905061296b6000830184612947565b92915050565b600060208284031215612987576129866126ce565b5b600061299584828501612721565b91505092915050565b60006129a98261280e565b9050919050565b6129b98161299e565b82525050565b60006020820190506129d460008301846129b0565b92915050565b60006129e58261280e565b9050919050565b6129f5816129da565b82525050565b6000602082019050612a1060008301846129ec565b92915050565b612a1f81612906565b8114612a2a57600080fd5b50565b600081359050612a3c81612a16565b92915050565b612a4b8161293d565b8114612a5657600080fd5b50565b600081359050612a6881612a42565b92915050565b600080600080600080600060e0888a031215612a8d57612a8c6126ce565b5b6000612a9b8a828b01612721565b9750506020612aac8a828b01612721565b9650506040612abd8a828b01612757565b9550506060612ace8a828b01612757565b9450506080612adf8a828b01612a2d565b93505060a0612af08a828b01612a59565b92505060c0612b018a828b01612a59565b91505092959891949750929550565b60008060408385031215612b2757612b266126ce565b5b6000612b3585828601612721565b9250506020612b4685828601612721565b9150509250929050565b612b59816126f8565b82525050565b6000602082019050612b746000830184612b50565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bc157607f821691505b602082108103612bd457612bd3612b7a565b5b50919050565b7f416d6f756e7420746f2077697468647261772073686f756c642062652067726560008201527f61746572207468616e20302e0000000000000000000000000000000000000000602082015250565b6000612c36602c8361261d565b9150612c4182612bda565b604082019050919050565b60006020820190508181036000830152612c6581612c29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ca682612736565b9150612cb183612736565b9250828202612cbf81612736565b91508282048414831517612cd657612cd5612c6c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d1782612736565b9150612d2283612736565b925082612d3257612d31612cdd565b5b828204905092915050565b600081519050612d4c81612740565b92915050565b600060208284031215612d6857612d676126ce565b5b6000612d7684828501612d3d565b91505092915050565b6000612d8a82612736565b9150612d9583612736565b9250828201905080821115612dad57612dac612c6c565b5b92915050565b600080600060608486031215612dcc57612dcb6126ce565b5b6000612dda86828701612d3d565b9350506020612deb86828701612d3d565b9250506040612dfc86828701612d3d565b9150509250925092565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b612e40816126f8565b82525050565b6000612e528383612e37565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e9e612e9983612e5e565b612e6b565b9050919050565b6000612eb18254612e8b565b9050919050565b6000600182019050919050565b6000612ed082612e06565b612eda8185612e11565b9350612ee583612e22565b8060005b83811015612f1d57612efa82612ea5565b612f048882612e46565b9750612f0f83612eb8565b925050600181019050612ee9565b5085935050505092915050565b6000604082019050612f3f600083018561285c565b8181036020830152612f518184612ec5565b90509392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9782612658565b810181811067ffffffffffffffff82111715612fb657612fb5612f5f565b5b80604052505050565b6000612fc96126c4565b9050612fd58282612f8e565b919050565b600067ffffffffffffffff821115612ff557612ff4612f5f565b5b602082029050602081019050919050565b600080fd5b600061301e61301984612fda565b612fbf565b9050808382526020820190506020840283018581111561304157613040613006565b5b835b8181101561306a57806130568882612d3d565b845260208401935050602081019050613043565b5050509392505050565b600082601f83011261308957613088612f5a565b5b815161309984826020860161300b565b91505092915050565b6000602082840312156130b8576130b76126ce565b5b600082015167ffffffffffffffff8111156130d6576130d56126d3565b5b6130e284828501613074565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061312f6000830185612b50565b61313c602083018461285c565b9392505050565b61314c816127ac565b811461315757600080fd5b50565b60008151905061316981613143565b92915050565b600060208284031215613185576131846126ce565b5b60006131938482850161315a565b91505092915050565b600060a0820190506131b1600083018861285c565b6131be602083018761285c565b81810360408301526131d08186612ec5565b90506131df6060830185612b50565b6131ec608083018461285c565b9695505050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325260258361261d565b915061325d826131f6565b604082019050919050565b6000602082019050818103600083015261328181613245565b9050919050565b7f416d6f756e7420746f206465706f7369742073686f756c64206265206772656160008201527f746572207468616e20302e000000000000000000000000000000000000000000602082015250565b60006132e4602b8361261d565b91506132ef82613288565b604082019050919050565b60006020820190508181036000830152613313816132d7565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613350601d8361261d565b915061335b8261331a565b602082019050919050565b6000602082019050818103600083015261337f81613343565b9050919050565b600060c08201905061339b6000830189612947565b6133a86020830188612b50565b6133b56040830187612b50565b6133c2606083018661285c565b6133cf608083018561285c565b6133dc60a083018461285c565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061341d601e8361261d565b9150613428826133e7565b602082019050919050565b6000602082019050818103600083015261344c81613410565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134af60248361261d565b91506134ba82613453565b604082019050919050565b600060208201905081810360008301526134de816134a2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061354160228361261d565b915061354c826134e5565b604082019050919050565b6000602082019050818103600083015261357081613534565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006135ad601d8361261d565b91506135b882613577565b602082019050919050565b600060208201905081810360008301526135dc816135a0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061363f60258361261d565b915061364a826135e3565b604082019050919050565b6000602082019050818103600083015261366e81613632565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136d160238361261d565b91506136dc82613675565b604082019050919050565b60006020820190508181036000830152613700816136c4565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061376360268361261d565b915061376e82613707565b604082019050919050565b6000602082019050818103600083015261379281613756565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006137f560218361261d565b915061380082613799565b604082019050919050565b60006020820190508181036000830152613824816137e8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061388760228361261d565b91506138928261382b565b604082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138c882612736565b91506138d383612736565b92508282039050818111156138eb576138ea612c6c565b5b92915050565b60006060820190506139066000830186612b50565b6139136020830185612b50565b613920604083018461285c565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061395e601f8361261d565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006139f0602a8361261d565b91506139fb82613994565b604082019050919050565b60006020820190508181036000830152613a1f816139e3565b9050919050565b600060a082019050613a3b6000830188612947565b613a486020830187612947565b613a556040830186612947565b613a62606083018561285c565b613a6f6080830184612b50565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613aba600283613a79565b9150613ac582613a84565b600282019050919050565b6000819050919050565b613aeb613ae68261293d565b613ad0565b82525050565b6000613afc82613aad565b9150613b088285613ada565b602082019150613b188284613ada565b6020820191508190509392505050565b6000608082019050613b3d6000830187612947565b613b4a6020830186612913565b613b576040830185612947565b613b646060830184612947565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bd260188361261d565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c3e601f8361261d565b9150613c4982613c08565b602082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cd060228361261d565b9150613cdb82613c74565b604082019050919050565b60006020820190508181036000830152613cff81613cc3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d6260228361261d565b9150613d6d82613d06565b604082019050919050565b60006020820190508181036000830152613d9181613d55565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613df460268361261d565b9150613dff82613d98565b604082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613e60601d8361261d565b9150613e6b82613e2a565b602082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b600081519050919050565b600081905092915050565b6000613eb782613e96565b613ec18185613ea1565b9350613ed181856020860161262e565b80840191505092915050565b6000613ee98284613eac565b91508190509291505056fea26469706673582212207ef6ed1fe5c442db9a4c2f8204ecce5da0f583f5478ff246e08ef68d76a4202a64736f6c63430008110033
Deployed Bytecode Sourcemap
55155:3648:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40298:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42649:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55442:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41418:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43430:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58394:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56110:156;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41260:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53903:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44134:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55648:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41589:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53645:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56274:176;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56715:1245;;;:::i;:::-;;40517:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44875:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41922:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55363:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57968:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55277:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52934:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56458:111;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42178:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56577:126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55584:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55551:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40298:100;40352:13;40385:5;40378:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40298:100;:::o;42649:201::-;42732:4;42749:13;42765:12;:10;:12::i;:::-;42749:28;;42788:32;42797:5;42804:7;42813:6;42788:8;:32::i;:::-;42838:4;42831:11;;;42649:201;;;;:::o;55442:100::-;55499:42;55442:100;:::o;41418:108::-;41479:7;41506:12;;41499:19;;41418:108;:::o;43430:295::-;43561:4;43578:15;43596:12;:10;:12::i;:::-;43578:30;;43619:38;43635:4;43641:7;43650:6;43619:15;:38::i;:::-;43668:27;43678:4;43684:2;43688:6;43668:9;:27::i;:::-;43713:4;43706:11;;;43430:295;;;;;:::o;58394:406::-;58453:17;58507:1;58491:13;:17;58483:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58568:24;:22;:24::i;:::-;58603:32;58609:10;58621:13;58603:5;:32::i;:::-;58691:4;58674:14;;58658:13;:30;;;;:::i;:::-;:37;;;;:::i;:::-;58646:49;;58706:39;58723:10;58735:9;55313:42;58706:16;;;;:39;;;;;:::i;:::-;58770:10;58761:31;;;58782:9;58761:31;;;;;;:::i;:::-;;;;;;;;58394:406;;;:::o;56110:156::-;56154:7;55392:42;56242:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55392:42;56218:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56211:4;55638:3;56181:34;;;;:::i;:::-;:58;;;;:::i;:::-;:77;;;;:::i;:::-;56174:84;;56110:156;:::o;41260:93::-;41318:5;41343:2;41336:9;;41260:93;:::o;53903:115::-;53963:7;53990:20;:18;:20::i;:::-;53983:27;;53903:115;:::o;44134:238::-;44222:4;44239:13;44255:12;:10;:12::i;:::-;44239:28;;44278:64;44287:5;44294:7;44331:10;44303:25;44313:5;44320:7;44303:9;:25::i;:::-;:38;;;;:::i;:::-;44278:8;:64::i;:::-;44360:4;44353:11;;;44134:238;;;;:::o;55648:33::-;;;;:::o;41589:127::-;41663:7;41690:9;:18;41700:7;41690:18;;;;;;;;;;;;;;;;41683:25;;41589:127;;;:::o;53645:128::-;53714:7;53741:24;:7;:14;53749:5;53741:14;;;;;;;;;;;;;;;:22;:24::i;:::-;53734:31;;53645:128;;;:::o;56274:176::-;56323:7;56344:16;55392:42;56366:12;;;56387:4;56366:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56343:50;;;;56438:4;56427:8;56411:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;56404:38;;;56274:176;:::o;56715:1245::-;56793:15;55392:42;56811:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56793:35;;56853:1;56843:7;:11;56839:716;;;56905:15;56953:22;:20;:22::i;:::-;56933:17;:15;:17::i;:::-;56923:7;:27;;;;:::i;:::-;:52;;;;:::i;:::-;56905:70;;57004:1;56994:7;:11;56990:554;;;57026:21;55499:42;57050:26;;;57077:7;57086:9;57050:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57097:1;57050:49;;;;;;;;:::i;:::-;;;;;;;;57026:73;;57148:3;57138:7;:13;;;;:::i;:::-;57122;:29;57118:411;;;55313:42;57176:11;;;55499:42;57211:7;57176:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55499:42;57242:37;;;57280:7;57311:4;57305:3;57289:13;:19;;;;:::i;:::-;:26;;;;:::i;:::-;57317:9;57336:4;57361:1;57343:15;:19;;;;:::i;:::-;57242:121;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57118:411;;;55313:42;57429:11;;;55392:42;57454:7;57429:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55392:42;57485:9;;;57505:3;57495:7;:13;;;;:::i;:::-;57485:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57118:411;57007:537;56990:554;56856:699;56839:716;57595:18;55392:42;57616:12;;;57637:4;57616:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57595:48;;57671:1;57658:10;:14;57654:69;;;55392:42;57689:10;;;57700;57689:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57654:69;57771:24;57830:13;:11;:13::i;:::-;57805:22;:20;:22::i;:::-;57798:4;:29;;;;:::i;:::-;:45;;;;:::i;:::-;57771:72;;57877:14;;57858:16;:33;57854:99;;;57925:16;57908:14;:33;;;;57854:99;56756:1204;;;56715:1245::o;40517:104::-;40573:13;40606:7;40599:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40517:104;:::o;44875:436::-;44968:4;44985:13;45001:12;:10;:12::i;:::-;44985:28;;45024:24;45051:25;45061:5;45068:7;45051:9;:25::i;:::-;45024:52;;45115:15;45095:16;:35;;45087:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45208:60;45217:5;45224:7;45252:15;45233:16;:34;45208:8;:60::i;:::-;45299:4;45292:11;;;;44875:436;;;;:::o;41922:193::-;42001:4;42018:13;42034:12;:10;:12::i;:::-;42018:28;;42057;42067:5;42074:2;42078:6;42057:9;:28::i;:::-;42103:4;42096:11;;;41922:193;;;;:::o;55363:72::-;55392:42;55363:72;:::o;57968:418::-;58022:21;58076:1;58064:9;:13;58056:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58136:24;:22;:24::i;:::-;58171:58;58192:10;58212:4;58219:9;55313:42;58171:20;;;;:58;;;;;;:::i;:::-;58275:14;;58263:9;58256:4;:16;;;;:::i;:::-;:33;;;;:::i;:::-;58240:49;;58300:32;58306:10;58318:13;58300:5;:32::i;:::-;58356:10;58348:30;;;58368:9;58348:30;;;;;;:::i;:::-;;;;;;;;57968:418;;;:::o;55277:79::-;55313:42;55277:79;:::o;52934:645::-;53178:8;53159:15;:27;;53151:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53233:18;52109:95;53293:5;53300:7;53309:5;53316:16;53326:5;53316:9;:16::i;:::-;53334:8;53264:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53254:90;;;;;;53233:111;;53357:12;53372:28;53389:10;53372:16;:28::i;:::-;53357:43;;53413:14;53430:28;53444:4;53450:1;53453;53456;53430:13;:28::i;:::-;53413:45;;53487:5;53477:15;;:6;:15;;;53469:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53540:31;53549:5;53556:7;53565:5;53540:8;:31::i;:::-;53140:439;;;52934:645;;;;;;;:::o;56458:111::-;56506:7;55313:42;56533:13;;;56555:4;56533:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56526:35;;56458:111;:::o;42178:151::-;42267:7;42294:11;:18;42306:5;42294:18;;;;;;;;;;;;;;;:27;42313:7;42294:27;;;;;;;;;;;;;;;;42287:34;;42178:151;;;;:::o;56577:126::-;56630:7;56678:17;:15;:17::i;:::-;56657:18;:16;:18::i;:::-;:38;;;;:::i;:::-;56650:45;;56577:126;:::o;55584:57::-;55638:3;55584:57;:::o;55551:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29820:98::-;29873:7;29900:10;29893:17;;29820:98;:::o;48500:380::-;48653:1;48636:19;;:5;:19;;;48628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48734:1;48715:21;;:7;:21;;;48707:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48818:6;48788:11;:18;48800:5;48788:18;;;;;;;;;;;;;;;:27;48807:7;48788:27;;;;;;;;;;;;;;;:36;;;;48856:7;48840:32;;48849:5;48840:32;;;48865:6;48840:32;;;;;;:::i;:::-;;;;;;;;48500:380;;;:::o;49171:453::-;49306:24;49333:25;49343:5;49350:7;49333:9;:25::i;:::-;49306:52;;49393:17;49373:16;:37;49369:248;;49455:6;49435:16;:26;;49427:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49539:51;49548:5;49555:7;49583:6;49564:16;:25;49539:8;:51::i;:::-;49369:248;49295:329;49171:453;;;:::o;45781:671::-;45928:1;45912:18;;:4;:18;;;45904:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46005:1;45991:16;;:2;:16;;;45983:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46060:38;46081:4;46087:2;46091:6;46060:20;:38::i;:::-;46111:19;46133:9;:15;46143:4;46133:15;;;;;;;;;;;;;;;;46111:37;;46182:6;46167:11;:21;;46159:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;46299:6;46285:11;:20;46267:9;:15;46277:4;46267:15;;;;;;;;;;;;;;;:38;;;;46344:6;46327:9;:13;46337:2;46327:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;46383:2;46368:26;;46377:4;46368:26;;;46387:6;46368:26;;;;;;:::i;:::-;;;;;;;;46407:37;46427:4;46433:2;46437:6;46407:19;:37::i;:::-;45893:559;45781:671;;;:::o;47471:591::-;47574:1;47555:21;;:7;:21;;;47547:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47627:49;47648:7;47665:1;47669:6;47627:20;:49::i;:::-;47689:22;47714:9;:18;47724:7;47714:18;;;;;;;;;;;;;;;;47689:43;;47769:6;47751:14;:24;;47743:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47888:6;47871:14;:23;47850:9;:18;47860:7;47850:18;;;;;;;;;;;;;;;:44;;;;47932:6;47916:12;;:22;;;;;;;:::i;:::-;;;;;;;;47982:1;47956:37;;47965:7;47956:37;;;47986:6;47956:37;;;;;;:::i;:::-;;;;;;;;48006:48;48026:7;48043:1;48047:6;48006:19;:48::i;:::-;47536:526;47471:591;;:::o;33627:211::-;33744:86;33764:5;33794:23;;;33819:2;33823:5;33771:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33744:19;:86::i;:::-;33627:211;;;:::o;16822:314::-;16875:7;16916:12;16899:29;;16907:4;16899:29;;;:66;;;;;16949:16;16932:13;:33;16899:66;16895:234;;;16989:24;16982:31;;;;16895:234;17053:64;17075:10;17087:12;17101:15;17053:21;:64::i;:::-;17046:71;;16822:314;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;33846:248::-;33990:96;34010:5;34040:27;;;34069:4;34075:2;34079:5;34017:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33990:19;:96::i;:::-;33846:248;;;;:::o;46739:399::-;46842:1;46823:21;;:7;:21;;;46815:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46893:49;46922:1;46926:7;46935:6;46893:20;:49::i;:::-;46971:6;46955:12;;:22;;;;;;;:::i;:::-;;;;;;;;47010:6;46988:9;:18;46998:7;46988:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;47053:7;47032:37;;47049:1;47032:37;;;47062:6;47032:37;;;;;;:::i;:::-;;;;;;;;47082:48;47110:1;47114:7;47123:6;47082:19;:48::i;:::-;46739:399;;:::o;54156:207::-;54216:15;54244:30;54277:7;:14;54285:5;54277:14;;;;;;;;;;;;;;;54244:47;;54312:15;:5;:13;:15::i;:::-;54302:25;;54338:17;:5;:15;:17::i;:::-;54233:130;54156:207;;;:::o;18049:167::-;18126:7;18153:55;18175:20;:18;:20::i;:::-;18197:10;18153:21;:55::i;:::-;18146:62;;18049:167;;;:::o;11698:279::-;11826:7;11847:17;11866:18;11888:25;11899:4;11905:1;11908;11911;11888:10;:25::i;:::-;11846:67;;;;11924:18;11936:5;11924:11;:18::i;:::-;11960:9;11953:16;;;;11698:279;;;;;;:::o;50224:125::-;;;;:::o;50953:124::-;;;;:::o;36694:716::-;37118:23;37144:69;37172:4;37144:69;;;;;;;;;;;;;;;;;37152:5;37144:27;;;;:69;;;;;:::i;:::-;37118:95;;37248:1;37228:10;:17;:21;37224:179;;;37325:10;37314:30;;;;;;;;;;;;:::i;:::-;37306:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37224:179;36764:646;36694:716;;:::o;17144:263::-;17288:7;17336:8;17346;17356:11;17369:13;17392:4;17325:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17315:84;;;;;;17308:91;;17144:263;;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;13389:196::-;13482:7;13548:15;13565:10;13519:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13509:68;;;;;;13502:75;;13389:196;;;;:::o;9927:1632::-;10058:7;10067:12;10992:66;10987:1;10979:10;;:79;10975:163;;;11091:1;11095:30;11075:51;;;;;;10975:163;11157:2;11152:1;:7;;;;:18;;;;;11168:2;11163:1;:7;;;;11152:18;11148:102;;;11203:1;11207:30;11187:51;;;;;;11148:102;11347:14;11364:24;11374:4;11380:1;11383;11386;11364:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11347:41;;11421:1;11403:20;;:6;:20;;;11399:103;;11456:1;11460:29;11440:50;;;;;;;11399:103;11522:6;11530:20;11514:37;;;;;9927:1632;;;;;;;;:::o;4540:643::-;4618:20;4609:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;4605:571;4655:7;4605:571;4716:29;4707:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;4703:473;;4762:34;;;;;;;;;;:::i;:::-;;;;;;;;4703:473;4827:35;4818:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;4814:362;;4879:41;;;;;;;;;;:::i;:::-;;;;;;;;4814:362;4951:30;4942:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4938:238;;4998:44;;;;;;;;;;:::i;:::-;;;;;;;;4938:238;5073:30;5064:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5060:116;;5120:44;;;;;;;;;;:::i;:::-;;;;;;;;5060:116;4540:643;;:::o;22201:229::-;22338:12;22370:52;22392:6;22400:4;22406:1;22409:12;22370:21;:52::i;:::-;22363:59;;22201:229;;;;;:::o;23321:510::-;23491:12;23549:5;23524:21;:30;;23516:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23616:18;23627:6;23616:10;:18::i;:::-;23608:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23682:12;23696:23;23723:6;:11;;23742:5;23749:4;23723:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23681:73;;;;23772:51;23789:7;23798:10;23810:12;23772:16;:51::i;:::-;23765:58;;;;23321:510;;;;;;:::o;19456:326::-;19516:4;19773:1;19751:7;:19;;;:23;19744:30;;19456:326;;;:::o;26007:762::-;26157:12;26186:7;26182:580;;;26217:10;26210:17;;;;26182:580;26351:1;26331:10;:17;:21;26327:424;;;26579:10;26573:17;26640:15;26627:10;26623:2;26619:19;26612:44;26327:424;26722:12;26715:20;;;;;;;;;;;:::i;:::-;;;;;;;;26007:762;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:60::-;3474:3;3495:5;3488:12;;3446:60;;;:::o;3512:142::-;3562:9;3595:53;3613:34;3622:24;3640:5;3622:24;:::i;:::-;3613:34;:::i;:::-;3595:53;:::i;:::-;3582:66;;3512:142;;;:::o;3660:126::-;3710:9;3743:37;3774:5;3743:37;:::i;:::-;3730:50;;3660:126;;;:::o;3792:147::-;3863:9;3896:37;3927:5;3896:37;:::i;:::-;3883:50;;3792:147;;;:::o;3945:173::-;4053:58;4105:5;4053:58;:::i;:::-;4048:3;4041:71;3945:173;;:::o;4124:264::-;4238:4;4276:2;4265:9;4261:18;4253:26;;4289:92;4378:1;4367:9;4363:17;4354:6;4289:92;:::i;:::-;4124:264;;;;:::o;4394:118::-;4481:24;4499:5;4481:24;:::i;:::-;4476:3;4469:37;4394:118;;:::o;4518:222::-;4611:4;4649:2;4638:9;4634:18;4626:26;;4662:71;4730:1;4719:9;4715:17;4706:6;4662:71;:::i;:::-;4518:222;;;;:::o;4746:619::-;4823:6;4831;4839;4888:2;4876:9;4867:7;4863:23;4859:32;4856:119;;;4894:79;;:::i;:::-;4856:119;5014:1;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4985:117;5141:2;5167:53;5212:7;5203:6;5192:9;5188:22;5167:53;:::i;:::-;5157:63;;5112:118;5269:2;5295:53;5340:7;5331:6;5320:9;5316:22;5295:53;:::i;:::-;5285:63;;5240:118;4746:619;;;;;:::o;5371:329::-;5430:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:119;;;5485:79;;:::i;:::-;5447:119;5605:1;5630:53;5675:7;5666:6;5655:9;5651:22;5630:53;:::i;:::-;5620:63;;5576:117;5371:329;;;;:::o;5706:86::-;5741:7;5781:4;5774:5;5770:16;5759:27;;5706:86;;;:::o;5798:112::-;5881:22;5897:5;5881:22;:::i;:::-;5876:3;5869:35;5798:112;;:::o;5916:214::-;6005:4;6043:2;6032:9;6028:18;6020:26;;6056:67;6120:1;6109:9;6105:17;6096:6;6056:67;:::i;:::-;5916:214;;;;:::o;6136:77::-;6173:7;6202:5;6191:16;;6136:77;;;:::o;6219:118::-;6306:24;6324:5;6306:24;:::i;:::-;6301:3;6294:37;6219:118;;:::o;6343:222::-;6436:4;6474:2;6463:9;6459:18;6451:26;;6487:71;6555:1;6544:9;6540:17;6531:6;6487:71;:::i;:::-;6343:222;;;;:::o;6571:329::-;6630:6;6679:2;6667:9;6658:7;6654:23;6650:32;6647:119;;;6685:79;;:::i;:::-;6647:119;6805:1;6830:53;6875:7;6866:6;6855:9;6851:22;6830:53;:::i;:::-;6820:63;;6776:117;6571:329;;;;:::o;6906:138::-;6968:9;7001:37;7032:5;7001:37;:::i;:::-;6988:50;;6906:138;;;:::o;7050:155::-;7149:49;7192:5;7149:49;:::i;:::-;7144:3;7137:62;7050:155;;:::o;7211:246::-;7316:4;7354:2;7343:9;7339:18;7331:26;;7367:83;7447:1;7436:9;7432:17;7423:6;7367:83;:::i;:::-;7211:246;;;;:::o;7463:141::-;7528:9;7561:37;7592:5;7561:37;:::i;:::-;7548:50;;7463:141;;;:::o;7610:161::-;7712:52;7758:5;7712:52;:::i;:::-;7707:3;7700:65;7610:161;;:::o;7777:252::-;7885:4;7923:2;7912:9;7908:18;7900:26;;7936:86;8019:1;8008:9;8004:17;7995:6;7936:86;:::i;:::-;7777:252;;;;:::o;8035:118::-;8106:22;8122:5;8106:22;:::i;:::-;8099:5;8096:33;8086:61;;8143:1;8140;8133:12;8086:61;8035:118;:::o;8159:135::-;8203:5;8241:6;8228:20;8219:29;;8257:31;8282:5;8257:31;:::i;:::-;8159:135;;;;:::o;8300:122::-;8373:24;8391:5;8373:24;:::i;:::-;8366:5;8363:35;8353:63;;8412:1;8409;8402:12;8353:63;8300:122;:::o;8428:139::-;8474:5;8512:6;8499:20;8490:29;;8528:33;8555:5;8528:33;:::i;:::-;8428:139;;;;:::o;8573:1199::-;8684:6;8692;8700;8708;8716;8724;8732;8781:3;8769:9;8760:7;8756:23;8752:33;8749:120;;;8788:79;;:::i;:::-;8749:120;8908:1;8933:53;8978:7;8969:6;8958:9;8954:22;8933:53;:::i;:::-;8923:63;;8879:117;9035:2;9061:53;9106:7;9097:6;9086:9;9082:22;9061:53;:::i;:::-;9051:63;;9006:118;9163:2;9189:53;9234:7;9225:6;9214:9;9210:22;9189:53;:::i;:::-;9179:63;;9134:118;9291:2;9317:53;9362:7;9353:6;9342:9;9338:22;9317:53;:::i;:::-;9307:63;;9262:118;9419:3;9446:51;9489:7;9480:6;9469:9;9465:22;9446:51;:::i;:::-;9436:61;;9390:117;9546:3;9573:53;9618:7;9609:6;9598:9;9594:22;9573:53;:::i;:::-;9563:63;;9517:119;9675:3;9702:53;9747:7;9738:6;9727:9;9723:22;9702:53;:::i;:::-;9692:63;;9646:119;8573:1199;;;;;;;;;;:::o;9778:474::-;9846:6;9854;9903:2;9891:9;9882:7;9878:23;9874:32;9871:119;;;9909:79;;:::i;:::-;9871:119;10029:1;10054:53;10099:7;10090:6;10079:9;10075:22;10054:53;:::i;:::-;10044:63;;10000:117;10156:2;10182:53;10227:7;10218:6;10207:9;10203:22;10182:53;:::i;:::-;10172:63;;10127:118;9778:474;;;;;:::o;10258:118::-;10345:24;10363:5;10345:24;:::i;:::-;10340:3;10333:37;10258:118;;:::o;10382:222::-;10475:4;10513:2;10502:9;10498:18;10490:26;;10526:71;10594:1;10583:9;10579:17;10570:6;10526:71;:::i;:::-;10382:222;;;;:::o;10610:180::-;10658:77;10655:1;10648:88;10755:4;10752:1;10745:15;10779:4;10776:1;10769:15;10796:320;10840:6;10877:1;10871:4;10867:12;10857:22;;10924:1;10918:4;10914:12;10945:18;10935:81;;11001:4;10993:6;10989:17;10979:27;;10935:81;11063:2;11055:6;11052:14;11032:18;11029:38;11026:84;;11082:18;;:::i;:::-;11026:84;10847:269;10796:320;;;:::o;11122:231::-;11262:34;11258:1;11250:6;11246:14;11239:58;11331:14;11326:2;11318:6;11314:15;11307:39;11122:231;:::o;11359:366::-;11501:3;11522:67;11586:2;11581:3;11522:67;:::i;:::-;11515:74;;11598:93;11687:3;11598:93;:::i;:::-;11716:2;11711:3;11707:12;11700:19;;11359:366;;;:::o;11731:419::-;11897:4;11935:2;11924:9;11920:18;11912:26;;11984:9;11978:4;11974:20;11970:1;11959:9;11955:17;11948:47;12012:131;12138:4;12012:131;:::i;:::-;12004:139;;11731:419;;;:::o;12156:180::-;12204:77;12201:1;12194:88;12301:4;12298:1;12291:15;12325:4;12322:1;12315:15;12342:410;12382:7;12405:20;12423:1;12405:20;:::i;:::-;12400:25;;12439:20;12457:1;12439:20;:::i;:::-;12434:25;;12494:1;12491;12487:9;12516:30;12534:11;12516:30;:::i;:::-;12505:41;;12695:1;12686:7;12682:15;12679:1;12676:22;12656:1;12649:9;12629:83;12606:139;;12725:18;;:::i;:::-;12606:139;12390:362;12342:410;;;;:::o;12758:180::-;12806:77;12803:1;12796:88;12903:4;12900:1;12893:15;12927:4;12924:1;12917:15;12944:185;12984:1;13001:20;13019:1;13001:20;:::i;:::-;12996:25;;13035:20;13053:1;13035:20;:::i;:::-;13030:25;;13074:1;13064:35;;13079:18;;:::i;:::-;13064:35;13121:1;13118;13114:9;13109:14;;12944:185;;;;:::o;13135:143::-;13192:5;13223:6;13217:13;13208:22;;13239:33;13266:5;13239:33;:::i;:::-;13135:143;;;;:::o;13284:351::-;13354:6;13403:2;13391:9;13382:7;13378:23;13374:32;13371:119;;;13409:79;;:::i;:::-;13371:119;13529:1;13554:64;13610:7;13601:6;13590:9;13586:22;13554:64;:::i;:::-;13544:74;;13500:128;13284:351;;;;:::o;13641:191::-;13681:3;13700:20;13718:1;13700:20;:::i;:::-;13695:25;;13734:20;13752:1;13734:20;:::i;:::-;13729:25;;13777:1;13774;13770:9;13763:16;;13798:3;13795:1;13792:10;13789:36;;;13805:18;;:::i;:::-;13789:36;13641:191;;;;:::o;13838:663::-;13926:6;13934;13942;13991:2;13979:9;13970:7;13966:23;13962:32;13959:119;;;13997:79;;:::i;:::-;13959:119;14117:1;14142:64;14198:7;14189:6;14178:9;14174:22;14142:64;:::i;:::-;14132:74;;14088:128;14255:2;14281:64;14337:7;14328:6;14317:9;14313:22;14281:64;:::i;:::-;14271:74;;14226:129;14394:2;14420:64;14476:7;14467:6;14456:9;14452:22;14420:64;:::i;:::-;14410:74;;14365:129;13838:663;;;;;:::o;14507:111::-;14571:6;14605:5;14599:12;14589:22;;14507:111;;;:::o;14624:184::-;14723:11;14757:6;14752:3;14745:19;14797:4;14792:3;14788:14;14773:29;;14624:184;;;;:::o;14814:156::-;14878:4;14901:3;14893:11;;14924:3;14921:1;14914:14;14958:4;14955:1;14945:18;14937:26;;14814:156;;;:::o;14976:108::-;15053:24;15071:5;15053:24;:::i;:::-;15048:3;15041:37;14976:108;;:::o;15090:179::-;15159:10;15180:46;15222:3;15214:6;15180:46;:::i;:::-;15258:4;15253:3;15249:14;15235:28;;15090:179;;;;:::o;15275:102::-;15317:8;15364:5;15361:1;15357:13;15336:34;;15275:102;;;:::o;15383:139::-;15433:7;15473:42;15466:5;15462:54;15451:65;;15383:139;;;:::o;15528:166::-;15597:5;15622:66;15653:34;15676:10;15653:34;:::i;:::-;15622:66;:::i;:::-;15613:75;;15528:166;;;:::o;15700:144::-;15755:5;15780:57;15831:4;15825:11;15780:57;:::i;:::-;15771:66;;15700:144;;;:::o;15850:110::-;15917:4;15949;15944:3;15940:14;15932:22;;15850:110;;;:::o;15996:751::-;16112:3;16141:51;16186:5;16141:51;:::i;:::-;16208:86;16287:6;16282:3;16208:86;:::i;:::-;16201:93;;16318:53;16365:5;16318:53;:::i;:::-;16394:7;16425:1;16410:312;16435:6;16432:1;16429:13;16410:312;;;16505:44;16542:6;16505:44;:::i;:::-;16569:63;16628:3;16613:13;16569:63;:::i;:::-;16562:70;;16655:57;16705:6;16655:57;:::i;:::-;16645:67;;16470:252;16457:1;16454;16450:9;16445:14;;16410:312;;;16414:14;16738:3;16731:10;;16117:630;;;15996:751;;;;:::o;16753:477::-;16921:4;16959:2;16948:9;16944:18;16936:26;;16972:71;17040:1;17029:9;17025:17;17016:6;16972:71;:::i;:::-;17090:9;17084:4;17080:20;17075:2;17064:9;17060:18;17053:48;17118:105;17218:4;17209:6;17118:105;:::i;:::-;17110:113;;16753:477;;;;;:::o;17236:117::-;17345:1;17342;17335:12;17359:180;17407:77;17404:1;17397:88;17504:4;17501:1;17494:15;17528:4;17525:1;17518:15;17545:281;17628:27;17650:4;17628:27;:::i;:::-;17620:6;17616:40;17758:6;17746:10;17743:22;17722:18;17710:10;17707:34;17704:62;17701:88;;;17769:18;;:::i;:::-;17701:88;17809:10;17805:2;17798:22;17588:238;17545:281;;:::o;17832:129::-;17866:6;17893:20;;:::i;:::-;17883:30;;17922:33;17950:4;17942:6;17922:33;:::i;:::-;17832:129;;;:::o;17967:311::-;18044:4;18134:18;18126:6;18123:30;18120:56;;;18156:18;;:::i;:::-;18120:56;18206:4;18198:6;18194:17;18186:25;;18266:4;18260;18256:15;18248:23;;17967:311;;;:::o;18284:117::-;18393:1;18390;18383:12;18424:732;18531:5;18556:81;18572:64;18629:6;18572:64;:::i;:::-;18556:81;:::i;:::-;18547:90;;18657:5;18686:6;18679:5;18672:21;18720:4;18713:5;18709:16;18702:23;;18773:4;18765:6;18761:17;18753:6;18749:30;18802:3;18794:6;18791:15;18788:122;;;18821:79;;:::i;:::-;18788:122;18936:6;18919:231;18953:6;18948:3;18945:15;18919:231;;;19028:3;19057:48;19101:3;19089:10;19057:48;:::i;:::-;19052:3;19045:61;19135:4;19130:3;19126:14;19119:21;;18995:155;18979:4;18974:3;18970:14;18963:21;;18919:231;;;18923:21;18537:619;;18424:732;;;;;:::o;19179:385::-;19261:5;19310:3;19303:4;19295:6;19291:17;19287:27;19277:122;;19318:79;;:::i;:::-;19277:122;19428:6;19422:13;19453:105;19554:3;19546:6;19539:4;19531:6;19527:17;19453:105;:::i;:::-;19444:114;;19267:297;19179:385;;;;:::o;19570:554::-;19665:6;19714:2;19702:9;19693:7;19689:23;19685:32;19682:119;;;19720:79;;:::i;:::-;19682:119;19861:1;19850:9;19846:17;19840:24;19891:18;19883:6;19880:30;19877:117;;;19913:79;;:::i;:::-;19877:117;20018:89;20099:7;20090:6;20079:9;20075:22;20018:89;:::i;:::-;20008:99;;19811:306;19570:554;;;;:::o;20130:180::-;20178:77;20175:1;20168:88;20275:4;20272:1;20265:15;20299:4;20296:1;20289:15;20316:332;20437:4;20475:2;20464:9;20460:18;20452:26;;20488:71;20556:1;20545:9;20541:17;20532:6;20488:71;:::i;:::-;20569:72;20637:2;20626:9;20622:18;20613:6;20569:72;:::i;:::-;20316:332;;;;;:::o;20654:116::-;20724:21;20739:5;20724:21;:::i;:::-;20717:5;20714:32;20704:60;;20760:1;20757;20750:12;20704:60;20654:116;:::o;20776:137::-;20830:5;20861:6;20855:13;20846:22;;20877:30;20901:5;20877:30;:::i;:::-;20776:137;;;;:::o;20919:345::-;20986:6;21035:2;21023:9;21014:7;21010:23;21006:32;21003:119;;;21041:79;;:::i;:::-;21003:119;21161:1;21186:61;21239:7;21230:6;21219:9;21215:22;21186:61;:::i;:::-;21176:71;;21132:125;20919:345;;;;:::o;21270:809::-;21522:4;21560:3;21549:9;21545:19;21537:27;;21574:71;21642:1;21631:9;21627:17;21618:6;21574:71;:::i;:::-;21655:72;21723:2;21712:9;21708:18;21699:6;21655:72;:::i;:::-;21774:9;21768:4;21764:20;21759:2;21748:9;21744:18;21737:48;21802:105;21902:4;21893:6;21802:105;:::i;:::-;21794:113;;21917:72;21985:2;21974:9;21970:18;21961:6;21917:72;:::i;:::-;21999:73;22067:3;22056:9;22052:19;22043:6;21999:73;:::i;:::-;21270:809;;;;;;;;:::o;22085:224::-;22225:34;22221:1;22213:6;22209:14;22202:58;22294:7;22289:2;22281:6;22277:15;22270:32;22085:224;:::o;22315:366::-;22457:3;22478:67;22542:2;22537:3;22478:67;:::i;:::-;22471:74;;22554:93;22643:3;22554:93;:::i;:::-;22672:2;22667:3;22663:12;22656:19;;22315:366;;;:::o;22687:419::-;22853:4;22891:2;22880:9;22876:18;22868:26;;22940:9;22934:4;22930:20;22926:1;22915:9;22911:17;22904:47;22968:131;23094:4;22968:131;:::i;:::-;22960:139;;22687:419;;;:::o;23112:230::-;23252:34;23248:1;23240:6;23236:14;23229:58;23321:13;23316:2;23308:6;23304:15;23297:38;23112:230;:::o;23348:366::-;23490:3;23511:67;23575:2;23570:3;23511:67;:::i;:::-;23504:74;;23587:93;23676:3;23587:93;:::i;:::-;23705:2;23700:3;23696:12;23689:19;;23348:366;;;:::o;23720:419::-;23886:4;23924:2;23913:9;23909:18;23901:26;;23973:9;23967:4;23963:20;23959:1;23948:9;23944:17;23937:47;24001:131;24127:4;24001:131;:::i;:::-;23993:139;;23720:419;;;:::o;24145:179::-;24285:31;24281:1;24273:6;24269:14;24262:55;24145:179;:::o;24330:366::-;24472:3;24493:67;24557:2;24552:3;24493:67;:::i;:::-;24486:74;;24569:93;24658:3;24569:93;:::i;:::-;24687:2;24682:3;24678:12;24671:19;;24330:366;;;:::o;24702:419::-;24868:4;24906:2;24895:9;24891:18;24883:26;;24955:9;24949:4;24945:20;24941:1;24930:9;24926:17;24919:47;24983:131;25109:4;24983:131;:::i;:::-;24975:139;;24702:419;;;:::o;25127:775::-;25360:4;25398:3;25387:9;25383:19;25375:27;;25412:71;25480:1;25469:9;25465:17;25456:6;25412:71;:::i;:::-;25493:72;25561:2;25550:9;25546:18;25537:6;25493:72;:::i;:::-;25575;25643:2;25632:9;25628:18;25619:6;25575:72;:::i;:::-;25657;25725:2;25714:9;25710:18;25701:6;25657:72;:::i;:::-;25739:73;25807:3;25796:9;25792:19;25783:6;25739:73;:::i;:::-;25822;25890:3;25879:9;25875:19;25866:6;25822:73;:::i;:::-;25127:775;;;;;;;;;:::o;25908:180::-;26048:32;26044:1;26036:6;26032:14;26025:56;25908:180;:::o;26094:366::-;26236:3;26257:67;26321:2;26316:3;26257:67;:::i;:::-;26250:74;;26333:93;26422:3;26333:93;:::i;:::-;26451:2;26446:3;26442:12;26435:19;;26094:366;;;:::o;26466:419::-;26632:4;26670:2;26659:9;26655:18;26647:26;;26719:9;26713:4;26709:20;26705:1;26694:9;26690:17;26683:47;26747:131;26873:4;26747:131;:::i;:::-;26739:139;;26466:419;;;:::o;26891:223::-;27031:34;27027:1;27019:6;27015:14;27008:58;27100:6;27095:2;27087:6;27083:15;27076:31;26891:223;:::o;27120:366::-;27262:3;27283:67;27347:2;27342:3;27283:67;:::i;:::-;27276:74;;27359:93;27448:3;27359:93;:::i;:::-;27477:2;27472:3;27468:12;27461:19;;27120:366;;;:::o;27492:419::-;27658:4;27696:2;27685:9;27681:18;27673:26;;27745:9;27739:4;27735:20;27731:1;27720:9;27716:17;27709:47;27773:131;27899:4;27773:131;:::i;:::-;27765:139;;27492:419;;;:::o;27917:221::-;28057:34;28053:1;28045:6;28041:14;28034:58;28126:4;28121:2;28113:6;28109:15;28102:29;27917:221;:::o;28144:366::-;28286:3;28307:67;28371:2;28366:3;28307:67;:::i;:::-;28300:74;;28383:93;28472:3;28383:93;:::i;:::-;28501:2;28496:3;28492:12;28485:19;;28144:366;;;:::o;28516:419::-;28682:4;28720:2;28709:9;28705:18;28697:26;;28769:9;28763:4;28759:20;28755:1;28744:9;28740:17;28733:47;28797:131;28923:4;28797:131;:::i;:::-;28789:139;;28516:419;;;:::o;28941:179::-;29081:31;29077:1;29069:6;29065:14;29058:55;28941:179;:::o;29126:366::-;29268:3;29289:67;29353:2;29348:3;29289:67;:::i;:::-;29282:74;;29365:93;29454:3;29365:93;:::i;:::-;29483:2;29478:3;29474:12;29467:19;;29126:366;;;:::o;29498:419::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29498:419;;;:::o;29923:224::-;30063:34;30059:1;30051:6;30047:14;30040:58;30132:7;30127:2;30119:6;30115:15;30108:32;29923:224;:::o;30153:366::-;30295:3;30316:67;30380:2;30375:3;30316:67;:::i;:::-;30309:74;;30392:93;30481:3;30392:93;:::i;:::-;30510:2;30505:3;30501:12;30494:19;;30153:366;;;:::o;30525:419::-;30691:4;30729:2;30718:9;30714:18;30706:26;;30778:9;30772:4;30768:20;30764:1;30753:9;30749:17;30742:47;30806:131;30932:4;30806:131;:::i;:::-;30798:139;;30525:419;;;:::o;30950:222::-;31090:34;31086:1;31078:6;31074:14;31067:58;31159:5;31154:2;31146:6;31142:15;31135:30;30950:222;:::o;31178:366::-;31320:3;31341:67;31405:2;31400:3;31341:67;:::i;:::-;31334:74;;31417:93;31506:3;31417:93;:::i;:::-;31535:2;31530:3;31526:12;31519:19;;31178:366;;;:::o;31550:419::-;31716:4;31754:2;31743:9;31739:18;31731:26;;31803:9;31797:4;31793:20;31789:1;31778:9;31774:17;31767:47;31831:131;31957:4;31831:131;:::i;:::-;31823:139;;31550:419;;;:::o;31975:225::-;32115:34;32111:1;32103:6;32099:14;32092:58;32184:8;32179:2;32171:6;32167:15;32160:33;31975:225;:::o;32206:366::-;32348:3;32369:67;32433:2;32428:3;32369:67;:::i;:::-;32362:74;;32445:93;32534:3;32445:93;:::i;:::-;32563:2;32558:3;32554:12;32547:19;;32206:366;;;:::o;32578:419::-;32744:4;32782:2;32771:9;32767:18;32759:26;;32831:9;32825:4;32821:20;32817:1;32806:9;32802:17;32795:47;32859:131;32985:4;32859:131;:::i;:::-;32851:139;;32578:419;;;:::o;33003:220::-;33143:34;33139:1;33131:6;33127:14;33120:58;33212:3;33207:2;33199:6;33195:15;33188:28;33003:220;:::o;33229:366::-;33371:3;33392:67;33456:2;33451:3;33392:67;:::i;:::-;33385:74;;33468:93;33557:3;33468:93;:::i;:::-;33586:2;33581:3;33577:12;33570:19;;33229:366;;;:::o;33601:419::-;33767:4;33805:2;33794:9;33790:18;33782:26;;33854:9;33848:4;33844:20;33840:1;33829:9;33825:17;33818:47;33882:131;34008:4;33882:131;:::i;:::-;33874:139;;33601:419;;;:::o;34026:221::-;34166:34;34162:1;34154:6;34150:14;34143:58;34235:4;34230:2;34222:6;34218:15;34211:29;34026:221;:::o;34253:366::-;34395:3;34416:67;34480:2;34475:3;34416:67;:::i;:::-;34409:74;;34492:93;34581:3;34492:93;:::i;:::-;34610:2;34605:3;34601:12;34594:19;;34253:366;;;:::o;34625:419::-;34791:4;34829:2;34818:9;34814:18;34806:26;;34878:9;34872:4;34868:20;34864:1;34853:9;34849:17;34842:47;34906:131;35032:4;34906:131;:::i;:::-;34898:139;;34625:419;;;:::o;35050:194::-;35090:4;35110:20;35128:1;35110:20;:::i;:::-;35105:25;;35144:20;35162:1;35144:20;:::i;:::-;35139:25;;35188:1;35185;35181:9;35173:17;;35212:1;35206:4;35203:11;35200:37;;;35217:18;;:::i;:::-;35200:37;35050:194;;;;:::o;35250:442::-;35399:4;35437:2;35426:9;35422:18;35414:26;;35450:71;35518:1;35507:9;35503:17;35494:6;35450:71;:::i;:::-;35531:72;35599:2;35588:9;35584:18;35575:6;35531:72;:::i;:::-;35613;35681:2;35670:9;35666:18;35657:6;35613:72;:::i;:::-;35250:442;;;;;;:::o;35698:181::-;35838:33;35834:1;35826:6;35822:14;35815:57;35698:181;:::o;35885:366::-;36027:3;36048:67;36112:2;36107:3;36048:67;:::i;:::-;36041:74;;36124:93;36213:3;36124:93;:::i;:::-;36242:2;36237:3;36233:12;36226:19;;35885:366;;;:::o;36257:419::-;36423:4;36461:2;36450:9;36446:18;36438:26;;36510:9;36504:4;36500:20;36496:1;36485:9;36481:17;36474:47;36538:131;36664:4;36538:131;:::i;:::-;36530:139;;36257:419;;;:::o;36682:229::-;36822:34;36818:1;36810:6;36806:14;36799:58;36891:12;36886:2;36878:6;36874:15;36867:37;36682:229;:::o;36917:366::-;37059:3;37080:67;37144:2;37139:3;37080:67;:::i;:::-;37073:74;;37156:93;37245:3;37156:93;:::i;:::-;37274:2;37269:3;37265:12;37258:19;;36917:366;;;:::o;37289:419::-;37455:4;37493:2;37482:9;37478:18;37470:26;;37542:9;37536:4;37532:20;37528:1;37517:9;37513:17;37506:47;37570:131;37696:4;37570:131;:::i;:::-;37562:139;;37289:419;;;:::o;37714:664::-;37919:4;37957:3;37946:9;37942:19;37934:27;;37971:71;38039:1;38028:9;38024:17;38015:6;37971:71;:::i;:::-;38052:72;38120:2;38109:9;38105:18;38096:6;38052:72;:::i;:::-;38134;38202:2;38191:9;38187:18;38178:6;38134:72;:::i;:::-;38216;38284:2;38273:9;38269:18;38260:6;38216:72;:::i;:::-;38298:73;38366:3;38355:9;38351:19;38342:6;38298:73;:::i;:::-;37714:664;;;;;;;;:::o;38384:148::-;38486:11;38523:3;38508:18;;38384:148;;;;:::o;38538:214::-;38678:66;38674:1;38666:6;38662:14;38655:90;38538:214;:::o;38758:400::-;38918:3;38939:84;39021:1;39016:3;38939:84;:::i;:::-;38932:91;;39032:93;39121:3;39032:93;:::i;:::-;39150:1;39145:3;39141:11;39134:18;;38758:400;;;:::o;39164:79::-;39203:7;39232:5;39221:16;;39164:79;;;:::o;39249:157::-;39354:45;39374:24;39392:5;39374:24;:::i;:::-;39354:45;:::i;:::-;39349:3;39342:58;39249:157;;:::o;39412:663::-;39653:3;39675:148;39819:3;39675:148;:::i;:::-;39668:155;;39833:75;39904:3;39895:6;39833:75;:::i;:::-;39933:2;39928:3;39924:12;39917:19;;39946:75;40017:3;40008:6;39946:75;:::i;:::-;40046:2;40041:3;40037:12;40030:19;;40066:3;40059:10;;39412:663;;;;;:::o;40081:545::-;40254:4;40292:3;40281:9;40277:19;40269:27;;40306:71;40374:1;40363:9;40359:17;40350:6;40306:71;:::i;:::-;40387:68;40451:2;40440:9;40436:18;40427:6;40387:68;:::i;:::-;40465:72;40533:2;40522:9;40518:18;40509:6;40465:72;:::i;:::-;40547;40615:2;40604:9;40600:18;40591:6;40547:72;:::i;:::-;40081:545;;;;;;;:::o;40632:180::-;40680:77;40677:1;40670:88;40777:4;40774:1;40767:15;40801:4;40798:1;40791:15;40818:174;40958:26;40954:1;40946:6;40942:14;40935:50;40818:174;:::o;40998:366::-;41140:3;41161:67;41225:2;41220:3;41161:67;:::i;:::-;41154:74;;41237:93;41326:3;41237:93;:::i;:::-;41355:2;41350:3;41346:12;41339:19;;40998:366;;;:::o;41370:419::-;41536:4;41574:2;41563:9;41559:18;41551:26;;41623:9;41617:4;41613:20;41609:1;41598:9;41594:17;41587:47;41651:131;41777:4;41651:131;:::i;:::-;41643:139;;41370:419;;;:::o;41795:181::-;41935:33;41931:1;41923:6;41919:14;41912:57;41795:181;:::o;41982:366::-;42124:3;42145:67;42209:2;42204:3;42145:67;:::i;:::-;42138:74;;42221:93;42310:3;42221:93;:::i;:::-;42339:2;42334:3;42330:12;42323:19;;41982:366;;;:::o;42354:419::-;42520:4;42558:2;42547:9;42543:18;42535:26;;42607:9;42601:4;42597:20;42593:1;42582:9;42578:17;42571:47;42635:131;42761:4;42635:131;:::i;:::-;42627:139;;42354:419;;;:::o;42779:221::-;42919:34;42915:1;42907:6;42903:14;42896:58;42988:4;42983:2;42975:6;42971:15;42964:29;42779:221;:::o;43006:366::-;43148:3;43169:67;43233:2;43228:3;43169:67;:::i;:::-;43162:74;;43245:93;43334:3;43245:93;:::i;:::-;43363:2;43358:3;43354:12;43347:19;;43006:366;;;:::o;43378:419::-;43544:4;43582:2;43571:9;43567:18;43559:26;;43631:9;43625:4;43621:20;43617:1;43606:9;43602:17;43595:47;43659:131;43785:4;43659:131;:::i;:::-;43651:139;;43378:419;;;:::o;43803:221::-;43943:34;43939:1;43931:6;43927:14;43920:58;44012:4;44007:2;43999:6;43995:15;43988:29;43803:221;:::o;44030:366::-;44172:3;44193:67;44257:2;44252:3;44193:67;:::i;:::-;44186:74;;44269:93;44358:3;44269:93;:::i;:::-;44387:2;44382:3;44378:12;44371:19;;44030:366;;;:::o;44402:419::-;44568:4;44606:2;44595:9;44591:18;44583:26;;44655:9;44649:4;44645:20;44641:1;44630:9;44626:17;44619:47;44683:131;44809:4;44683:131;:::i;:::-;44675:139;;44402:419;;;:::o;44827:225::-;44967:34;44963:1;44955:6;44951:14;44944:58;45036:8;45031:2;45023:6;45019:15;45012:33;44827:225;:::o;45058:366::-;45200:3;45221:67;45285:2;45280:3;45221:67;:::i;:::-;45214:74;;45297:93;45386:3;45297:93;:::i;:::-;45415:2;45410:3;45406:12;45399:19;;45058:366;;;:::o;45430:419::-;45596:4;45634:2;45623:9;45619:18;45611:26;;45683:9;45677:4;45673:20;45669:1;45658:9;45654:17;45647:47;45711:131;45837:4;45711:131;:::i;:::-;45703:139;;45430:419;;;:::o;45855:179::-;45995:31;45991:1;45983:6;45979:14;45972:55;45855:179;:::o;46040:366::-;46182:3;46203:67;46267:2;46262:3;46203:67;:::i;:::-;46196:74;;46279:93;46368:3;46279:93;:::i;:::-;46397:2;46392:3;46388:12;46381:19;;46040:366;;;:::o;46412:419::-;46578:4;46616:2;46605:9;46601:18;46593:26;;46665:9;46659:4;46655:20;46651:1;46640:9;46636:17;46629:47;46693:131;46819:4;46693:131;:::i;:::-;46685:139;;46412:419;;;:::o;46837:98::-;46888:6;46922:5;46916:12;46906:22;;46837:98;;;:::o;46941:147::-;47042:11;47079:3;47064:18;;46941:147;;;;:::o;47094:386::-;47198:3;47226:38;47258:5;47226:38;:::i;:::-;47280:88;47361:6;47356:3;47280:88;:::i;:::-;47273:95;;47377:65;47435:6;47430:3;47423:4;47416:5;47412:16;47377:65;:::i;:::-;47467:6;47462:3;47458:16;47451:23;;47202:278;47094:386;;;;:::o;47486:271::-;47616:3;47638:93;47727:3;47718:6;47638:93;:::i;:::-;47631:100;;47748:3;47741:10;;47486:271;;;;:::o
Swarm Source
ipfs://7ef6ed1fe5c442db9a4c2f8204ecce5da0f583f5478ff246e08ef68d76a4202a
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.