Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 16077036 | 718 days ago | IN | 0 ETH | 0.00693472 | ||||
Issue For Exact ... | 15949150 | 736 days ago | IN | 0.05 ETH | 0.01143671 | ||||
Redeem | 15949014 | 736 days ago | IN | 0 ETH | 0.01102625 | ||||
Issue For Exact ... | 15942296 | 736 days ago | IN | 0.06 ETH | 0.01607249 | ||||
Redeem | 15942064 | 737 days ago | IN | 0 ETH | 0.01155702 | ||||
Issue For Exact ... | 15941809 | 737 days ago | IN | 0.04 ETH | 0.01517127 | ||||
Issue For Exact ... | 15813859 | 754 days ago | IN | 0.041 ETH | 0.01032782 | ||||
Redeem | 15813686 | 754 days ago | IN | 0 ETH | 0.00869141 | ||||
Seed New Set | 15791867 | 757 days ago | IN | 0.041 ETH | 0.01931886 | ||||
0x60806040 | 15783193 | 759 days ago | IN | 0 ETH | 0.06183523 |
Latest 18 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16077036 | 718 days ago | 0.02326936 ETH | ||||
16077036 | 718 days ago | 0.02326936 ETH | ||||
15949150 | 736 days ago | 0.025 ETH | ||||
15949150 | 736 days ago | 0.025 ETH | ||||
15949014 | 736 days ago | 0.03252529 ETH | ||||
15949014 | 736 days ago | 0.03252529 ETH | ||||
15942296 | 736 days ago | 0.03 ETH | ||||
15942296 | 736 days ago | 0.03 ETH | ||||
15942064 | 737 days ago | 0.03629302 ETH | ||||
15942064 | 737 days ago | 0.03629302 ETH | ||||
15941809 | 737 days ago | 0.02 ETH | ||||
15941809 | 737 days ago | 0.02 ETH | ||||
15813859 | 754 days ago | 0.0205 ETH | ||||
15813859 | 754 days ago | 0.0205 ETH | ||||
15813686 | 754 days ago | 0.01856182 ETH | ||||
15813686 | 754 days ago | 0.01856182 ETH | ||||
15791867 | 757 days ago | 0.0205 ETH | ||||
15791867 | 757 days ago | 0.0205 ETH |
Loading...
Loading
Contract Name:
IssuanceManagerBeta
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-19 */ // 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: contracts\IToken.sol pragma solidity ^0.8.0; interface IToken is IERC20{ struct externalPosition{ address externalContract; uint256 id; } function burn(address _account, uint256 _amount) external; function mint(address _account, uint256 _quantity) external; function approveComponent(address _token, address _spender, uint256 _amount) external; function getComponents() external view returns(address[] memory); function getExternalComponents() external view returns(externalPosition[] memory); function getShare(address _component) external view returns(uint); function editComponent(address _component, uint256 _amount) external; function getCumulativeShare() external view returns(uint256); function basePrice() external view returns(uint256); function addNode(address _node) external; function updateTransferFee(uint256 newFee) external; function editFeeWallet(address newWallet) external; } // File: contracts\exchange\MinimalSwap.sol pragma solidity ^0.8.0; interface IUniswapV2Pair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; } interface WETH9{ function deposit() external payable; function withdraw(uint wad) external; function balanceOf(address account) external returns(uint256); function approve(address to, uint256 amount) external; function transferFrom(address from, address to, uint256 wad) external; function transfer(address to, uint256 amount) external; function totalSupply() external view returns(uint256); } contract MinimalSwap{ WETH9 WETH; constructor(address _WETH){ WETH = WETH9(_WETH); } function _getAmountOut(address pool, uint256 amountIn, bool fromWETH) internal view returns(uint256){ IUniswapV2Pair pair = IUniswapV2Pair(pool); (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (reserve0, reserve1) = pair.token0() == address(WETH) ? fromWETH ? (reserve0, reserve1) : (reserve1, reserve0) : fromWETH ? (reserve1, reserve0) : (reserve0, reserve1); uint256 aInFee = amountIn * 997; uint256 numerator = aInFee * reserve1; uint256 denominator = (reserve0 * 1000) + aInFee; return numerator/denominator; } //From should be address for all cases, but redeem function _rawPoolSwap(address poolAddr, uint256 amountIn, address to, address from, bool fromWETH) internal returns(uint256) { uint256 amountOut = _getAmountOut(poolAddr, amountIn, fromWETH); IUniswapV2Pair pool = IUniswapV2Pair(poolAddr); (address token0, address token1) = (pool.token0(), pool.token1()); WETH9 tokenIn = fromWETH ? WETH : token0 == address(WETH) ? WETH9(token1) : WETH9(token0); (uint256 amount0out, uint256 amount1out) = address(tokenIn) == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); tokenIn.transferFrom(from, poolAddr, amountIn); pool.swap(amount0out, amount1out, to, new bytes(0)); return amountOut; } function _getPoolToken(address pool) internal view returns(address token){ (address token0, address token1) = (IUniswapV2Pair(pool).token0(), IUniswapV2Pair(pool).token1()); token = token0 == address(WETH) ? token1 : token0; } } // File: @openzeppelin\contracts\utils\introspection\IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin\contracts\utils\introspection\ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin\contracts\token\ERC1155\utils\ERC1155Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } } // File: @openzeppelin\contracts\token\ERC1155\utils\ERC1155Holder.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // 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.3) (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 } 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"); } } /** * @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) { 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 { 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 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\security\ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts\nodes\IssuanceManagerNode.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IHostChainManager{ function getPendingWeth(uint256 id) external view returns(uint256); function depositWETH(uint256 chainId) external payable; function withdrawFunds(uint256 amtToken, uint256 id, address toUser) external; function balanceOf(address account, uint256 id) external view returns (uint256); function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data) external; } contract IssuanceManagerBeta is MinimalSwap, ERC1155Holder, ReentrancyGuard{ using ECDSA for bytes32; uint256 private constant PRECISION = 10 ** 12; address private externalSigner; uint256 private scMin; constructor(address _WETH, uint256 _scMin) MinimalSwap(_WETH){ externalSigner = msg.sender; scMin = _scMin; } function _executeswap(address component, uint256 cumulativeShare, uint256 msgVal, IToken indexToken) private returns(uint256 amountOut) { uint256 share = indexToken.getShare(component); uint256 value = (msgVal * share) / cumulativeShare; return _rawPoolSwap(component, value, address(indexToken), address(this), true); } function _executeSwaptoETH(address pool, uint256 indexQty, IToken indexToken) private returns(uint256 amountOut){ address token = _getPoolToken(pool); uint256 amountIn = IERC20(token).balanceOf(address(indexToken)); // 0 index qty signals an exit if(indexQty > 0){ // % of supply/ownership of index * balance of given token amountIn = (indexQty * amountIn) / indexToken.totalSupply(); } indexToken.approveComponent(token, address(this), amountIn); //IERC20(token).transferFrom(address(indexToken), address(this), amountIn); amountOut = _rawPoolSwap(pool, amountIn, address(this), address(indexToken), false); } function _executeExternalSwaptoETH(IToken indexToken, IToken.externalPosition memory position, uint256 qty, address to) private { uint256 amountIn = IHostChainManager(position.externalContract).balanceOf(address(indexToken), uint256(position.id)); if(qty > 0){ amountIn = (qty * amountIn) / indexToken.totalSupply(); } IHostChainManager(position.externalContract).safeTransferFrom(address(indexToken), address(this), uint256(position.id), amountIn, ""); IHostChainManager(position.externalContract).withdrawFunds(amountIn, uint256(position.id), to); } function _swapEthForAll(IToken indexToken, uint256 ethVal, address[] memory components, IToken.externalPosition[] memory _externals) private { uint256 cumulativeShare = indexToken.getCumulativeShare(); uint256 externalWeth = 0; //TODO: batching here can save gas for(uint i =0; i < _externals.length; i++){ IToken.externalPosition memory position = _externals[i]; uint256 share = _getExternalShare(indexToken, position.externalContract, position.id); uint256 val = (ethVal * share) / cumulativeShare; require(val >= scMin, "Insufficient side chain bridge amount, add additional value"); IHostChainManager(position.externalContract).depositWETH{value: val}(position.id); externalWeth += val; } WETH.deposit{value: msg.value - externalWeth}(); //Buy each component for(uint i = 0; i<components.length; i++){ _executeswap(components[i], cumulativeShare, ethVal, indexToken); } } function _getExternalShare(IToken indexToken, address contractAddress, uint256 id) private view returns (uint256){ address uid = address(uint160(uint256(keccak256(abi.encode(contractAddress, id))))); return indexToken.getShare(uid); } function _valueSet(IToken indexToken, address[] memory components, IToken.externalPosition[] memory _externals, uint256[] memory externalValues) private view returns (uint256 wethValue){ wethValue = 0; for (uint i = 0; i < components.length; i++){ uint256 bal = IERC20(_getPoolToken(components[i])).balanceOf(address(indexToken)); wethValue += _getAmountOut(components[i], bal, false); } for(uint i = 0; i < _externals.length; i++){ uint256 bal = IHostChainManager(_externals[i].externalContract).balanceOf(address(indexToken), _externals[i].id); uint256 pendingbal = IHostChainManager(_externals[i].externalContract).getPendingWeth(_externals[i].id); bal = bal > 0 ? ((bal * externalValues[i]) / 10**5) : bal; pendingbal = pendingbal > 0 ? (pendingbal * 995) / 1000 : pendingbal; wethValue += bal + pendingbal; } } function _exit(address component, IToken indexToken) private returns (uint256 amountOut){ return _executeSwaptoETH(component, 0, indexToken); } function _validateExternalData(uint256[] memory externalValues, bytes memory sigs) private view{ if(externalValues.length > 0){ bytes32 _hash = keccak256(abi.encodePacked(externalValues)).toEthSignedMessageHash(); address _signer = _hash.recover(sigs); require(_signer == externalSigner, "Invalid External Data"); require(block.timestamp < externalValues[externalValues.length - 1], "Quote Expired"); } } function seedNewSet(IToken indexToken, uint minQty, address to) external payable { require(indexToken.totalSupply() == 0, "Token Already seeded"); uint256 outputTokens = (msg.value * 10 ** 18) / indexToken.basePrice(); require(outputTokens >= minQty, "Insuffiecient return amount"); IToken.externalPosition[] memory _externals = indexToken.getExternalComponents(); _swapEthForAll(indexToken, msg.value, indexToken.getComponents(), _externals); indexToken.mint(to, (outputTokens / PRECISION) * PRECISION); } function issueForExactETH(IToken indexToken, uint minQty, address to, uint256[] memory externalValues, bytes memory sigs) external payable { _validateExternalData(externalValues, sigs); uint256 preSupply = indexToken.totalSupply(); address[] memory components = indexToken.getComponents(); IToken.externalPosition[] memory _externals = indexToken.getExternalComponents(); uint256 preValue = _valueSet(indexToken, components, _externals, externalValues); _swapEthForAll(indexToken, msg.value, components, _externals); uint256 outputTokens = ((((preSupply * _valueSet(indexToken, components, _externals, externalValues)) / preValue) - preSupply) / PRECISION) * PRECISION; require(outputTokens >= minQty, "Insuffiecient return amount"); indexToken.mint(to, outputTokens); } function redeem(IToken indexToken, uint qty, address to) external nonReentrant{ //NOTE: This function must only be called with verified qtys avail for bridging on side chains //Risk loss of funds if not checked require(indexToken.balanceOf(to) >= qty, "User does not have sufficeint balance"); address[] memory components = indexToken.getComponents(); uint256 funds = 0; for(uint i = 0; i<components.length; i++){ funds += _executeSwaptoETH(components[i], qty, indexToken); } IToken.externalPosition[] memory _externals = indexToken.getExternalComponents(); //TODO: batching here will save gas for(uint i =0; i < _externals.length; i++){ _executeExternalSwaptoETH(indexToken, _externals[i], qty, to); } WETH.withdraw(funds); indexToken.burn(to, qty); (bool sent, ) = payable(to).call{value: funds}(""); require(sent, "Failed to Transfer"); } function getTokenQty(IToken indexToken, uint index) external view returns(uint256){ address component = _getPoolToken(indexToken.getComponents()[index]); uint256 balance = IERC20(component).balanceOf(address(indexToken)); return balance; } function rebalanceExitedFunds(IToken indexToken, address[] memory exitedPositions, uint256[] memory replacementIndex) external { //sells out of exited positions and buys selected index(typically the token that replaced it) uint preBalance = WETH.balanceOf(address(this)); address[] memory components = indexToken.getComponents(); for(uint i = 0; i < exitedPositions.length; i++){ address component = exitedPositions[i]; require(indexToken.getShare(component) == 0, "position not exited"); uint256 amountWOut= _exit(component, indexToken); IERC20 token = IERC20(_getPoolToken(component)); require(token.balanceOf(address(indexToken)) == 0 && token.balanceOf(address(this)) == 0, "Token not exited properly"); _rawPoolSwap(components[replacementIndex[i]], amountWOut, address(indexToken), address(this), true); } if(WETH.balanceOf(address(this)) - preBalance > 0){ IToken.externalPosition[] memory _externals = indexToken.getExternalComponents(); _swapEthForAll(indexToken, WETH.balanceOf(address(this)) - preBalance, indexToken.getComponents(), _externals); } } function getIndexValue(IToken indexToken, uint256[] memory externalValues, bytes memory sigs) external view returns(uint256){ _validateExternalData(externalValues, sigs); IToken.externalPosition[] memory _externals = indexToken.getExternalComponents(); return _valueSet(indexToken, indexToken.getComponents(), _externals, externalValues); } function updateSigner(address newSigner) external{ require(msg.sender == externalSigner); externalSigner = newSigner; } function updateBridgeMin(uint256 newScMin) external { require(msg.sender == externalSigner); scMin = newScMin; } receive() external payable {} fallback() external payable{} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"uint256","name":"_scMin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"uint256[]","name":"externalValues","type":"uint256[]"},{"internalType":"bytes","name":"sigs","type":"bytes"}],"name":"getIndexValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"uint256","name":"minQty","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"externalValues","type":"uint256[]"},{"internalType":"bytes","name":"sigs","type":"bytes"}],"name":"issueForExactETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"address[]","name":"exitedPositions","type":"address[]"},{"internalType":"uint256[]","name":"replacementIndex","type":"uint256[]"}],"name":"rebalanceExitedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"indexToken","type":"address"},{"internalType":"uint256","name":"minQty","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"seedNewSet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newScMin","type":"uint256"}],"name":"updateBridgeMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002eb438038062002eb483398101604081905262000034916200006b565b600080546001600160a01b039093166001600160a01b031993841617905560018055600280549092163317909155600355620000a7565b600080604083850312156200007f57600080fd5b82516001600160a01b03811681146200009757600080fd5b6020939093015192949293505050565b612dfd80620000b76000396000f3fe60806040526004361061009a5760003560e01c80635c833bfd116100615780635c833bfd14610166578063919c8dea14610186578063a7ecd37e14610199578063bc197c81146101b9578063d1fb7789146101fe578063f23a6e611461021157005b806301ffc9a7146100a35780630eb75fd7146100d8578063103da38d146100f85780632a003c8e1461012657806343579be01461014657005b366100a157005b005b3480156100af57600080fd5b506100c36100be366004612587565b61023d565b60405190151581526020015b60405180910390f35b3480156100e457600080fd5b506100a16100f33660046125b1565b610274565b34801561010457600080fd5b5061011861011336600461274e565b610290565b6040519081526020016100cf565b34801561013257600080fd5b506101186101413660046127c4565b610380565b34801561015257600080fd5b506100a16101613660046127f0565b61047a565b34801561017257600080fd5b506100a16101813660046128bc565b6109b2565b6100a16101943660046128fe565b610d9f565b3480156101a557600080fd5b506100a16101b4366004612991565b611008565b3480156101c557600080fd5b506101e56101d43660046129ae565b63bc197c8160e01b95945050505050565b6040516001600160e01b031990911681526020016100cf565b6100a161020c3660046128bc565b611041565b34801561021d57600080fd5b506101e561022c366004612a20565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061026e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546001600160a01b0316331461028b57600080fd5b600355565b600061029c83836112f6565b6000846001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103049190810190612a89565b905061037785866001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103709190810190612b3d565b8387611445565b95945050505050565b60008061040a846001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156103c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103ec9190810190612b3d565b84815181106103fd576103fd612bcc565b6020026020010151611736565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000918316906370a0823190602401602060405180830381865afa158015610456573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103779190612be2565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024016020604051808303816000875af11580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190612be2565b90506000846001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561052b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105539190810190612b3d565b905060005b84518110156107d257600085828151811061057557610575612bcc565b6020908102919091010151604051634b3ab9c560e01b81526001600160a01b03808316600483015291925090881690634b3ab9c590602401602060405180830381865afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190612be2565b156106365760405162461bcd60e51b81526020600482015260136024820152721c1bdcda5d1a5bdb881b9bdd08195e1a5d1959606a1b60448201526064015b60405180910390fd5b60006106428289611829565b9050600061064f83611736565b6040516370a0823160e01b81526001600160a01b038b81166004830152919250908216906370a0823190602401602060405180830381865afa158015610699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bd9190612be2565b15801561072f57506040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d9190612be2565b155b61077b5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e206e6f74206578697465642070726f7065726c7900000000000000604482015260640161062d565b6107bb8588868151811061079157610791612bcc565b6020026020010151815181106107a9576107a9612bcc565b6020026020010151838b30600161183e565b5050505080806107ca90612c11565b915050610558565b50600080546040516370a0823160e01b815230600482015284916001600160a01b0316906370a08231906024016020604051808303816000875af115801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108429190612be2565b61084c9190612c2a565b11156109ab576000856001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ba9190810190612a89565b6000546040516370a0823160e01b81523060048201529192506109a991889186916001600160a01b03909116906370a08231906024016020604051808303816000875af115801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190612be2565b61093d9190612c2a565b886001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561097b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a39190810190612b3d565b84611aa4565b505b5050505050565b600260015403610a045760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161062d565b60026001556040516370a0823160e01b81526001600160a01b0382811660048301528391908516906370a0823190602401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190612be2565b1015610ad25760405162461bcd60e51b815260206004820152602560248201527f5573657220646f6573206e6f7420686176652073756666696365696e742062616044820152646c616e636560d81b606482015260840161062d565b6000836001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a9190810190612b3d565b90506000805b8251811015610b8b57610b6d838281518110610b5e57610b5e612bcc565b60200260200101518688611d13565b610b779083612c3d565b915080610b8381612c11565b915050610b40565b506000856001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf49190810190612a89565b905060005b8151811015610c3957610c2787838381518110610c1857610c18612bcc565b60200260200101518888611e90565b80610c3181612c11565b915050610bf9565b50600054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610c8057600080fd5b505af1158015610c94573d6000803e3d6000fd5b5050604051632770a7eb60e21b81526001600160a01b0387811660048301526024820189905289169250639dc29fac9150604401600060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506000846001600160a01b03168360405160006040518083038185875af1925050503d8060008114610d47576040519150601f19603f3d011682016040523d82523d6000602084013e610d4c565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260126024820152712330b4b632b2103a37902a3930b739b332b960711b604482015260640161062d565b5050600180555050505050565b610da982826112f6565b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612be2565b90506000866001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e779190810190612b3d565b90506000876001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ee19190810190612a89565b90506000610ef189848489611445565b9050610eff89348585611aa4565b600064e8d4a51000808684610f168e89898e611445565b610f20908a612c50565b610f2a9190612c6f565b610f349190612c2a565b610f3e9190612c6f565b610f489190612c50565b905088811015610f9a5760405162461bcd60e51b815260206004820152601b60248201527f496e7375666669656369656e742072657475726e20616d6f756e740000000000604482015260640161062d565b6040516340c10f1960e01b81526001600160a01b038981166004830152602482018390528b16906340c10f1990604401600060405180830381600087803b158015610fe457600080fd5b505af1158015610ff8573d6000803e3d6000fd5b5050505050505050505050505050565b6002546001600160a01b0316331461101f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190612be2565b156110e75760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e481cd95959195960621b604482015260640161062d565b6000836001600160a01b031663c7876ea46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612be2565b61115d34670de0b6b3a7640000612c50565b6111679190612c6f565b9050828110156111b95760405162461bcd60e51b815260206004820152601b60248201527f496e7375666669656369656e742072657475726e20616d6f756e740000000000604482015260640161062d565b6000846001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112219190810190612a89565b90506112668534876001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561097b573d6000803e3d6000fd5b6001600160a01b0385166340c10f198464e8d4a510006112868187612c6f565b6112909190612c50565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b600060405180830381600087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050505050505050565b815115611441576000611373836040516020016113139190612c91565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b905060006113818284612063565b6002549091506001600160a01b038083169116146113d95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642045787465726e616c204461746160581b604482015260640161062d565b83600185516113e89190612c2a565b815181106113f8576113f8612bcc565b6020026020010151421061143e5760405162461bcd60e51b815260206004820152600d60248201526c145d5bdd1948115e1c1a5c9959609a1b604482015260640161062d565b50505b5050565b6000805b845181101561151c5760006114698683815181106103fd576103fd612bcc565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401602060405180830381865afa1580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190612be2565b90506114fc8683815181106114ec576114ec612bcc565b6020026020010151826000612087565b6115069084612c3d565b925050808061151490612c11565b915050611449565b5060005b835181101561172d57600084828151811061153d5761153d612bcc565b6020026020010151600001516001600160a01b031662fdd58e8887858151811061156957611569612bcc565b6020026020010151602001516040518363ffffffff1660e01b81526004016115a69291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190612be2565b905060008583815181106115fd576115fd612bcc565b6020026020010151600001516001600160a01b031663b3b18a4d87858151811061162957611629612bcc565b6020026020010151602001516040518263ffffffff1660e01b815260040161165391815260200190565b602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116949190612be2565b9050600082116116a457816116d7565b620186a08584815181106116ba576116ba612bcc565b6020026020010151836116cd9190612c50565b6116d79190612c6f565b9150600081116116e75780611700565b6103e86116f6826103e3612c50565b6117009190612c6f565b905061170c8183612c3d565b6117169085612c3d565b93505050808061172590612c11565b915050611520565b50949350505050565b6000806000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179d9190612cc7565b846001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff9190612cc7565b60005491935091506001600160a01b0380841691161461181f5781611821565b805b949350505050565b600061183783600084611d13565b9392505050565b60008061184c878785612087565b90506000879050600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b89190612cc7565b836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191a9190612cc7565b91509150600086611946576000546001600160a01b038481169116146119405782611953565b81611953565b6000546001600160a01b03165b9050600080846001600160a01b0316836001600160a01b0316146119795786600061197d565b6000875b91509150826001600160a01b03166323b872dd8b8f8f6040518463ffffffff1660e01b81526004016119d0939291906001600160a01b039384168152919092166020820152604081019190915260600190565b600060405180830381600087803b1580156119ea57600080fd5b505af11580156119fe573d6000803e3d6000fd5b5050506001600160a01b038716905063022c0d9f83838e60006040519080825280601f01601f191660200182016040528015611a41576020820181803683370190505b506040518563ffffffff1660e01b8152600401611a619493929190612ce4565b600060405180830381600087803b158015611a7b57600080fd5b505af1158015611a8f573d6000803e3d6000fd5b50989f9e505050505050505050505050505050565b6000846001600160a01b031663eb9203236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612be2565b90506000805b8351811015611c66576000848281518110611b2b57611b2b612bcc565b602002602001015190506000611b4a898360000151846020015161220e565b9050600085611b59838b612c50565b611b639190612c6f565b9050600354811015611bdd5760405162461bcd60e51b815260206004820152603b60248201527f496e73756666696369656e74207369646520636861696e20627269646765206160448201527f6d6f756e742c20616464206164646974696f6e616c2076616c75650000000000606482015260840161062d565b825160208401516040516319b743c960e21b815260048101919091526001600160a01b03909116906366dd0f249083906024016000604051808303818588803b158015611c2957600080fd5b505af1158015611c3d573d6000803e3d6000fd5b50505050508085611c4e9190612c3d565b94505050508080611c5e90612c11565b915050611b0e565b506000546001600160a01b031663d0e30db0611c828334612c2a565b6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cad57600080fd5b505af1158015611cc1573d6000803e3d6000fd5b505050505060005b8451811015611d0a57611cf7858281518110611ce757611ce7612bcc565b602002602001015184888a61228e565b5080611d0281612c11565b915050611cc9565b50505050505050565b600080611d1f85611736565b6040516370a0823160e01b81526001600160a01b0385811660048301529192506000918316906370a0823190602401602060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612be2565b90508415611e1057836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612be2565b611e038287612c50565b611e0d9190612c6f565b90505b60405163528a660d60e01b81526001600160a01b0383811660048301523060248301526044820183905285169063528a660d90606401600060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b50505050611e8686823087600061183e565b9695505050505050565b82516020840151604051627eeac760e11b81526000926001600160a01b03169162fdd58e91611ed79189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190612be2565b90508215611f9957846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f829190612be2565b611f8c8285612c50565b611f969190612c6f565b90505b83516020850151604051637921219560e11b81526001600160a01b03888116600483015230602483015260448201929092526064810184905260a06084820152600060a482015291169063f242432a9060c401600060405180830381600087803b15801561200657600080fd5b505af115801561201a573d6000803e3d6000fd5b5050855160208701516040516327ba2a4760e21b81526004810186905260248101919091526001600160a01b0386811660448301529091169250639ee8a91c91506064016112bd565b60008060006120728585612331565b9150915061207f81612376565b509392505050565b600080849050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156120ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f29190612d6c565b506001600160701b031691506001600160701b0316915060008054906101000a90046001600160a01b03166001600160a01b0316836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612164573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121889190612cc7565b6001600160a01b0316146121a957846121a25781816121b8565b80826121b8565b846121b55780826121b8565b81815b909250905060006121cb876103e5612c50565b905060006121d98383612c50565b90506000826121ea866103e8612c50565b6121f49190612c3d565b90506122008183612c6f565b9a9950505050505050505050565b604080516001600160a01b0384166020820152908101829052600090819060600160408051808303601f19018152908290528051602090910120634b3ab9c560e01b82526001600160a01b038082166004840152909250861690634b3ab9c590602401602060405180830381865afa158015610456573d6000803e3d6000fd5b604051634b3ab9c560e01b81526001600160a01b0385811660048301526000918291841690634b3ab9c590602401602060405180830381865afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd9190612be2565b905060008561230c8387612c50565b6123169190612c6f565b905061232687828630600161183e565b979650505050505050565b60008082516041036123675760208301516040840151606085015160001a61235b878285856124c3565b9450945050505061236f565b506000905060025b9250929050565b600081600381111561238a5761238a612db1565b036123925750565b60018160038111156123a6576123a6612db1565b036123f35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161062d565b600281600381111561240757612407612db1565b036124545760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161062d565b600381600381111561246857612468612db1565b036124c05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161062d565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124fa575060009050600361257e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561254e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166125775760006001925092505061257e565b9150600090505b94509492505050565b60006020828403121561259957600080fd5b81356001600160e01b03198116811461183757600080fd5b6000602082840312156125c357600080fd5b5035919050565b6001600160a01b03811681146124c057600080fd5b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612618576126186125df565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612647576126476125df565b604052919050565b600067ffffffffffffffff821115612669576126696125df565b5060051b60200190565b600082601f83011261268457600080fd5b813560206126996126948361264f565b61261e565b82815260059290921b840181019181810190868411156126b857600080fd5b8286015b848110156126d357803583529183019183016126bc565b509695505050505050565b600082601f8301126126ef57600080fd5b813567ffffffffffffffff811115612709576127096125df565b61271c601f8201601f191660200161261e565b81815284602083860101111561273157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561276357600080fd5b833561276e816125ca565b9250602084013567ffffffffffffffff8082111561278b57600080fd5b61279787838801612673565b935060408601359150808211156127ad57600080fd5b506127ba868287016126de565b9150509250925092565b600080604083850312156127d757600080fd5b82356127e2816125ca565b946020939093013593505050565b60008060006060848603121561280557600080fd5b8335612810816125ca565b925060208481013567ffffffffffffffff8082111561282e57600080fd5b818701915087601f83011261284257600080fd5b81356128506126948261264f565b81815260059190911b8301840190848101908a83111561286f57600080fd5b938501935b82851015612896578435612887816125ca565b82529385019390850190612874565b9650505060408701359250808311156128ae57600080fd5b50506127ba86828701612673565b6000806000606084860312156128d157600080fd5b83356128dc816125ca565b92506020840135915060408401356128f3816125ca565b809150509250925092565b600080600080600060a0868803121561291657600080fd5b8535612921816125ca565b9450602086013593506040860135612938816125ca565b9250606086013567ffffffffffffffff8082111561295557600080fd5b61296189838a01612673565b9350608088013591508082111561297757600080fd5b50612984888289016126de565b9150509295509295909350565b6000602082840312156129a357600080fd5b8135611837816125ca565b600080600080600060a086880312156129c657600080fd5b85356129d1816125ca565b945060208601356129e1816125ca565b9350604086013567ffffffffffffffff808211156129fe57600080fd5b612a0a89838a01612673565b9450606088013591508082111561295557600080fd5b600080600080600060a08688031215612a3857600080fd5b8535612a43816125ca565b94506020860135612a53816125ca565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a7d57600080fd5b612984888289016126de565b60006020808385031215612a9c57600080fd5b825167ffffffffffffffff811115612ab357600080fd5b8301601f81018513612ac457600080fd5b8051612ad26126948261264f565b81815260069190911b82018301908381019087831115612af157600080fd5b928401925b828410156123265760408489031215612b0f5760008081fd5b612b176125f5565b8451612b22816125ca565b81528486015186820152825260409093019290840190612af6565b60006020808385031215612b5057600080fd5b825167ffffffffffffffff811115612b6757600080fd5b8301601f81018513612b7857600080fd5b8051612b866126948261264f565b81815260059190911b82018301908381019087831115612ba557600080fd5b928401925b82841015612326578351612bbd816125ca565b82529284019290840190612baa565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612bf457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612c2357612c23612bfb565b5060010190565b8181038181111561026e5761026e612bfb565b8082018082111561026e5761026e612bfb565b6000816000190483118215151615612c6a57612c6a612bfb565b500290565b600082612c8c57634e487b7160e01b600052601260045260246000fd5b500490565b815160009082906020808601845b83811015612cbb57815185529382019390820190600101612c9f565b50929695505050505050565b600060208284031215612cd957600080fd5b8151611837816125ca565b84815260006020858184015260018060a01b038516604084015260806060840152835180608085015260005b81811015612d2c5785810183015185820160a001528201612d10565b50600060a0828601015260a0601f19601f8301168501019250505095945050505050565b80516001600160701b0381168114612d6757600080fd5b919050565b600080600060608486031215612d8157600080fd5b612d8a84612d50565b9250612d9860208501612d50565b9150604084015163ffffffff811681146128f357600080fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212204780d1f8709afc1e42e9c1201dc0595fdc57718a6b458c14703523ff04deff0664736f6c63430008100033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000470de4df820000
Deployed Bytecode
0x60806040526004361061009a5760003560e01c80635c833bfd116100615780635c833bfd14610166578063919c8dea14610186578063a7ecd37e14610199578063bc197c81146101b9578063d1fb7789146101fe578063f23a6e611461021157005b806301ffc9a7146100a35780630eb75fd7146100d8578063103da38d146100f85780632a003c8e1461012657806343579be01461014657005b366100a157005b005b3480156100af57600080fd5b506100c36100be366004612587565b61023d565b60405190151581526020015b60405180910390f35b3480156100e457600080fd5b506100a16100f33660046125b1565b610274565b34801561010457600080fd5b5061011861011336600461274e565b610290565b6040519081526020016100cf565b34801561013257600080fd5b506101186101413660046127c4565b610380565b34801561015257600080fd5b506100a16101613660046127f0565b61047a565b34801561017257600080fd5b506100a16101813660046128bc565b6109b2565b6100a16101943660046128fe565b610d9f565b3480156101a557600080fd5b506100a16101b4366004612991565b611008565b3480156101c557600080fd5b506101e56101d43660046129ae565b63bc197c8160e01b95945050505050565b6040516001600160e01b031990911681526020016100cf565b6100a161020c3660046128bc565b611041565b34801561021d57600080fd5b506101e561022c366004612a20565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061026e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546001600160a01b0316331461028b57600080fd5b600355565b600061029c83836112f6565b6000846001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103049190810190612a89565b905061037785866001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103709190810190612b3d565b8387611445565b95945050505050565b60008061040a846001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156103c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103ec9190810190612b3d565b84815181106103fd576103fd612bcc565b6020026020010151611736565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000918316906370a0823190602401602060405180830381865afa158015610456573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103779190612be2565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024016020604051808303816000875af11580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190612be2565b90506000846001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561052b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105539190810190612b3d565b905060005b84518110156107d257600085828151811061057557610575612bcc565b6020908102919091010151604051634b3ab9c560e01b81526001600160a01b03808316600483015291925090881690634b3ab9c590602401602060405180830381865afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190612be2565b156106365760405162461bcd60e51b81526020600482015260136024820152721c1bdcda5d1a5bdb881b9bdd08195e1a5d1959606a1b60448201526064015b60405180910390fd5b60006106428289611829565b9050600061064f83611736565b6040516370a0823160e01b81526001600160a01b038b81166004830152919250908216906370a0823190602401602060405180830381865afa158015610699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bd9190612be2565b15801561072f57506040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d9190612be2565b155b61077b5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e206e6f74206578697465642070726f7065726c7900000000000000604482015260640161062d565b6107bb8588868151811061079157610791612bcc565b6020026020010151815181106107a9576107a9612bcc565b6020026020010151838b30600161183e565b5050505080806107ca90612c11565b915050610558565b50600080546040516370a0823160e01b815230600482015284916001600160a01b0316906370a08231906024016020604051808303816000875af115801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108429190612be2565b61084c9190612c2a565b11156109ab576000856001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ba9190810190612a89565b6000546040516370a0823160e01b81523060048201529192506109a991889186916001600160a01b03909116906370a08231906024016020604051808303816000875af115801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190612be2565b61093d9190612c2a565b886001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561097b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a39190810190612b3d565b84611aa4565b505b5050505050565b600260015403610a045760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161062d565b60026001556040516370a0823160e01b81526001600160a01b0382811660048301528391908516906370a0823190602401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190612be2565b1015610ad25760405162461bcd60e51b815260206004820152602560248201527f5573657220646f6573206e6f7420686176652073756666696365696e742062616044820152646c616e636560d81b606482015260840161062d565b6000836001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a9190810190612b3d565b90506000805b8251811015610b8b57610b6d838281518110610b5e57610b5e612bcc565b60200260200101518688611d13565b610b779083612c3d565b915080610b8381612c11565b915050610b40565b506000856001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf49190810190612a89565b905060005b8151811015610c3957610c2787838381518110610c1857610c18612bcc565b60200260200101518888611e90565b80610c3181612c11565b915050610bf9565b50600054604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610c8057600080fd5b505af1158015610c94573d6000803e3d6000fd5b5050604051632770a7eb60e21b81526001600160a01b0387811660048301526024820189905289169250639dc29fac9150604401600060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506000846001600160a01b03168360405160006040518083038185875af1925050503d8060008114610d47576040519150601f19603f3d011682016040523d82523d6000602084013e610d4c565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260126024820152712330b4b632b2103a37902a3930b739b332b960711b604482015260640161062d565b5050600180555050505050565b610da982826112f6565b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612be2565b90506000866001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610e4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e779190810190612b3d565b90506000876001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ee19190810190612a89565b90506000610ef189848489611445565b9050610eff89348585611aa4565b600064e8d4a51000808684610f168e89898e611445565b610f20908a612c50565b610f2a9190612c6f565b610f349190612c2a565b610f3e9190612c6f565b610f489190612c50565b905088811015610f9a5760405162461bcd60e51b815260206004820152601b60248201527f496e7375666669656369656e742072657475726e20616d6f756e740000000000604482015260640161062d565b6040516340c10f1960e01b81526001600160a01b038981166004830152602482018390528b16906340c10f1990604401600060405180830381600087803b158015610fe457600080fd5b505af1158015610ff8573d6000803e3d6000fd5b5050505050505050505050505050565b6002546001600160a01b0316331461101f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190612be2565b156110e75760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e481cd95959195960621b604482015260640161062d565b6000836001600160a01b031663c7876ea46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612be2565b61115d34670de0b6b3a7640000612c50565b6111679190612c6f565b9050828110156111b95760405162461bcd60e51b815260206004820152601b60248201527f496e7375666669656369656e742072657475726e20616d6f756e740000000000604482015260640161062d565b6000846001600160a01b03166388b0a8be6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156111f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112219190810190612a89565b90506112668534876001600160a01b03166399d50d5d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561097b573d6000803e3d6000fd5b6001600160a01b0385166340c10f198464e8d4a510006112868187612c6f565b6112909190612c50565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b600060405180830381600087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050505050505050565b815115611441576000611373836040516020016113139190612c91565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b905060006113818284612063565b6002549091506001600160a01b038083169116146113d95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642045787465726e616c204461746160581b604482015260640161062d565b83600185516113e89190612c2a565b815181106113f8576113f8612bcc565b6020026020010151421061143e5760405162461bcd60e51b815260206004820152600d60248201526c145d5bdd1948115e1c1a5c9959609a1b604482015260640161062d565b50505b5050565b6000805b845181101561151c5760006114698683815181106103fd576103fd612bcc565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401602060405180830381865afa1580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190612be2565b90506114fc8683815181106114ec576114ec612bcc565b6020026020010151826000612087565b6115069084612c3d565b925050808061151490612c11565b915050611449565b5060005b835181101561172d57600084828151811061153d5761153d612bcc565b6020026020010151600001516001600160a01b031662fdd58e8887858151811061156957611569612bcc565b6020026020010151602001516040518363ffffffff1660e01b81526004016115a69291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190612be2565b905060008583815181106115fd576115fd612bcc565b6020026020010151600001516001600160a01b031663b3b18a4d87858151811061162957611629612bcc565b6020026020010151602001516040518263ffffffff1660e01b815260040161165391815260200190565b602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116949190612be2565b9050600082116116a457816116d7565b620186a08584815181106116ba576116ba612bcc565b6020026020010151836116cd9190612c50565b6116d79190612c6f565b9150600081116116e75780611700565b6103e86116f6826103e3612c50565b6117009190612c6f565b905061170c8183612c3d565b6117169085612c3d565b93505050808061172590612c11565b915050611520565b50949350505050565b6000806000836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179d9190612cc7565b846001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff9190612cc7565b60005491935091506001600160a01b0380841691161461181f5781611821565b805b949350505050565b600061183783600084611d13565b9392505050565b60008061184c878785612087565b90506000879050600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b89190612cc7565b836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191a9190612cc7565b91509150600086611946576000546001600160a01b038481169116146119405782611953565b81611953565b6000546001600160a01b03165b9050600080846001600160a01b0316836001600160a01b0316146119795786600061197d565b6000875b91509150826001600160a01b03166323b872dd8b8f8f6040518463ffffffff1660e01b81526004016119d0939291906001600160a01b039384168152919092166020820152604081019190915260600190565b600060405180830381600087803b1580156119ea57600080fd5b505af11580156119fe573d6000803e3d6000fd5b5050506001600160a01b038716905063022c0d9f83838e60006040519080825280601f01601f191660200182016040528015611a41576020820181803683370190505b506040518563ffffffff1660e01b8152600401611a619493929190612ce4565b600060405180830381600087803b158015611a7b57600080fd5b505af1158015611a8f573d6000803e3d6000fd5b50989f9e505050505050505050505050505050565b6000846001600160a01b031663eb9203236040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612be2565b90506000805b8351811015611c66576000848281518110611b2b57611b2b612bcc565b602002602001015190506000611b4a898360000151846020015161220e565b9050600085611b59838b612c50565b611b639190612c6f565b9050600354811015611bdd5760405162461bcd60e51b815260206004820152603b60248201527f496e73756666696369656e74207369646520636861696e20627269646765206160448201527f6d6f756e742c20616464206164646974696f6e616c2076616c75650000000000606482015260840161062d565b825160208401516040516319b743c960e21b815260048101919091526001600160a01b03909116906366dd0f249083906024016000604051808303818588803b158015611c2957600080fd5b505af1158015611c3d573d6000803e3d6000fd5b50505050508085611c4e9190612c3d565b94505050508080611c5e90612c11565b915050611b0e565b506000546001600160a01b031663d0e30db0611c828334612c2a565b6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cad57600080fd5b505af1158015611cc1573d6000803e3d6000fd5b505050505060005b8451811015611d0a57611cf7858281518110611ce757611ce7612bcc565b602002602001015184888a61228e565b5080611d0281612c11565b915050611cc9565b50505050505050565b600080611d1f85611736565b6040516370a0823160e01b81526001600160a01b0385811660048301529192506000918316906370a0823190602401602060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612be2565b90508415611e1057836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df99190612be2565b611e038287612c50565b611e0d9190612c6f565b90505b60405163528a660d60e01b81526001600160a01b0383811660048301523060248301526044820183905285169063528a660d90606401600060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b50505050611e8686823087600061183e565b9695505050505050565b82516020840151604051627eeac760e11b81526000926001600160a01b03169162fdd58e91611ed79189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190612be2565b90508215611f9957846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f829190612be2565b611f8c8285612c50565b611f969190612c6f565b90505b83516020850151604051637921219560e11b81526001600160a01b03888116600483015230602483015260448201929092526064810184905260a06084820152600060a482015291169063f242432a9060c401600060405180830381600087803b15801561200657600080fd5b505af115801561201a573d6000803e3d6000fd5b5050855160208701516040516327ba2a4760e21b81526004810186905260248101919091526001600160a01b0386811660448301529091169250639ee8a91c91506064016112bd565b60008060006120728585612331565b9150915061207f81612376565b509392505050565b600080849050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156120ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f29190612d6c565b506001600160701b031691506001600160701b0316915060008054906101000a90046001600160a01b03166001600160a01b0316836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612164573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121889190612cc7565b6001600160a01b0316146121a957846121a25781816121b8565b80826121b8565b846121b55780826121b8565b81815b909250905060006121cb876103e5612c50565b905060006121d98383612c50565b90506000826121ea866103e8612c50565b6121f49190612c3d565b90506122008183612c6f565b9a9950505050505050505050565b604080516001600160a01b0384166020820152908101829052600090819060600160408051808303601f19018152908290528051602090910120634b3ab9c560e01b82526001600160a01b038082166004840152909250861690634b3ab9c590602401602060405180830381865afa158015610456573d6000803e3d6000fd5b604051634b3ab9c560e01b81526001600160a01b0385811660048301526000918291841690634b3ab9c590602401602060405180830381865afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd9190612be2565b905060008561230c8387612c50565b6123169190612c6f565b905061232687828630600161183e565b979650505050505050565b60008082516041036123675760208301516040840151606085015160001a61235b878285856124c3565b9450945050505061236f565b506000905060025b9250929050565b600081600381111561238a5761238a612db1565b036123925750565b60018160038111156123a6576123a6612db1565b036123f35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161062d565b600281600381111561240757612407612db1565b036124545760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161062d565b600381600381111561246857612468612db1565b036124c05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161062d565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124fa575060009050600361257e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561254e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166125775760006001925092505061257e565b9150600090505b94509492505050565b60006020828403121561259957600080fd5b81356001600160e01b03198116811461183757600080fd5b6000602082840312156125c357600080fd5b5035919050565b6001600160a01b03811681146124c057600080fd5b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612618576126186125df565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612647576126476125df565b604052919050565b600067ffffffffffffffff821115612669576126696125df565b5060051b60200190565b600082601f83011261268457600080fd5b813560206126996126948361264f565b61261e565b82815260059290921b840181019181810190868411156126b857600080fd5b8286015b848110156126d357803583529183019183016126bc565b509695505050505050565b600082601f8301126126ef57600080fd5b813567ffffffffffffffff811115612709576127096125df565b61271c601f8201601f191660200161261e565b81815284602083860101111561273157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561276357600080fd5b833561276e816125ca565b9250602084013567ffffffffffffffff8082111561278b57600080fd5b61279787838801612673565b935060408601359150808211156127ad57600080fd5b506127ba868287016126de565b9150509250925092565b600080604083850312156127d757600080fd5b82356127e2816125ca565b946020939093013593505050565b60008060006060848603121561280557600080fd5b8335612810816125ca565b925060208481013567ffffffffffffffff8082111561282e57600080fd5b818701915087601f83011261284257600080fd5b81356128506126948261264f565b81815260059190911b8301840190848101908a83111561286f57600080fd5b938501935b82851015612896578435612887816125ca565b82529385019390850190612874565b9650505060408701359250808311156128ae57600080fd5b50506127ba86828701612673565b6000806000606084860312156128d157600080fd5b83356128dc816125ca565b92506020840135915060408401356128f3816125ca565b809150509250925092565b600080600080600060a0868803121561291657600080fd5b8535612921816125ca565b9450602086013593506040860135612938816125ca565b9250606086013567ffffffffffffffff8082111561295557600080fd5b61296189838a01612673565b9350608088013591508082111561297757600080fd5b50612984888289016126de565b9150509295509295909350565b6000602082840312156129a357600080fd5b8135611837816125ca565b600080600080600060a086880312156129c657600080fd5b85356129d1816125ca565b945060208601356129e1816125ca565b9350604086013567ffffffffffffffff808211156129fe57600080fd5b612a0a89838a01612673565b9450606088013591508082111561295557600080fd5b600080600080600060a08688031215612a3857600080fd5b8535612a43816125ca565b94506020860135612a53816125ca565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a7d57600080fd5b612984888289016126de565b60006020808385031215612a9c57600080fd5b825167ffffffffffffffff811115612ab357600080fd5b8301601f81018513612ac457600080fd5b8051612ad26126948261264f565b81815260069190911b82018301908381019087831115612af157600080fd5b928401925b828410156123265760408489031215612b0f5760008081fd5b612b176125f5565b8451612b22816125ca565b81528486015186820152825260409093019290840190612af6565b60006020808385031215612b5057600080fd5b825167ffffffffffffffff811115612b6757600080fd5b8301601f81018513612b7857600080fd5b8051612b866126948261264f565b81815260059190911b82018301908381019087831115612ba557600080fd5b928401925b82841015612326578351612bbd816125ca565b82529284019290840190612baa565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612bf457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612c2357612c23612bfb565b5060010190565b8181038181111561026e5761026e612bfb565b8082018082111561026e5761026e612bfb565b6000816000190483118215151615612c6a57612c6a612bfb565b500290565b600082612c8c57634e487b7160e01b600052601260045260246000fd5b500490565b815160009082906020808601845b83811015612cbb57815185529382019390820190600101612c9f565b50929695505050505050565b600060208284031215612cd957600080fd5b8151611837816125ca565b84815260006020858184015260018060a01b038516604084015260806060840152835180608085015260005b81811015612d2c5785810183015185820160a001528201612d10565b50600060a0828601015260a0601f19601f8301168501019250505095945050505050565b80516001600160701b0381168114612d6757600080fd5b919050565b600080600060608486031215612d8157600080fd5b612d8a84612d50565b9250612d9860208501612d50565b9150604084015163ffffffff811681146128f357600080fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212204780d1f8709afc1e42e9c1201dc0595fdc57718a6b458c14703523ff04deff0664736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000470de4df820000
-----Decoded View---------------
Arg [0] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _scMin (uint256): 20000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 00000000000000000000000000000000000000000000000000470de4df820000
Deployed Bytecode Sourcemap
27303:9862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11477:223;;;;;;;;;;-1:-1:-1;11477:223:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;11477:223:0;;;;;;;;36953:135;;;;;;;;;;-1:-1:-1;36953:135:0;;;;;:::i;:::-;;:::i;36417:378::-;;;;;;;;;;-1:-1:-1;36417:378:0;;;;;:::i;:::-;;:::i;:::-;;;3765:25:1;;;3753:2;3738:18;36417:378:0;3619:177:1;34879:271:0;;;;;;;;;;-1:-1:-1;34879:271:0;;;;;:::i;:::-;;:::i;35158:1251::-;;;;;;;;;;-1:-1:-1;35158:1251:0;;;;;:::i;:::-;;:::i;33854:1017::-;;;;;;;;;;-1:-1:-1;33854:1017:0;;;;;:::i;:::-;;:::i;32963:883::-;;;;;;:::i;:::-;;:::i;36803:142::-;;;;;;;;;;-1:-1:-1;36803:142:0;;;;;:::i;:::-;;:::i;12465:255::-;;;;;;;;;;-1:-1:-1;12465:255:0;;;;;:::i;:::-;-1:-1:-1;;;12465:255:0;;;;;;;;;;;-1:-1:-1;;;;;;8485:33:1;;;8467:52;;8455:2;8440:18;12465:255:0;8323:202:1;32390:565:0;;;;;;:::i;:::-;;:::i;12230:227::-;;;;;;;;;;-1:-1:-1;12230:227:0;;;;;:::i;:::-;-1:-1:-1;;;12230:227:0;;;;;;;;11477:223;11579:4;-1:-1:-1;;;;;;11603:49:0;;-1:-1:-1;;;11603:49:0;;:89;;-1:-1:-1;;;;;;;;;;11061:40:0;;;11656:36;11596:96;11477:223;-1:-1:-1;;11477:223:0:o;36953:135::-;37038:14;;-1:-1:-1;;;;;37038:14:0;37024:10;:28;37016:37;;;;;;37064:5;:16;36953:135::o;36417:378::-;36539:7;36558:43;36580:14;36596:4;36558:21;:43::i;:::-;36612;36658:10;-1:-1:-1;;;;;36658:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36658:34:0;;;;;;;;;;;;:::i;:::-;36612:80;;36710:77;36720:10;36732;-1:-1:-1;;;;;36732:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36732:26:0;;;;;;;;;;;;:::i;:::-;36760:10;36772:14;36710:9;:77::i;:::-;36703:84;36417:378;-1:-1:-1;;;;;36417:378:0:o;34879:271::-;34953:7;34972:17;34992:48;35006:10;-1:-1:-1;;;;;35006:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35006:26:0;;;;;;;;;;;;:::i;:::-;35033:5;35006:33;;;;;;;;:::i;:::-;;;;;;;34992:13;:48::i;:::-;35069;;-1:-1:-1;;;35069:48:0;;-1:-1:-1;;;;;11827:32:1;;;35069:48:0;;;11809:51:1;34972:68:0;;-1:-1:-1;35051:15:0;;35069:27;;;;;11782:18:1;;35069:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35158:1251::-;35405:15;35423:4;;:29;;-1:-1:-1;;;35423:29:0;;35446:4;35423:29;;;11809:51:1;-1:-1:-1;;;;;35423:4:0;;;;:14;;11782:18:1;;35423:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35405:47;;35463:27;35493:10;-1:-1:-1;;;;;35493:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35493:26:0;;;;;;;;;;;;:::i;:::-;35463:56;;35534:6;35530:580;35550:15;:22;35546:1;:26;35530:580;;;35593:17;35613:15;35629:1;35613:18;;;;;;;;:::i;:::-;;;;;;;;;;;35654:30;;-1:-1:-1;;;35654:30:0;;-1:-1:-1;;;;;11827:32:1;;;35654:30:0;;;11809:51:1;35613:18:0;;-1:-1:-1;35654:19:0;;;;;;11782:18:1;;35654:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;35646:67;;;;-1:-1:-1;;;35646:67:0;;12262:2:1;35646:67:0;;;12244:21:1;12301:2;12281:18;;;12274:30;-1:-1:-1;;;12320:18:1;;;12313:49;12379:18;;35646:67:0;;;;;;;;;35728:18;35748:28;35754:9;35765:10;35748:5;:28::i;:::-;35728:48;;35791:12;35813:24;35827:9;35813:13;:24::i;:::-;35861:36;;-1:-1:-1;;;35861:36:0;;-1:-1:-1;;;;;11827:32:1;;;35861:36:0;;;11809:51:1;35791:47:0;;-1:-1:-1;35861:15:0;;;;;;11782:18:1;;35861:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;:93;;;;-1:-1:-1;35919:30:0;;-1:-1:-1;;;35919:30:0;;35943:4;35919:30;;;11809:51:1;-1:-1:-1;;;;;35919:15:0;;;;;11782:18:1;;35919:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;35861:93;35853:131;;;;-1:-1:-1;;;35853:131:0;;12610:2:1;35853:131:0;;;12592:21:1;12649:2;12629:18;;;12622:30;12688:27;12668:18;;;12661:55;12733:18;;35853:131:0;12408:349:1;35853:131:0;35999:99;36012:10;36023:16;36040:1;36023:19;;;;;;;;:::i;:::-;;;;;;;36012:31;;;;;;;;:::i;:::-;;;;;;;36045:10;36065;36086:4;36093;35999:12;:99::i;:::-;;35578:532;;;35574:3;;;;;:::i;:::-;;;;35530:580;;;-1:-1:-1;36168:1:0;36123:4;;:29;;-1:-1:-1;;;36123:29:0;;36146:4;36123:29;;;11809:51:1;36155:10:0;;-1:-1:-1;;;;;36123:4:0;;:14;;11782:18:1;;36123:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;:46;36120:282;;;36185:43;36231:10;-1:-1:-1;;;;;36231:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36231:34:0;;;;;;;;;;;;:::i;:::-;36307:4;;:29;;-1:-1:-1;;;36307:29:0;;36330:4;36307:29;;;11809:51:1;36185:80:0;;-1:-1:-1;36280:110:0;;36295:10;;36339;;-1:-1:-1;;;;;36307:4:0;;;;:14;;11782:18:1;;36307:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;36351:10;-1:-1:-1;;;;;36351:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36351:26:0;;;;;;;;;;;;:::i;:::-;36379:10;36280:14;:110::i;:::-;36170:232;36120:282;35291:1118;;35158:1251;;;:::o;33854:1017::-;25745:1;26343:7;;:19;26335:63;;;;-1:-1:-1;;;26335:63:0;;13369:2:1;26335:63:0;;;13351:21:1;13408:2;13388:18;;;13381:30;13447:33;13427:18;;;13420:61;13498:18;;26335:63:0;13167:355:1;26335:63:0;25745:1;26476:7;:18;34100:24:::1;::::0;-1:-1:-1;;;34100:24:0;;-1:-1:-1;;;;;11827:32:1;;;34100:24:0::1;::::0;::::1;11809:51:1::0;34128:3:0;;34100:20;;::::1;::::0;::::1;::::0;11782:18:1;;34100:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;34092:81;;;::::0;-1:-1:-1;;;34092:81:0;;13729:2:1;34092:81:0::1;::::0;::::1;13711:21:1::0;13768:2;13748:18;;;13741:30;13807:34;13787:18;;;13780:62;-1:-1:-1;;;13858:18:1;;;13851:35;13903:19;;34092:81:0::1;13527:401:1::0;34092:81:0::1;34194:27;34224:10;-1:-1:-1::0;;;;;34224:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;34224:26:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;34194:56;;34261:13;34293:6:::0;34289:126:::1;34307:10;:17;34305:1;:19;34289:126;;;34354:49;34372:10;34383:1;34372:13;;;;;;;;:::i;:::-;;;;;;;34387:3;34392:10;34354:17;:49::i;:::-;34345:58;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;34326:3:0;::::1;::::0;::::1;:::i;:::-;;;;34289:126;;;;34425:43;34471:10;-1:-1:-1::0;;;;;34471:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;34471:34:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;34425:80;;34565:6;34561:130;34580:10;:17;34576:1;:21;34561:130;;;34618:61;34644:10;34656;34667:1;34656:13;;;;;;;;:::i;:::-;;;;;;;34671:3;34676:2;34618:25;:61::i;:::-;34599:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34561:130;;;-1:-1:-1::0;34701:4:0::1;::::0;:20:::1;::::0;-1:-1:-1;;;34701:20:0;;::::1;::::0;::::1;3765:25:1::0;;;-1:-1:-1;;;;;34701:4:0;;::::1;::::0;:13:::1;::::0;3738:18:1;;34701:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34732:24:0::1;::::0;-1:-1:-1;;;34732:24:0;;-1:-1:-1;;;;;14255:32:1;;;34732:24:0::1;::::0;::::1;14237:51:1::0;14304:18;;;14297:34;;;34732:15:0;::::1;::::0;-1:-1:-1;34732:15:0::1;::::0;-1:-1:-1;14210:18:1;;34732:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34768:9;34791:2;-1:-1:-1::0;;;;;34783:16:0::1;34807:5;34783:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34767:50;;;34836:4;34828:35;;;::::0;-1:-1:-1;;;34828:35:0;;14754:2:1;34828:35:0::1;::::0;::::1;14736:21:1::0;14793:2;14773:18;;;14766:30;-1:-1:-1;;;14812:18:1;;;14805:48;14870:18;;34828:35:0::1;14552:342:1::0;34828:35:0::1;-1:-1:-1::0;;25701:1:0;26655:22;;-1:-1:-1;;;;;33854:1017:0:o;32963:883::-;33119:43;33141:14;33157:4;33119:21;:43::i;:::-;33173:17;33193:10;-1:-1:-1;;;;;33193:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33173:44;;33228:27;33258:10;-1:-1:-1;;;;;33258:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33258:26:0;;;;;;;;;;;;:::i;:::-;33228:56;;33295:43;33341:10;-1:-1:-1;;;;;33341:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33341:34:0;;;;;;;;;;;;:::i;:::-;33295:80;;33386:16;33405:61;33415:10;33427;33439;33451:14;33405:9;:61::i;:::-;33386:80;;33477:61;33492:10;33504:9;33515:10;33527;33477:14;:61::i;:::-;33549:20;27454:8;;33685:9;33673:8;33598:61;33608:10;33620;33632;33644:14;33598:9;:61::i;:::-;33586:73;;:9;:73;:::i;:::-;33585:96;;;;:::i;:::-;33584:110;;;;:::i;:::-;33583:124;;;;:::i;:::-;33582:138;;;;:::i;:::-;33549:171;;33756:6;33740:12;:22;;33732:62;;;;-1:-1:-1;;;33732:62:0;;15496:2:1;33732:62:0;;;15478:21:1;15535:2;15515:18;;;15508:30;15574:29;15554:18;;;15547:57;15621:18;;33732:62:0;15294:351:1;33732:62:0;33805:33;;-1:-1:-1;;;33805:33:0;;-1:-1:-1;;;;;14255:32:1;;;33805:33:0;;;14237:51:1;14304:18;;;14297:34;;;33805:15:0;;;;;14210:18:1;;33805:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33108:738;;;;;32963:883;;;;;:::o;36803:142::-;36885:14;;-1:-1:-1;;;;;36885:14:0;36871:10;:28;36863:37;;;;;;36911:14;:26;;-1:-1:-1;;;;;;36911:26:0;-1:-1:-1;;;;;36911:26:0;;;;;;;;;;36803:142::o;32390:565::-;32490:10;-1:-1:-1;;;;;32490:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;32482:62;;;;-1:-1:-1;;;32482:62:0;;15852:2:1;32482:62:0;;;15834:21:1;15891:2;15871:18;;;15864:30;-1:-1:-1;;;15910:18:1;;;15903:50;15970:18;;32482:62:0;15650:344:1;32482:62:0;32555:20;32603:10;-1:-1:-1;;;;;32603:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32579:20;:9;32591:8;32579:20;:::i;:::-;32578:47;;;;:::i;:::-;32555:70;;32660:6;32644:12;:22;;32636:62;;;;-1:-1:-1;;;32636:62:0;;15496:2:1;32636:62:0;;;15478:21:1;15535:2;15515:18;;;15508:30;15574:29;15554:18;;;15547:57;15621:18;;32636:62:0;15294:351:1;32636:62:0;32709:43;32755:10;-1:-1:-1;;;;;32755:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32755:34:0;;;;;;;;;;;;:::i;:::-;32709:80;;32800:77;32815:10;32827:9;32838:10;-1:-1:-1;;;;;32838:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32800:77;-1:-1:-1;;;;;32888:15:0;;;32904:2;27454:8;32909:24;27454:8;32909:12;:24;:::i;:::-;32908:38;;;;:::i;:::-;32888:59;;-1:-1:-1;;;;;;32888:59:0;;;;;;;-1:-1:-1;;;;;14255:32:1;;;32888:59:0;;;14237:51:1;14304:18;;;14297:34;14210:18;;32888:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32471:484;;32390:565;;;:::o;31903:479::-;32012:21;;:25;32009:366;;32053:13;32069:68;32096:14;32079:32;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32079:32:0;;;;;;;;;32069:43;;32079:32;32069:43;;;;20330:66:1;22820:58:0;;;20318:79:1;20413:12;;;;20406:28;;;;22820:58:0;;;;;;;;;;20450:12:1;;;;22820:58:0;;;22810:69;;;;;;22618:269;32069:68;32053:84;-1:-1:-1;32152:15:0;32170:19;32053:84;32184:4;32170:13;:19::i;:::-;32223:14;;32152:37;;-1:-1:-1;;;;;;32212:25:0;;;32223:14;;32212:25;32204:59;;;;-1:-1:-1;;;32204:59:0;;16749:2:1;32204:59:0;;;16731:21:1;16788:2;16768:18;;;16761:30;-1:-1:-1;;;16807:18:1;;;16800:51;16868:18;;32204:59:0;16547:345:1;32204:59:0;32304:14;32343:1;32319:14;:21;:25;;;;:::i;:::-;32304:41;;;;;;;;:::i;:::-;;;;;;;32286:15;:59;32278:85;;;;-1:-1:-1;;;32278:85:0;;17099:2:1;32278:85:0;;;17081:21:1;17138:2;17118:18;;;17111:30;-1:-1:-1;;;17157:18:1;;;17150:43;17210:18;;32278:85:0;16897:337:1;32278:85:0;32038:337;;32009:366;31903:479;;:::o;30762:968::-;30941:17;30999:6;30994:220;31015:10;:17;31011:1;:21;30994:220;;;31053:11;31074:28;31088:10;31099:1;31088:13;;;;;;;;:::i;31074:28::-;31067:67;;-1:-1:-1;;;31067:67:0;;-1:-1:-1;;;;;11827:32:1;;;31067:67:0;;;11809:51:1;31067:46:0;;;;;;;11782:18:1;;31067:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31053:81;;31162:40;31176:10;31187:1;31176:13;;;;;;;;:::i;:::-;;;;;;;31191:3;31196:5;31162:13;:40::i;:::-;31149:53;;;;:::i;:::-;;;31038:176;31034:3;;;;;:::i;:::-;;;;30994:220;;;;31228:6;31224:499;31244:10;:17;31240:1;:21;31224:499;;;31282:11;31314:10;31325:1;31314:13;;;;;;;;:::i;:::-;;;;;;;:30;;;-1:-1:-1;;;;;31296:59:0;;31364:10;31377;31388:1;31377:13;;;;;;;;:::i;:::-;;;;;;;:16;;;31296:98;;;;;;;;;;;;;;;-1:-1:-1;;;;;14255:32:1;;;;14237:51;;14319:2;14304:18;;14297:34;14225:2;14210:18;;14063:274;31296:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31282:112;;31409:18;31448:10;31459:1;31448:13;;;;;;;;:::i;:::-;;;;;;;:30;;;-1:-1:-1;;;;;31430:64:0;;31495:10;31506:1;31495:13;;;;;;;;:::i;:::-;;;;;;;:16;;;31430:82;;;;;;;;;;;;;3765:25:1;;3753:2;3738:18;;3619:177;31430:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31409:103;;31539:1;31533:3;:7;:51;;31581:3;31533:51;;;31572:5;31551:14;31566:1;31551:17;;;;;;;;:::i;:::-;;;;;;;31545:3;:23;;;;:::i;:::-;31544:33;;;;:::i;:::-;31527:57;;31625:1;31612:10;:14;:55;;31657:10;31612:55;;;31650:4;31630:16;:10;31643:3;31630:16;:::i;:::-;31629:25;;;;:::i;:::-;31599:68;-1:-1:-1;31695:16:0;31599:68;31695:3;:16;:::i;:::-;31682:29;;;;:::i;:::-;;;31267:456;;31263:3;;;;;:::i;:::-;;;;31224:499;;;;30762:968;;;;;;:::o;6365:249::-;6424:13;6450:14;6466;6500:4;-1:-1:-1;;;;;6485:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6531:4;-1:-1:-1;;;;;6516:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6583:4;;6449:97;;-1:-1:-1;6449:97:0;-1:-1:-1;;;;;;6565:23:0;;;6583:4;;6565:23;:41;;6600:6;6565:41;;;6591:6;6565:41;6557:49;6365:249;-1:-1:-1;;;;6365:249:0:o;31738:157::-;31808:17;31844:43;31862:9;31873:1;31876:10;31844:17;:43::i;:::-;31837:50;31738:157;-1:-1:-1;;;31738:157:0:o;5639:718::-;5755:7;5775:17;5795:43;5809:8;5819;5829;5795:13;:43::i;:::-;5775:63;;5849:19;5886:8;5849:46;;5907:14;5923;5942:4;-1:-1:-1;;;;;5942:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5957:4;-1:-1:-1;;;;;5957:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5906:65;;;;5982:13;5998:8;:73;;6034:4;;-1:-1:-1;;;;;6016:23:0;;;6034:4;;6016:23;:55;;6064:6;5998:73;;6016:55;6048:6;5998:73;;;6009:4;;-1:-1:-1;;;;;6009:4:0;5998:73;5982:89;;6083:18;6103;6145:6;-1:-1:-1;;;;;6125:26:0;6133:7;-1:-1:-1;;;;;6125:26:0;;:78;;6181:9;6200:1;6125:78;;;6163:1;6167:9;6125:78;6082:121;;;;6214:7;-1:-1:-1;;;;;6214:20:0;;6235:4;6241:8;6251;6214:46;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17761:15:1;;;17743:34;;17813:15;;;;17808:2;17793:18;;17786:43;17860:2;17845:18;;17838:34;;;;17693:2;17678:18;;17503:375;6214:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;6271:9:0;;;-1:-1:-1;6271:9:0;6281:10;6293;6305:2;6319:1;6309:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6309:12:0;;6271:51;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6340:9:0;;5639:718;-1:-1:-1;;;;;;;;;;;;;;;5639:718:0:o;29408:1075::-;29580:23;29606:10;-1:-1:-1;;;;;29606:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29580:57;;29648:20;29731:6;29727:517;29746:10;:17;29742:1;:21;29727:517;;;29784:39;29826:10;29837:1;29826:13;;;;;;;;:::i;:::-;;;;;;;29784:55;;29854:13;29870:70;29888:10;29901:8;:25;;;29928:8;:11;;;29870:17;:70::i;:::-;29854:86;-1:-1:-1;29955:11:0;29988:15;29970:14;29854:86;29970:6;:14;:::i;:::-;29969:34;;;;:::i;:::-;29955:48;;30033:5;;30026:3;:12;;30018:84;;;;-1:-1:-1;;;30018:84:0;;18880:2:1;30018:84:0;;;18862:21:1;18919:2;18899:18;;;18892:30;18958:34;18938:18;;;18931:62;19029:29;19009:18;;;19002:57;19076:19;;30018:84:0;18678:423:1;30018:84:0;30135:25;;30186:11;;;;30117:81;;-1:-1:-1;;;30117:81:0;;;;;3765:25:1;;;;-1:-1:-1;;;;;30117:56:0;;;;;;30181:3;;3738:18:1;;30117:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30229:3;30213:19;;;;;:::i;:::-;;;29769:475;;;29765:3;;;;;:::i;:::-;;;;29727:517;;;-1:-1:-1;30256:4:0;;-1:-1:-1;;;;;30256:4:0;:12;30276:24;30288:12;30276:9;:24;:::i;:::-;30256:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30348:6;30344:132;30362:10;:17;30360:1;:19;30344:132;;;30400:64;30413:10;30424:1;30413:13;;;;;;;;:::i;:::-;;;;;;;30428:15;30445:6;30453:10;30400:12;:64::i;:::-;-1:-1:-1;30381:3:0;;;;:::i;:::-;;;;30344:132;;;;29567:916;;29408:1075;;;;:::o;28044:724::-;28144:17;28173:13;28189:19;28203:4;28189:13;:19::i;:::-;28238:44;;-1:-1:-1;;;28238:44:0;;-1:-1:-1;;;;;11827:32:1;;;28238:44:0;;;11809:51:1;28173:35:0;;-1:-1:-1;28219:16:0;;28238:23;;;;;11782:18:1;;28238:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28219:63;-1:-1:-1;28336:12:0;;28333:175;;28472:10;-1:-1:-1;;;;;28472:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28449:19;28460:8;28449;:19;:::i;:::-;28448:48;;;;:::i;:::-;28437:59;;28333:175;28520:59;;-1:-1:-1;;;28520:59:0;;-1:-1:-1;;;;;17761:15:1;;;28520:59:0;;;17743:34:1;28563:4:0;17793:18:1;;;17786:43;17845:18;;;17838:34;;;28520:27:0;;;;;17678:18:1;;28520:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28689:71;28702:4;28708:8;28726:4;28741:10;28754:5;28689:12;:71::i;:::-;28677:83;28044:724;-1:-1:-1;;;;;;28044:724:0:o;28776:620::-;28958:25;;29024:11;;;;28940:97;;-1:-1:-1;;;28940:97:0;;28921:16;;-1:-1:-1;;;;;28940:54:0;;;;:97;;29003:10;;28940:97;;-1:-1:-1;;;;;14255:32:1;;;;14237:51;;14319:2;14304:18;;14297:34;14225:2;14210:18;;14063:274;28940:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28921:116;-1:-1:-1;29051:7:0;;29048:92;;29104:10;-1:-1:-1;;;;;29104:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29086:14;29092:8;29086:3;:14;:::i;:::-;29085:43;;;;:::i;:::-;29074:54;;29048:92;29168:25;;29256:11;;;;29150:133;;-1:-1:-1;;;29150:133:0;;-1:-1:-1;;;;;19457:15:1;;;29150:133:0;;;19439:34:1;29241:4:0;19489:18:1;;;19482:43;19541:18;;;19534:34;;;;19584:18;;;19577:34;;;19419:3;19627:19;;;19620:32;-1:-1:-1;19668:19:1;;;19661:30;29150:61:0;;;;;19708:19:1;;29150:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29312:25:0;;29371:11;;;;29294:94;;-1:-1:-1;;;29294:94:0;;;;;19940:25:1;;;19981:18;;;19974:34;;;;-1:-1:-1;;;;;20044:32:1;;;20024:18;;;20017:60;29294:58:0;;;;-1:-1:-1;29294:58:0;;-1:-1:-1;19913:18:1;;29294:94:0;19738:345:1;18928:231:0;19006:7;19027:17;19046:18;19068:27;19079:4;19085:9;19068:10;:27::i;:::-;19026:69;;;;19106:18;19118:5;19106:11;:18::i;:::-;-1:-1:-1;19142:9:0;18928:231;-1:-1:-1;;;18928:231:0:o;4958:617::-;5050:7;5069:19;5106:4;5069:42;;5123:16;5141;5163:4;-1:-1:-1;;;;;5163:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5122:59;-1:-1:-1;;;;;5122:59:0;;;-1:-1:-1;;;;;5122:59:0;;;5240:4;;;;;;;;-1:-1:-1;;;;;5240:4:0;-1:-1:-1;;;;;5215:30:0;:4;-1:-1:-1;;;;;5215:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5215:30:0;;:163;;5324:8;:54;;5359:8;5369;5215:163;;5324:54;5336:8;5346;5215:163;;;5258:8;:54;;5293:8;5303;5258:54;;;5270:8;5280;5258:54;5192:186;;-1:-1:-1;5192:186:0;-1:-1:-1;5389:14:0;5406;:8;5417:3;5406:14;:::i;:::-;5389:31;-1:-1:-1;5431:17:0;5452;5461:8;5389:31;5452:17;:::i;:::-;5431:38;-1:-1:-1;5480:19:0;5522:6;5503:15;:8;5514:4;5503:15;:::i;:::-;5502:26;;;;:::i;:::-;5480:48;-1:-1:-1;5546:21:0;5480:48;5546:9;:21;:::i;:::-;5539:28;4958:617;-1:-1:-1;;;;;;;;;;4958:617:0:o;30491:263::-;30669:31;;;-1:-1:-1;;;;;14255:32:1;;30669:31:0;;;14237:51:1;14304:18;;;14297:34;;;30602:7:0;;;;14210:18:1;;30669:31:0;;;;;;-1:-1:-1;;30669:31:0;;;;;;;30659:42;;30669:31;30659:42;;;;-1:-1:-1;;;30722:24:0;;-1:-1:-1;;;;;11827:32:1;;;30722:24:0;;;11809:51:1;30659:42:0;;-1:-1:-1;30722:19:0;;;;;11782:18:1;;30722:24:0;;;;;;;;;;;;;;;;;;;;;;27676:360;27845:30;;-1:-1:-1;;;27845:30:0;;-1:-1:-1;;;;;11827:32:1;;;27845:30:0;;;11809:51:1;27799:17:0;;;;27845:19;;;;;11782:18:1;;27845:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27829:46;-1:-1:-1;27886:13:0;27921:15;27903:14;27829:46;27903:6;:14;:::i;:::-;27902:34;;;;:::i;:::-;27886:50;;27956:72;27969:9;27980:5;27995:10;28016:4;28023;27956:12;:72::i;:::-;27949:79;27676:360;-1:-1:-1;;;;;;;27676:360:0:o;17379:747::-;17460:7;17469:12;17498:9;:16;17518:2;17498:22;17494:625;;17842:4;17827:20;;17821:27;17892:4;17877:20;;17871:27;17950:4;17935:20;;17929:27;17537:9;17921:36;17993:25;18004:4;17921:36;17821:27;17871;17993:10;:25::i;:::-;17986:32;;;;;;;;;17494:625;-1:-1:-1;18067:1:0;;-1:-1:-1;18071:35:0;17494:625;17379:747;;;;;:::o;15772:521::-;15850:20;15841:5;:29;;;;;;;;:::i;:::-;;15837:449;;15772:521;:::o;15837:449::-;15948:29;15939:5;:38;;;;;;;;:::i;:::-;;15935:351;;15994:34;;-1:-1:-1;;;15994:34:0;;21455:2:1;15994:34:0;;;21437:21:1;21494:2;21474:18;;;21467:30;21533:26;21513:18;;;21506:54;21577:18;;15994:34:0;21253:348:1;15935:351:0;16059:35;16050:5;:44;;;;;;;;:::i;:::-;;16046:240;;16111:41;;-1:-1:-1;;;16111:41:0;;21808:2:1;16111:41:0;;;21790:21:1;21847:2;21827:18;;;21820:30;21886:33;21866:18;;;21859:61;21937:18;;16111:41:0;21606:355:1;16046:240:0;16183:30;16174:5;:39;;;;;;;;:::i;:::-;;16170:116;;16230:44;;-1:-1:-1;;;16230:44:0;;22168:2:1;16230:44:0;;;22150:21:1;22207:2;22187:18;;;22180:30;22246:34;22226:18;;;22219:62;-1:-1:-1;;;22297:18:1;;;22290:32;22339:19;;16230:44:0;21966:398:1;16170:116:0;15772:521;:::o;20380:1520::-;20511:7;;21445:66;21432:79;;21428:163;;;-1:-1:-1;21544:1:0;;-1:-1:-1;21548:30:0;21528:51;;21428:163;21705:24;;;21688:14;21705:24;;;;;;;;;22596:25:1;;;22669:4;22657:17;;22637:18;;;22630:45;;;;22691:18;;;22684:34;;;22734:18;;;22727:34;;;21705:24:0;;22568:19:1;;21705:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21705:24:0;;-1:-1:-1;;21705:24:0;;;-1:-1:-1;;;;;;;21744:20:0;;21740:103;;21797:1;21801:29;21781:50;;;;;;;21740:103;21863:6;-1:-1:-1;21871:20:0;;-1:-1:-1;20380:1520:0;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:180;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;-1:-1:-1;648:23:1;;497:180;-1:-1:-1;497:180:1:o;682:139::-;-1:-1:-1;;;;;765:31:1;;755:42;;745:70;;811:1;808;801:12;826:127;887:10;882:3;878:20;875:1;868:31;918:4;915:1;908:15;942:4;939:1;932:15;958:257;1030:4;1024:11;;;1062:17;;1109:18;1094:34;;1130:22;;;1091:62;1088:88;;;1156:18;;:::i;:::-;1192:4;1185:24;958:257;:::o;1220:275::-;1291:2;1285:9;1356:2;1337:13;;-1:-1:-1;;1333:27:1;1321:40;;1391:18;1376:34;;1412:22;;;1373:62;1370:88;;;1438:18;;:::i;:::-;1474:2;1467:22;1220:275;;-1:-1:-1;1220:275:1:o;1500:183::-;1560:4;1593:18;1585:6;1582:30;1579:56;;;1615:18;;:::i;:::-;-1:-1:-1;1660:1:1;1656:14;1672:4;1652:25;;1500:183::o;1688:662::-;1742:5;1795:3;1788:4;1780:6;1776:17;1772:27;1762:55;;1813:1;1810;1803:12;1762:55;1849:6;1836:20;1875:4;1899:60;1915:43;1955:2;1915:43;:::i;:::-;1899:60;:::i;:::-;1993:15;;;2079:1;2075:10;;;;2063:23;;2059:32;;;2024:12;;;;2103:15;;;2100:35;;;2131:1;2128;2121:12;2100:35;2167:2;2159:6;2155:15;2179:142;2195:6;2190:3;2187:15;2179:142;;;2261:17;;2249:30;;2299:12;;;;2212;;2179:142;;;-1:-1:-1;2339:5:1;1688:662;-1:-1:-1;;;;;;1688:662:1:o;2355:530::-;2397:5;2450:3;2443:4;2435:6;2431:17;2427:27;2417:55;;2468:1;2465;2458:12;2417:55;2504:6;2491:20;2530:18;2526:2;2523:26;2520:52;;;2552:18;;:::i;:::-;2596:55;2639:2;2620:13;;-1:-1:-1;;2616:27:1;2645:4;2612:38;2596:55;:::i;:::-;2676:2;2667:7;2660:19;2722:3;2715:4;2710:2;2702:6;2698:15;2694:26;2691:35;2688:55;;;2739:1;2736;2729:12;2688:55;2804:2;2797:4;2789:6;2785:17;2778:4;2769:7;2765:18;2752:55;2852:1;2827:16;;;2845:4;2823:27;2816:38;;;;2831:7;2355:530;-1:-1:-1;;;2355:530:1:o;2890:724::-;3015:6;3023;3031;3084:2;3072:9;3063:7;3059:23;3055:32;3052:52;;;3100:1;3097;3090:12;3052:52;3139:9;3126:23;3158:39;3191:5;3158:39;:::i;:::-;3216:5;-1:-1:-1;3272:2:1;3257:18;;3244:32;3295:18;3325:14;;;3322:34;;;3352:1;3349;3342:12;3322:34;3375:61;3428:7;3419:6;3408:9;3404:22;3375:61;:::i;:::-;3365:71;;3489:2;3478:9;3474:18;3461:32;3445:48;;3518:2;3508:8;3505:16;3502:36;;;3534:1;3531;3524:12;3502:36;;3557:51;3600:7;3589:8;3578:9;3574:24;3557:51;:::i;:::-;3547:61;;;2890:724;;;;;:::o;3801:337::-;3883:6;3891;3944:2;3932:9;3923:7;3919:23;3915:32;3912:52;;;3960:1;3957;3950:12;3912:52;3999:9;3986:23;4018:39;4051:5;4018:39;:::i;:::-;4076:5;4128:2;4113:18;;;;4100:32;;-1:-1:-1;;;3801:337:1:o;4143:1384::-;4284:6;4292;4300;4353:2;4341:9;4332:7;4328:23;4324:32;4321:52;;;4369:1;4366;4359:12;4321:52;4408:9;4395:23;4427:39;4460:5;4427:39;:::i;:::-;4485:5;-1:-1:-1;4509:2:1;4547:18;;;4534:32;4585:18;4615:14;;;4612:34;;;4642:1;4639;4632:12;4612:34;4680:6;4669:9;4665:22;4655:32;;4725:7;4718:4;4714:2;4710:13;4706:27;4696:55;;4747:1;4744;4737:12;4696:55;4783:2;4770:16;4806:60;4822:43;4862:2;4822:43;:::i;4806:60::-;4900:15;;;4982:1;4978:10;;;;4970:19;;4966:28;;;4931:12;;;;5006:19;;;5003:39;;;5038:1;5035;5028:12;5003:39;5062:11;;;;5082:231;5098:6;5093:3;5090:15;5082:231;;;5180:3;5167:17;5197:41;5230:7;5197:41;:::i;:::-;5251:20;;5115:12;;;;5291;;;;5082:231;;;5332:5;-1:-1:-1;;;5390:2:1;5375:18;;5362:32;;-1:-1:-1;5406:16:1;;;5403:36;;;5435:1;5432;5425:12;5403:36;;;5458:63;5513:7;5502:8;5491:9;5487:24;5458:63;:::i;5532:486::-;5623:6;5631;5639;5692:2;5680:9;5671:7;5667:23;5663:32;5660:52;;;5708:1;5705;5698:12;5660:52;5747:9;5734:23;5766:39;5799:5;5766:39;:::i;:::-;5824:5;-1:-1:-1;5876:2:1;5861:18;;5848:32;;-1:-1:-1;5932:2:1;5917:18;;5904:32;5945:41;5904:32;5945:41;:::i;:::-;6005:7;5995:17;;;5532:486;;;;;:::o;6023:943::-;6166:6;6174;6182;6190;6198;6251:3;6239:9;6230:7;6226:23;6222:33;6219:53;;;6268:1;6265;6258:12;6219:53;6307:9;6294:23;6326:39;6359:5;6326:39;:::i;:::-;6384:5;-1:-1:-1;6436:2:1;6421:18;;6408:32;;-1:-1:-1;6492:2:1;6477:18;;6464:32;6505:41;6464:32;6505:41;:::i;:::-;6565:7;-1:-1:-1;6623:2:1;6608:18;;6595:32;6646:18;6676:14;;;6673:34;;;6703:1;6700;6693:12;6673:34;6726:61;6779:7;6770:6;6759:9;6755:22;6726:61;:::i;:::-;6716:71;;6840:3;6829:9;6825:19;6812:33;6796:49;;6870:2;6860:8;6857:16;6854:36;;;6886:1;6883;6876:12;6854:36;;6909:51;6952:7;6941:8;6930:9;6926:24;6909:51;:::i;:::-;6899:61;;;6023:943;;;;;;;;:::o;6971:255::-;7030:6;7083:2;7071:9;7062:7;7058:23;7054:32;7051:52;;;7099:1;7096;7089:12;7051:52;7138:9;7125:23;7157:39;7190:5;7157:39;:::i;7231:1087::-;7385:6;7393;7401;7409;7417;7470:3;7458:9;7449:7;7445:23;7441:33;7438:53;;;7487:1;7484;7477:12;7438:53;7526:9;7513:23;7545:39;7578:5;7545:39;:::i;:::-;7603:5;-1:-1:-1;7660:2:1;7645:18;;7632:32;7673:41;7632:32;7673:41;:::i;:::-;7733:7;-1:-1:-1;7791:2:1;7776:18;;7763:32;7814:18;7844:14;;;7841:34;;;7871:1;7868;7861:12;7841:34;7894:61;7947:7;7938:6;7927:9;7923:22;7894:61;:::i;:::-;7884:71;;8008:2;7997:9;7993:18;7980:32;7964:48;;8037:2;8027:8;8024:16;8021:36;;;8053:1;8050;8043:12;8530:750;8634:6;8642;8650;8658;8666;8719:3;8707:9;8698:7;8694:23;8690:33;8687:53;;;8736:1;8733;8726:12;8687:53;8775:9;8762:23;8794:39;8827:5;8794:39;:::i;:::-;8852:5;-1:-1:-1;8909:2:1;8894:18;;8881:32;8922:41;8881:32;8922:41;:::i;:::-;8982:7;-1:-1:-1;9036:2:1;9021:18;;9008:32;;-1:-1:-1;9087:2:1;9072:18;;9059:32;;-1:-1:-1;9142:3:1;9127:19;;9114:33;9170:18;9159:30;;9156:50;;;9202:1;9199;9192:12;9156:50;9225:49;9266:7;9257:6;9246:9;9242:22;9225:49;:::i;9285:1272::-;9412:6;9443:2;9486;9474:9;9465:7;9461:23;9457:32;9454:52;;;9502:1;9499;9492:12;9454:52;9535:9;9529:16;9568:18;9560:6;9557:30;9554:50;;;9600:1;9597;9590:12;9554:50;9623:22;;9676:4;9668:13;;9664:27;-1:-1:-1;9654:55:1;;9705:1;9702;9695:12;9654:55;9734:2;9728:9;9757:60;9773:43;9813:2;9773:43;:::i;9757:60::-;9851:15;;;9933:1;9929:10;;;;9921:19;;9917:28;;;9882:12;;;;9957:19;;;9954:39;;;9989:1;9986;9979:12;9954:39;10013:11;;;;10033:494;10049:6;10044:3;10041:15;10033:494;;;10131:4;10125:3;10116:7;10112:17;10108:28;10105:118;;;10177:1;10206:2;10202;10195:14;10105:118;10249:22;;:::i;:::-;10305:3;10299:10;10322:41;10355:7;10322:41;:::i;:::-;10376:22;;10440:12;;;10434:19;10418:14;;;10411:43;10467:18;;10075:4;10066:14;;;;10505:12;;;;10033:494;;10562:964;10657:6;10688:2;10731;10719:9;10710:7;10706:23;10702:32;10699:52;;;10747:1;10744;10737:12;10699:52;10780:9;10774:16;10813:18;10805:6;10802:30;10799:50;;;10845:1;10842;10835:12;10799:50;10868:22;;10921:4;10913:13;;10909:27;-1:-1:-1;10899:55:1;;10950:1;10947;10940:12;10899:55;10979:2;10973:9;11002:60;11018:43;11058:2;11018:43;:::i;11002:60::-;11096:15;;;11178:1;11174:10;;;;11166:19;;11162:28;;;11127:12;;;;11202:19;;;11199:39;;;11234:1;11231;11224:12;11199:39;11258:11;;;;11278:218;11294:6;11289:3;11286:15;11278:218;;;11367:3;11361:10;11384:39;11417:5;11384:39;:::i;:::-;11436:18;;11311:12;;;;11474;;;;11278:218;;11531:127;11592:10;11587:3;11583:20;11580:1;11573:31;11623:4;11620:1;11613:15;11647:4;11644:1;11637:15;11871:184;11941:6;11994:2;11982:9;11973:7;11969:23;11965:32;11962:52;;;12010:1;12007;12000:12;11962:52;-1:-1:-1;12033:16:1;;11871:184;-1:-1:-1;11871:184:1:o;12762:127::-;12823:10;12818:3;12814:20;12811:1;12804:31;12854:4;12851:1;12844:15;12878:4;12875:1;12868:15;12894:135;12933:3;12954:17;;;12951:43;;12974:18;;:::i;:::-;-1:-1:-1;13021:1:1;13010:13;;12894:135::o;13034:128::-;13101:9;;;13122:11;;;13119:37;;;13136:18;;:::i;13933:125::-;13998:9;;;14019:10;;;14016:36;;;14032:18;;:::i;14899:168::-;14939:7;15005:1;15001;14997:6;14993:14;14990:1;14987:21;14982:1;14975:9;14968:17;14964:45;14961:71;;;15012:18;;:::i;:::-;-1:-1:-1;15052:9:1;;14899:168::o;15072:217::-;15112:1;15138;15128:132;;15182:10;15177:3;15173:20;15170:1;15163:31;15217:4;15214:1;15207:15;15245:4;15242:1;15235:15;15128:132;-1:-1:-1;15274:9:1;;15072:217::o;15999:543::-;16217:13;;16160:3;;16191;;16270:4;16297:15;;;16160:3;16340:175;16354:6;16351:1;16348:13;16340:175;;;16417:13;;16403:28;;16453:14;;;;16490:15;;;;16376:1;16369:9;16340:175;;;-1:-1:-1;16531:5:1;;15999:543;-1:-1:-1;;;;;;15999:543:1:o;17239:259::-;17309:6;17362:2;17350:9;17341:7;17337:23;17333:32;17330:52;;;17378:1;17375;17368:12;17330:52;17410:9;17404:16;17429:39;17462:5;17429:39;:::i;17883:790::-;18114:6;18103:9;18096:25;18077:4;18140:2;18178:6;18173:2;18162:9;18158:18;18151:34;18250:1;18246;18241:3;18237:11;18233:19;18225:6;18221:32;18216:2;18205:9;18201:18;18194:60;18290:3;18285:2;18274:9;18270:18;18263:31;18323:6;18317:13;18367:6;18361:3;18350:9;18346:19;18339:35;18392:1;18402:141;18416:6;18413:1;18410:13;18402:141;;;18512:14;;;18508:23;;18502:30;18477:17;;;18496:3;18473:27;18466:67;18431:10;;18402:141;;;18406:3;18593:1;18587:3;18578:6;18567:9;18563:22;18559:32;18552:43;18663:3;18656:2;18652:7;18647:2;18639:6;18635:15;18631:29;18620:9;18616:45;18612:55;18604:63;;;;17883:790;;;;;;;:::o;20473:188::-;20552:13;;-1:-1:-1;;;;;20594:42:1;;20584:53;;20574:81;;20651:1;20648;20641:12;20574:81;20473:188;;;:::o;20666:450::-;20753:6;20761;20769;20822:2;20810:9;20801:7;20797:23;20793:32;20790:52;;;20838:1;20835;20828:12;20790:52;20861:40;20891:9;20861:40;:::i;:::-;20851:50;;20920:49;20965:2;20954:9;20950:18;20920:49;:::i;:::-;20910:59;;21012:2;21001:9;20997:18;20991:25;21056:10;21049:5;21045:22;21038:5;21035:33;21025:61;;21082:1;21079;21072:12;21121:127;21182:10;21177:3;21173:20;21170:1;21163:31;21213:4;21210:1;21203:15;21237:4;21234:1;21227:15
Swarm Source
ipfs://4780d1f8709afc1e42e9c1201dc0595fdc57718a6b458c14703523ff04deff06
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.