Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 55191749 | 416 days ago | IN | Create: NyPtvFantomUsdcWftmEqualizerStrategyToWftm_V2 | 0 FTM | 0.6400574 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
55191749 | 416 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
NyPtvFantomUsdcWftmEqualizerStrategyToWftm_V2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2023-02-06 */ // SPDX-License-Identifier: No License (None) // No permissions granted before Sunday, 21 Jul 2024, then GPL-3.0 after this date. /** * ███╗ ██╗██╗███╗ ██╗ ██╗ █████╗ ██╗ ██╗██╗███████╗██╗ ██████╗ ███████╗██████╗ * ████╗ ██║██║████╗ ██║ ██║██╔══██╗ ╚██╗ ██╔╝██║██╔════╝██║ ██╔══██╗██╔════╝██╔══██╗ * ██╔██╗ ██║██║██╔██╗ ██║ ██║███████║ ╚████╔╝ ██║█████╗ ██║ ██║ ██║█████╗ ██████╔╝ * ██║╚██╗██║██║██║╚██╗██║██ ██║██╔══██║ ╚██╔╝ ██║██╔══╝ ██║ ██║ ██║██╔══╝ ██╔══██╗ * ██║ ╚████║██║██║ ╚████║╚█████╔╝██║ ██║ ██║ ██║███████╗███████╗██████╔╝███████╗██║ ██║ * ╚═╝ ╚═══╝╚═╝╚═╝ ╚═══╝ ╚════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝ * Yield like a Ninja! * * * We are committed to working with Black/White hats. If you find an issue then please reach * out quoting reference 'NyPtvFantomUsdcWftmEqualizerStrategyToWftm' * * https://discord.yielder.ninja * https://twitter.com/NinjaYielder */ pragma solidity ^0.8.0; interface IStrategy { function deposit() external; function withdraw(uint256 _amount) external; function harvest() external returns (uint256); function balanceOf() external view returns (uint256); function estimateHarvest() external view returns (uint256 profit, uint256 callFeeToUser); function retireStrategy() external; function panic() external; function pause() external; function unpause() external; } interface IAccessControlUpgradeable { event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } library AddressUpgradeable { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Initializable { uint8 private _initialized; bool private _initializing; event Initialized(uint8 version); modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing {} function __Context_init_unchained() internal onlyInitializing {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; function toString(uint256 value) internal pure returns (string memory) { 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); } 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); } 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); } function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } interface IERC165Upgradeable { function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing {} function __ERC165_init_unchained() internal onlyInitializing {} function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing {} function __AccessControl_init_unchained() internal onlyInitializing {} struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; modifier onlyRole(bytes32 role) { _checkRole(role); _; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } library EnumerableSetUpgradeable { struct Set { bytes32[] _values; mapping(bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove(Set storage set, bytes32 value) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; set._values[toDeleteIndex] = lastValue; set._indexes[lastValue] = valueIndex; } set._values.pop(); delete set._indexes[value]; return true; } else { return false; } } function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } function _length(Set storage set) private view returns (uint256) { return set._values.length; } function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } struct Bytes32Set { Set _inner; } function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } struct UintSet { Set _inner; } function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal onlyInitializing {} function __AccessControlEnumerable_init_unchained() internal onlyInitializing {} using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } uint256[49] private __gap; } interface IERC1822ProxiableUpgradeable { function proxiableUUID() external view returns (bytes32); } interface IBeaconUpgradeable { function implementation() external view returns (address); } library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly { r.slot := slot } } function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly { r.slot := slot } } function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly { r.slot := slot } } function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly { r.slot := slot } } } abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing {} function __ERC1967Upgrade_init_unchained() internal onlyInitializing {} bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; event Upgraded(address indexed implementation); function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; event AdminChanged(address previousAdmin, address newAdmin); function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; event BeaconUpgraded(address indexed beacon); function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } uint256[50] private __gap; } abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing {} function __UUPSUpgradeable_init_unchained() internal onlyInitializing {} address private immutable __self = address(this); modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } function _authorizeUpgrade(address newImplementation) internal virtual; uint256[50] private __gap; } abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { event Paused(address account); event Unpaused(address account); bool private _paused; function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } modifier whenNotPaused() { _requireNotPaused(); _; } modifier whenPaused() { _requirePaused(); _; } function paused() public view virtual returns (bool) { return _paused; } function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } abstract contract NYBaseProfitTakingStrategyV3 is IStrategy, UUPSUpgradeable, AccessControlEnumerableUpgradeable, PausableUpgradeable { uint256 public constant PERCENT_DIVISOR = 10_000; uint256 public constant ONE_YEAR = 365 days; uint256 public constant UPGRADE_TIMELOCK = 30 minutes; uint256 public lastHarvestTimestamp; uint256 public upgradeProposalTime; address public deployer; bytes32 public constant KEEPER = keccak256("KEEPER"); bytes32 public constant STRATEGIST = keccak256("STRATEGIST"); bytes32 public constant GUARDIAN = keccak256("GUARDIAN"); bytes32 public constant ADMIN = keccak256("ADMIN"); bytes32[] private cascadingAccess; address public vault; address public treasury; address public strategistRemitter; uint256 public constant MAX_FEE = 1000; uint256 public constant MAX_SECURITY_FEE = 100; uint256 public constant STRATEGIST_MAX_FEE = 1000; uint256 public totalFee; uint256 public callFee; uint256 public treasuryFee; uint256 public strategistFee; uint256 public securityFee; event ClearUpgradeCooldown(uint256 upgradeProposalTime); event DeployerRevoked(); event FeesUpdated(uint256 newCallFee, uint256 newTreasuryFee, uint256 newStrategistFee); event InitiateUpgradeCooldown(uint256 upgradeProposalTime); event SecurityFeeUpdated(uint256 securityFee); event StrategyHarvest( address indexed harvester, uint256 underlyingTokenCount, uint256 harvestSeconds, uint256 sentToVault ); event StrategistRemitterUpdated(address newStrategistRemitter); event TotalFeeUpdated(uint256 newFee); event TreasuryUpdated(address newTreasury); constructor() initializer {} function __NYBaseProfitTakingStrategy_init( address _vault, address _treasury, address _strategistRemitter, address[] memory _strategists, address[] memory _multisigRoles ) internal onlyInitializing { __UUPSUpgradeable_init(); __AccessControlEnumerable_init(); __Pausable_init_unchained(); totalFee = 500; callFee = 500; treasuryFee = 9500; strategistFee = 1053; securityFee = 10; vault = _vault; treasury = _treasury; strategistRemitter = _strategistRemitter; for (uint256 i = 0; i < _strategists.length; i++) { _grantRole(STRATEGIST, _strategists[i]); } deployer = msg.sender; _grantRole(GUARDIAN, deployer); _grantRole(DEFAULT_ADMIN_ROLE, _multisigRoles[0]); _grantRole(ADMIN, _multisigRoles[1]); _grantRole(GUARDIAN, _multisigRoles[2]); cascadingAccess = [DEFAULT_ADMIN_ROLE, ADMIN, GUARDIAN, STRATEGIST, KEEPER]; clearUpgradeCooldown(); } function deposit() public override whenNotPaused { _deposit(); } function withdraw(uint256 _amount) external override { require(msg.sender == vault); require(_amount != 0); require(_amount <= balanceOf()); uint256 withdrawFee = (_amount * securityFee) / PERCENT_DIVISOR; _amount -= withdrawFee; _withdraw(_amount); } function harvest() external override whenNotPaused returns (uint256 callerFee) { require(lastHarvestTimestamp != block.timestamp); uint256 harvestSeconds = lastHarvestTimestamp > 0 ? block.timestamp - lastHarvestTimestamp : 0; lastHarvestTimestamp = block.timestamp; uint256 sentToVault; uint256 underlyingTokenCount; (callerFee, underlyingTokenCount, sentToVault) = _harvestCore(); emit StrategyHarvest(msg.sender, underlyingTokenCount, harvestSeconds, sentToVault); } function balanceOf() public view virtual override returns (uint256); function retireStrategy() external override { _atLeastRole(STRATEGIST); _retireStrategy(); } function panic() external override { _atLeastRole(GUARDIAN); _reclaimUnderlying(); pause(); } function pause() public override { _atLeastRole(GUARDIAN); _pause(); } function unpause() external override { _atLeastRole(ADMIN); _unpause(); deposit(); } function updateTotalFee(uint256 _totalFee) external { _atLeastRole(DEFAULT_ADMIN_ROLE); require(_totalFee <= MAX_FEE); totalFee = _totalFee; emit TotalFeeUpdated(totalFee); } function updateFees(uint256 _callFee, uint256 _treasuryFee, uint256 _strategistFee) external returns (bool) { _atLeastRole(DEFAULT_ADMIN_ROLE); require(_callFee + _treasuryFee == PERCENT_DIVISOR); require(_strategistFee <= STRATEGIST_MAX_FEE); callFee = _callFee; treasuryFee = _treasuryFee; strategistFee = _strategistFee; emit FeesUpdated(callFee, treasuryFee, strategistFee); return true; } function updateSecurityFee(uint256 _securityFee) external { _atLeastRole(DEFAULT_ADMIN_ROLE); require(_securityFee <= MAX_SECURITY_FEE); securityFee = _securityFee; emit SecurityFeeUpdated(securityFee); } function updateTreasury(address newTreasury) external returns (bool) { _atLeastRole(DEFAULT_ADMIN_ROLE); require(newTreasury != address(0)); treasury = newTreasury; emit TreasuryUpdated(newTreasury); return true; } function updateStrategistRemitter(address _newStrategistRemitter) external { _atLeastRole(DEFAULT_ADMIN_ROLE); require(_newStrategistRemitter != address(0)); strategistRemitter = _newStrategistRemitter; emit StrategistRemitterUpdated(_newStrategistRemitter); } function initiateUpgradeCooldown() external { _atLeastRole(STRATEGIST); upgradeProposalTime = block.timestamp; emit InitiateUpgradeCooldown(upgradeProposalTime); } function clearUpgradeCooldown() public { _atLeastRole(GUARDIAN); upgradeProposalTime = block.timestamp + (ONE_YEAR * 100); emit ClearUpgradeCooldown(upgradeProposalTime); } function _authorizeUpgrade(address) internal override { _atLeastRole(DEFAULT_ADMIN_ROLE); require(upgradeProposalTime + UPGRADE_TIMELOCK < block.timestamp); clearUpgradeCooldown(); } function revokeDeployer() public { _atLeastRole(GUARDIAN); _revokeRole(GUARDIAN, deployer); deployer = address(0); emit DeployerRevoked(); } function _atLeastRole(bytes32 role) internal view { uint256 numRoles = cascadingAccess.length; uint256 specifiedRoleIndex; for (uint256 i = 0; i < numRoles; i++) { if (role == cascadingAccess[i]) { specifiedRoleIndex = i; break; } else if (i == numRoles - 1) { revert(); } } for (uint256 i = 0; i <= specifiedRoleIndex; i++) { if (hasRole(cascadingAccess[i], msg.sender)) { break; } else if (i == specifiedRoleIndex) { revert(); } } } function _onlyStrategistOrOwner() internal view { require(hasRole(STRATEGIST, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Not authorized"); } function _deposit() internal virtual; function _withdraw(uint256 _amount) internal virtual; function _harvestCore() internal virtual returns (uint256 callerFee, uint256 underlyingTokenCount, uint256 sentToVault); function _reclaimUnderlying() internal virtual; function _retireStrategy() internal virtual; } interface IERC20Upgradeable { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); } interface IERC20PermitUpgradeable { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); function DOMAIN_SEPARATOR() external view returns (bytes32); } library SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20PermitUpgradeable token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library MathUpgradeable { enum Rounding { Down, Up, Zero } function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function average(uint256 a, uint256 b) internal pure returns (uint256) { return (a & b) + (a ^ b) / 2; } function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { return a == 0 ? 0 : (a - 1) / b + 1; } function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { uint256 prod0; uint256 prod1; assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } if (prod1 == 0) { return prod0 / denominator; } require(denominator > prod1); uint256 remainder; assembly { remainder := mulmod(x, y, denominator) prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } uint256 twos = denominator & (~denominator + 1); assembly { denominator := div(denominator, twos) prod0 := div(prod0, twos) twos := add(div(sub(0, twos), twos), 1) } prod0 |= prod1 * twos; uint256 inverse = (3 * denominator) ^ 2; inverse *= 2 - denominator * inverse; inverse *= 2 - denominator * inverse; inverse *= 2 - denominator * inverse; inverse *= 2 - denominator * inverse; inverse *= 2 - denominator * inverse; inverse *= 2 - denominator * inverse; result = prod0 * inverse; return result; } } function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } } interface IGauge { function claimFees() external returns (uint claimed0, uint claimed1); function getReward(address account, address[] memory tokens) external; function isForPair() external view returns (bool); function left(address token) external view returns (uint); function notifyRewardAmount(address token, uint amount) external; } interface IRouter { function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair); } interface IVault { function depositProfitTokenForUsers(uint256 _amount) external; } interface IEqualizerGauge is IGauge { function balanceOf(address) external view returns (uint256); function deposit(uint256 amount, uint256 tokenId) external; function depositAll(uint256 tokenId) external; function tokenIds(address) external view returns (uint256); function withdraw(uint256 amount) external; function withdrawAll() external; } interface IEqualizerRouter is IRouter { struct Route { address from; address to; bool stable; } function getAmountOut( uint amountIn, address tokenIn, address tokenOut ) external view returns (uint amount, bool stable); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountsOut(uint amountIn, Route[] memory routes) external view returns (uint[] memory amounts); } error NyPtvFantomUsdcWftmEqualizerStrategyToWftm__MaxSlippageOutOfBounds(uint256 maxSlippage); contract NyPtvFantomUsdcWftmEqualizerStrategyToWftm_V2 is NYBaseProfitTakingStrategyV3 { using SafeERC20Upgradeable for IERC20Upgradeable; address public constant EQUALIZER_ROUTER = address(0x1A05EB736873485655F29a37DEf8a0AA87F5a447); address public constant WFTM = address(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address public constant EQUAL = address(0x3Fd3A0c85B70754eFc07aC9Ac0cbBDCe664865A6); address public constant GAUGE = address(0x5E689D7fB26FfC4BD615c98C8517A18ef1f5e68d); address public constant LP_TOKEN = address(0x7547d05dFf1DA6B4A2eBB3f0833aFE3C62ABD9a1); address[] public rewards; address[] public equalToWftmPath; uint256 public maxSlippage; function _deposit() internal override { uint256 underlyingBalance = IERC20Upgradeable(LP_TOKEN).balanceOf(address(this)); if (underlyingBalance != 0) { uint256 underlyingId = IEqualizerGauge(GAUGE).tokenIds(LP_TOKEN); IERC20Upgradeable(LP_TOKEN).safeIncreaseAllowance(GAUGE, underlyingBalance); IEqualizerGauge(GAUGE).deposit(underlyingBalance, underlyingId); } } function _withdraw(uint256 _amount) internal override { uint256 underlyingBalance = IERC20Upgradeable(LP_TOKEN).balanceOf(address(this)); if (underlyingBalance < _amount) { uint256 remaining = _amount - underlyingBalance; IEqualizerGauge(GAUGE).withdraw(remaining); } IERC20Upgradeable(LP_TOKEN).safeTransfer(vault, _amount); } function _harvestCore() internal override returns (uint256 callerFee, uint256 underlyingTokenCount, uint256 sentToVault) { IEqualizerGauge(GAUGE).getReward(address(this), rewards); _swapFarmEmissionTokens(); callerFee = _chargeFees(); underlyingTokenCount = balanceOf(); sentToVault = _sendYieldToVault(); } function _swapFarmEmissionTokens() internal { IERC20Upgradeable equal = IERC20Upgradeable(EQUAL); uint256 equalBalance = equal.balanceOf(address(this)); if (equalToWftmPath.length >= 2 && equalBalance > 0) { equal.safeIncreaseAllowance(EQUALIZER_ROUTER, equalBalance); IEqualizerRouter router = IEqualizerRouter(EQUALIZER_ROUTER); (, bool useStable) = router.getAmountOut(equalBalance, EQUAL, WFTM); IEqualizerRouter.Route[] memory routes = new IEqualizerRouter.Route[](1); routes[0] = IEqualizerRouter.Route({from: EQUAL, to: WFTM, stable: useStable}); uint[] memory amounts = router.getAmountsOut(equalBalance, routes); uint percentage = (amounts[1] * maxSlippage) / 10000; router.swapExactTokensForTokens(equalBalance, percentage, routes, address(this), block.timestamp); } } function _chargeFees() internal returns (uint256 callerFee) { IERC20Upgradeable wftm = IERC20Upgradeable(WFTM); uint256 fee = (wftm.balanceOf(address(this)) * totalFee) / PERCENT_DIVISOR; if (fee != 0) { callerFee = (fee * callFee) / PERCENT_DIVISOR; uint256 treasuryFeeToVault = (fee * treasuryFee) / PERCENT_DIVISOR; uint256 feeToStrategist = (treasuryFeeToVault * strategistFee) / PERCENT_DIVISOR; treasuryFeeToVault -= feeToStrategist; wftm.safeTransfer(msg.sender, callerFee); wftm.safeTransfer(treasury, treasuryFeeToVault); wftm.safeTransfer(strategistRemitter, feeToStrategist); } } function _sendYieldToVault() internal returns (uint256 sentToVault) { sentToVault = IERC20Upgradeable(WFTM).balanceOf(address(this)); if (sentToVault > 0) { IERC20Upgradeable(WFTM).approve(vault, sentToVault); IVault(vault).depositProfitTokenForUsers(sentToVault); } } function balanceOf() public view override returns (uint256) { return balanceInGauge() + IERC20Upgradeable(LP_TOKEN).balanceOf(address(this)); } function balanceInGauge() public view returns (uint256) { return IEqualizerGauge(GAUGE).balanceOf(address(this)); } function _reclaimUnderlying() internal override { return IEqualizerGauge(GAUGE).withdrawAll(); } function updateMaxSlippage(uint256 _maxSlippage) external { if (_maxSlippage > 10000) { revert NyPtvFantomUsdcWftmEqualizerStrategyToWftm__MaxSlippageOutOfBounds(_maxSlippage); } _atLeastRole(ADMIN); maxSlippage = _maxSlippage; } function setEqualToWftmPath(address[] memory _path) external { _atLeastRole(STRATEGIST); require(_path[0] == EQUAL && _path[_path.length - 1] == WFTM, "INVALID INPUT"); equalToWftmPath = _path; } function estimateHarvest() external view override returns (uint256 profit, uint256 callFeeToUser) {} function _retireStrategy() internal override { _harvestCore(); IEqualizerGauge(GAUGE).withdrawAll(); uint256 underlyingBalance = IERC20Upgradeable(LP_TOKEN).balanceOf(address(this)); if (underlyingBalance != 0) { IERC20Upgradeable(LP_TOKEN).safeTransfer(vault, underlyingBalance); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxSlippage","type":"uint256"}],"name":"NyPtvFantomUsdcWftmEqualizerStrategyToWftm__MaxSlippageOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"upgradeProposalTime","type":"uint256"}],"name":"ClearUpgradeCooldown","type":"event"},{"anonymous":false,"inputs":[],"name":"DeployerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCallFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTreasuryFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStrategistFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"upgradeProposalTime","type":"uint256"}],"name":"InitiateUpgradeCooldown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"securityFee","type":"uint256"}],"name":"SecurityFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategistRemitter","type":"address"}],"name":"StrategistRemitterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyingTokenCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sentToVault","type":"uint256"}],"name":"StrategyHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"TotalFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EQUAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EQUALIZER_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAUGE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GUARDIAN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SECURITY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIST","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRATEGIST_MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_TIMELOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WFTM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceInGauge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearUpgradeCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"equalToWftmPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimateHarvest","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"},{"internalType":"uint256","name":"callFeeToUser","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[{"internalType":"uint256","name":"callerFee","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateUpgradeCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastHarvestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setEqualToWftmPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategistFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategistRemitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_strategistFee","type":"uint256"}],"name":"updateFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSlippage","type":"uint256"}],"name":"updateMaxSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_securityFee","type":"uint256"}],"name":"updateSecurityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategistRemitter","type":"address"}],"name":"updateStrategistRemitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFee","type":"uint256"}],"name":"updateTotalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"updateTreasury","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeProposalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523060601b6080523480156200001857600080fd5b50600054610100900460ff16158080156200003a5750600054600160ff909116105b806200006a575062000057306200014460201b620016491760201c565b1580156200006a575060005460ff166001145b620000d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000f6576000805461ff0019166101001790555b80156200013d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000153565b6001600160a01b03163b151590565b60805160601c6138706200018e60003960008181610ce401528181610d2401528181610ec301528181610f030152610f9201526138706000f3fe6080604052600436106103ad5760003560e01c80637651b1e6116101e7578063b29d404b1161010d578063d5f39488116100a0578063ecf173ff1161006f578063ecf173ff14610931578063f301af4214610a7b578063f896acc714610a9b578063fbfa77cf14610abb57600080fd5b8063d5f39488146109fb578063d68e130214610a1c578063db8426a814610a33578063e46257d214610a5b57600080fd5b8063cc32d176116100dc578063cc32d1761461098f578063d0e30db0146109a6578063d32b9604146109bb578063d547741f146109db57600080fd5b8063b29d404b14610910578063bc063e1a14610931578063bfd9041b14610947578063ca15c8731461096f57600080fd5b80638888f9f61161018557806391d148541161015457806391d14854146108a45780639aa9645f146108c45780639cfdede3146108d9578063a217fddf146108fb57600080fd5b80638888f9f6146108355780638c04166f146108565780639010d07c1461086d57806390321e1a1461088d57600080fd5b806382b0b175116101c157806382b0b175146107c25780638456cb59146107d7578063862a179e146107ec578063888799851461082057600080fd5b80637651b1e61461075a57806378d21fc2146107825780637f51bb1f146107a257600080fd5b80633f4ba83a116102d7578063615911491161026a5780636ba1b3e0116102395780636ba1b3e0146106f95780636f33a0031461070e578063722713f714610723578063724c184c1461073857600080fd5b8063615911491461067957806361d027b314610699578063651eebfe146106ba5780636586ba6f146106d157600080fd5b80634f1ef286116102a65780634f1ef28614610621578063526e10801461063457806352d1902d1461064b5780635c975abb1461066057600080fd5b80633f4ba83a146105cc5780634641257d146105e15780634700d305146105f65780634870dd9a1461060b57600080fd5b80632257a7381161034f5780632e1a7d4d1161031e5780632e1a7d4d1461054a5780632f2ff15d1461056c57806336568abe1461058c5780633659cfe6146105ac57600080fd5b80632257a738146104b9578063248a9ca3146104d057806325ed32ca146105005780632a0acc6a1461051657600080fd5b80631aa0e5481161038b5780631aa0e548146104225780631df4ccfc1461045a57806321dbe87614610471578063224290851461049957600080fd5b806301ffc9a7146103b257806313c6c475146103e757806316d3bfbb1461040a575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613350565b610adc565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc606481565b6040519081526020016103de565b34801561041657600080fd5b506103fc6301e1338081565b34801561042e57600080fd5b5061044261043d3660046132d0565b610b07565b6040516001600160a01b0390911681526020016103de565b34801561046657600080fd5b506103fc6101665481565b34801561047d57600080fd5b506104427321be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b3480156104a557600080fd5b506103d26104b436600461339d565b610b32565b3480156104c557600080fd5b506103fc61015f5481565b3480156104dc57600080fd5b506103fc6104eb3660046132d0565b600090815260c9602052604090206001015490565b34801561050c57600080fd5b506103fc61070881565b34801561052257600080fd5b506103fc7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b34801561055657600080fd5b5061056a6105653660046132d0565b610bc1565b005b34801561057857600080fd5b5061056a610587366004613302565b610c30565b34801561059857600080fd5b5061056a6105a7366004613302565b610c5a565b3480156105b857600080fd5b5061056a6105c73660046130c4565b610cd9565b3480156105d857600080fd5b5061056a610db9565b3480156105ed57600080fd5b506103fc610df4565b34801561060257600080fd5b5061056a610e91565b34801561061757600080fd5b506103fc61271081565b61056a61062f3660046130df565b610eb8565b34801561064057600080fd5b506103fc6101695481565b34801561065757600080fd5b506103fc610f85565b34801561066c57600080fd5b5061012d5460ff166103d2565b34801561068557600080fd5b5061056a6106943660046132d0565b611039565b3480156106a557600080fd5b5061016454610442906001600160a01b031681565b3480156106c657600080fd5b506103fc6101605481565b3480156106dd57600080fd5b50610442733fd3a0c85b70754efc07ac9ac0cbbdce664865a681565b34801561070557600080fd5b5061056a61108e565b34801561071a57600080fd5b5061056a6110ad565b34801561072f57600080fd5b506103fc611126565b34801561074457600080fd5b506103fc6000805160206137b483398151915281565b34801561076657600080fd5b50610442735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d81565b34801561078e57600080fd5b5061056a61079d366004613185565b6111c2565b3480156107ae57600080fd5b506103d26107bd3660046130c4565b6112c3565b3480156107ce57600080fd5b5061056a61133b565b3480156107e357600080fd5b5061056a61138f565b3480156107f857600080fd5b506103fc7f71a9859d7dd21b24504a6f306077ffc2d510b4d4b61128e931fe937441ad183681565b34801561082c57600080fd5b5061056a6113ae565b34801561084157600080fd5b5061016554610442906001600160a01b031681565b34801561086257600080fd5b506103fc61016d5481565b34801561087957600080fd5b5061044261088836600461332e565b611414565b34801561089957600080fd5b506103fc6101675481565b3480156108b057600080fd5b506103d26108bf366004613302565b61142c565b3480156108d057600080fd5b506103fc611457565b3480156108e557600080fd5b506103fc60008051602061381b83398151915281565b34801561090757600080fd5b506103fc600081565b34801561091c57600080fd5b506040805160008082526020820152016103de565b34801561093d57600080fd5b506103fc6103e881565b34801561095357600080fd5b50610442737547d05dff1da6b4a2ebb3f0833afe3c62abd9a181565b34801561097b57600080fd5b506103fc61098a3660046132d0565b6114dc565b34801561099b57600080fd5b506103fc6101685481565b3480156109b257600080fd5b5061056a6114f3565b3480156109c757600080fd5b5061056a6109d63660046132d0565b611503565b3480156109e757600080fd5b5061056a6109f6366004613302565b611552565b348015610a0757600080fd5b5061016154610442906001600160a01b031681565b348015610a2857600080fd5b506103fc61016a5481565b348015610a3f57600080fd5b50610442731a05eb736873485655f29a37def8a0aa87f5a44781565b348015610a6757600080fd5b5061056a610a763660046130c4565b611577565b348015610a8757600080fd5b50610442610a963660046132d0565b6115e3565b348015610aa757600080fd5b5061056a610ab63660046132d0565b6115f4565b348015610ac757600080fd5b5061016354610442906001600160a01b031681565b60006001600160e01b03198216635a05180f60e01b1480610b015750610b0182611658565b92915050565b61016c8181548110610b1857600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610b3d8161168d565b612710610b4a848661368d565b14610b5457600080fd5b6103e8821115610b6357600080fd5b61016784905561016883905561016982905560408051858152602081018590529081018390527fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd9060600160405180910390a15060015b9392505050565b610163546001600160a01b03163314610bd957600080fd5b80610be357600080fd5b610beb611126565b811115610bf757600080fd5b600061271061016a5483610c0b91906136c7565b610c1591906136a5565b9050610c2181836136e6565b9150610c2c82611756565b5050565b600082815260c96020526040902060010154610c4b81611888565b610c558383611892565b505050565b6001600160a01b0381163314610ccf5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610c2c82826118b4565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610d225760405162461bcd60e51b8152600401610cc69061354b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d6b6000805160206137d4833981519152546001600160a01b031690565b6001600160a01b031614610d915760405162461bcd60e51b8152600401610cc690613597565b610d9a816118d6565b60408051600080825260208201909252610db691839190611904565b50565b610de27fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261168d565b610dea611a7e565b610df26114f3565b565b6000610dfe611acc565b4261015f541415610e0e57600080fd5b60008061015f5411610e21576000610e2f565b61015f54610e2f90426136e6565b4261015f559050600080610e41611b13565b60408051838152602081018890529081018290529296509350915033907fd36d015b8c4cd6e713194e4f2e8d3f4fc668064a37283a26e87c714ce78230349060600160405180910390a250505090565b610ea86000805160206137b483398151915261168d565b610eb0611bb2565b610df261138f565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610f015760405162461bcd60e51b8152600401610cc69061354b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f4a6000805160206137d4833981519152546001600160a01b031690565b6001600160a01b031614610f705760405162461bcd60e51b8152600401610cc690613597565b610f79826118d6565b610c2c82826001611904565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110255760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610cc6565b506000805160206137d48339815191525b90565b611043600061168d565b606481111561105157600080fd5b61016a8190556040518181527f3790aeee57809af98fad1b89b9266c7934e03ed46702b541f2fef6f1e89d6827906020015b60405180910390a150565b6110a560008051602061381b83398151915261168d565b610df2611c15565b6110c46000805160206137b483398151915261168d565b610161546110ea906000805160206137b4833981519152906001600160a01b03166118b4565b61016180546001600160a01b03191690556040517feaf2b442cd5e40fc7c4d20092b3f0d1bc2ea72bf451aa225a217a9719eed3fe990600090a1565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab91906132e9565b6111b3611457565b6111bd919061368d565b905090565b6111d960008051602061381b83398151915261168d565b733fd3a0c85b70754efc07ac9ac0cbbdce664865a66001600160a01b03168160008151811061120a5761120a613787565b60200260200101516001600160a01b031614801561127357507321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316816001835161125091906136e6565b8151811061126057611260613787565b60200260200101516001600160a01b0316145b6112af5760405162461bcd60e51b815260206004820152600d60248201526c12539590531251081253941555609a1b6044820152606401610cc6565b8051610c2c9061016c90602084019061301e565b60006112ce8161168d565b6001600160a01b0382166112e157600080fd5b61016480546001600160a01b0319166001600160a01b0384169081179091556040519081527f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d19060200160405180910390a1506001919050565b61135260008051602061381b83398151915261168d565b426101608190556040519081527fc014b2f908ff652c481d15b3bc4cd29550cd1ffffc53ad4365727847c03ee6d2906020015b60405180910390a1565b6113a66000805160206137b483398151915261168d565b610df2611d41565b6113c56000805160206137b483398151915261168d565b6113d46301e1338060646136c7565b6113de904261368d565b6101608190556040519081527ff8843fc247d173018cd96fde7c1717f82fafdc216c21ff715f9669cb2fa5e2bb90602001611385565b600082815260fb60205260408120610bba9083611d7f565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b8152306004820152600090735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d906370a082319060240160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd91906132e9565b600081815260fb60205260408120610b0190611d8b565b6114fb611acc565b610df2611d95565b61150d600061168d565b6103e881111561151c57600080fd5b6101668190556040518181527f2e59d502792bca3d730c472cd3acfbc16d0f9fe6ce0cddbdf0f80830251dfaca90602001611083565b600082815260c9602052604090206001015461156d81611888565b610c5583836118b4565b611581600061168d565b6001600160a01b03811661159457600080fd5b61016580546001600160a01b0319166001600160a01b0383169081179091556040519081527fa11c447ac90d9534769dc85d422963d67c1d8d899de887301417cedf4dec738d90602001611083565b61016b8181548110610b1857600080fd5b61271081111561161a576040516334b746e960e11b815260048101829052602401610cc6565b6116437fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261168d565b61016d55565b6001600160a01b03163b151590565b60006001600160e01b03198216637965db0b60e01b1480610b0157506301ffc9a760e01b6001600160e01b0319831614610b01565b610162546000805b828110156116f45761016281815481106116b1576116b1613787565b90600052602060002001548414156116cb578091506116f4565b6116d66001846136e6565b8114156116e257600080fd5b806116ec81613740565b915050611695565b5060005b81811161175057611727610162828154811061171657611716613787565b90600052602060002001543361142c565b1561173157611750565b8181141561173e57600080fd5b8061174881613740565b9150506116f8565b50505050565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b1580156117a357600080fd5b505afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db91906132e9565b90508181101561185b5760006117f182846136e6565b604051632e1a7d4d60e01b815260048101829052909150735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d90632e1a7d4d90602401600060405180830381600087803b15801561184157600080fd5b505af1158015611855573d6000803e3d6000fd5b50505050505b61016354610c2c90737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906001600160a01b031684611f60565b610db68133611fc3565b61189c8282612027565b600082815260fb60205260409020610c5590826120ad565b6118be82826120c2565b600082815260fb60205260409020610c559082612129565b6118e0600061168d565b42610708610160546118f2919061368d565b106118fc57600080fd5b610db66113ae565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561193757610c558361213e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561197057600080fd5b505afa9250505080156119a0575060408051601f3d908101601f1916820190925261199d918101906132e9565b60015b611a035760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610cc6565b6000805160206137d48339815191528114611a725760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610cc6565b50610c558383836121da565b611a866121ff565b61012d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001611385565b61012d5460ff1615610df25760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610cc6565b6040516331279d3d60e01b815260009081908190735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d906331279d3d90611b5590309061016b906004016134b9565b600060405180830381600087803b158015611b6f57600080fd5b505af1158015611b83573d6000803e3d6000fd5b50505050611b8f612249565b611b976125e3565b9250611ba1611126565b9150611bab61274c565b9050909192565b735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c0157600080fd5b505af1158015611750573d6000803e3d6000fd5b611c1d611b13565b505050735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c6f57600080fd5b505af1158015611c83573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009250737547d05dff1da6b4a2ebb3f0833afe3c62abd9a191506370a082319060240160206040518083038186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0c91906132e9565b90508015610db65761016354610db690737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906001600160a01b031683611f60565b611d49611acc565b61012d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ab43390565b6000610bba83836128ce565b6000610b01825490565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b158015611de257600080fd5b505afa158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a91906132e9565b90508015610db65760405163fc97a30360e01b8152737547d05dff1da6b4a2ebb3f0833afe3c62abd9a16004820152600090735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d9063fc97a3039060240160206040518083038186803b158015611e8357600080fd5b505afa158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906132e9565b9050611ef0737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d846128f8565b604051631c57762b60e31b81526004810183905260248101829052735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d9063e2bbb15890604401600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050505050565b6040516001600160a01b038316602482015260448101829052610c5590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526129b9565b611fcd828261142c565b610c2c57611fe5816001600160a01b03166014612a8b565b611ff0836020612a8b565b604051602001612001929190613444565b60408051601f198184030181529082905262461bcd60e51b8252610cc691600401613518565b612031828261142c565b610c2c57600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556120693390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610bba836001600160a01b038416612c27565b6120cc828261142c565b15610c2c57600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610bba836001600160a01b038416612c76565b6001600160a01b0381163b6121ab5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610cc6565b6000805160206137d483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6121e383612d69565b6000825111806121f05750805b15610c55576117508383612da9565b61012d5460ff16610df25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610cc6565b6040516370a0823160e01b8152306004820152733fd3a0c85b70754efc07ac9ac0cbbdce664865a69060009082906370a082319060240160206040518083038186803b15801561229857600080fd5b505afa1580156122ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d091906132e9565b61016c549091506002118015906122e75750600081115b15610c2c576123146001600160a01b038316731a05eb736873485655f29a37def8a0aa87f5a447836128f8565b604051635e1e632560e01b815260048101829052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527321be370d5312f44cb42ce377bc9b8a0cef1a4c836044820152731a05eb736873485655f29a37def8a0aa87f5a447906000908290635e1e632590606401604080518083038186803b15801561239757600080fd5b505afa1580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf919061337a565b60408051600180825281830190925291935060009250816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816123ea5790505090506040518060600160405280733fd3a0c85b70754efc07ac9ac0cbbdce664865a66001600160a01b031681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031681526020018315158152508160008151811061248357612483613787565b60200260200101819052506000836001600160a01b0316639881fcb486846040518363ffffffff1660e01b81526004016124be9291906135e3565b60006040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125129190810190613229565b9050600061271061016d548360018151811061253057612530613787565b602002602001015161254291906136c7565b61254c91906136a5565b604051631e82ecdb60e31b81529091506001600160a01b0386169063f41766d89061258390899085908890309042906004016135fc565b600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d99190810190613229565b5050505050505050565b610166546040516370a0823160e01b81523060048201526000917321be370d5312f44cb42ce377bc9b8a0cef1a4c839183916127109184906370a082319060240160206040518083038186803b15801561263c57600080fd5b505afa158015612650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267491906132e9565b61267e91906136c7565b61268891906136a5565b905080156127475761271061016754826126a291906136c7565b6126ac91906136a5565b9250600061271061016854836126c291906136c7565b6126cc91906136a5565b9050600061271061016954836126e291906136c7565b6126ec91906136a5565b90506126f881836136e6565b915061270e6001600160a01b0385163387611f60565b61016454612729906001600160a01b03868116911684611f60565b61016554612744906001600160a01b03868116911683611f60565b50505b505090565b6040516370a0823160e01b81523060048201526000907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906370a082319060240160206040518083038186803b15801561279957600080fd5b505afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d191906132e9565b90508015611036576101635460405163095ea7b360e01b81526001600160a01b039091166004820152602481018290527321be370d5312f44cb42ce377bc9b8a0cef1a4c839063095ea7b390604401602060405180830381600087803b15801561283a57600080fd5b505af115801561284e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287291906132b5565b5061016354604051639f20b31f60e01b8152600481018390526001600160a01b0390911690639f20b31f90602401600060405180830381600087803b1580156128ba57600080fd5b505af1158015612744573d6000803e3d6000fd5b60008260000182815481106128e5576128e5613787565b9060005260206000200154905092915050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561294457600080fd5b505afa158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c91906132e9565b612986919061368d565b6040516001600160a01b03851660248201526044810182905290915061175090859063095ea7b360e01b90606401611f8c565b6000612a0e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e9d9092919063ffffffff16565b805190915015610c555780806020019051810190612a2c91906132b5565b610c555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc6565b60606000612a9a8360026136c7565b612aa590600261368d565b67ffffffffffffffff811115612abd57612abd61379d565b6040519080825280601f01601f191660200182016040528015612ae7576020820181803683370190505b509050600360fc1b81600081518110612b0257612b02613787565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b3157612b31613787565b60200101906001600160f81b031916908160001a9053506000612b558460026136c7565b612b6090600161368d565b90505b6001811115612bd8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b9457612b94613787565b1a60f81b828281518110612baa57612baa613787565b60200101906001600160f81b031916908160001a90535060049490941c93612bd181613729565b9050612b63565b508315610bba5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cc6565b6000818152600183016020526040812054612c6e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b01565b506000610b01565b60008181526001830160205260408120548015612d5f576000612c9a6001836136e6565b8554909150600090612cae906001906136e6565b9050818114612d13576000866000018281548110612cce57612cce613787565b9060005260206000200154905080876000018481548110612cf157612cf1613787565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d2457612d24613771565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b01565b6000915050610b01565b612d728161213e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b612e115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610cc6565b600080846001600160a01b031684604051612e2c9190613428565b600060405180830381855af49150503d8060008114612e67576040519150601f19603f3d011682016040523d82523d6000602084013e612e6c565b606091505b5091509150612e9482826040518060600160405280602781526020016137f460279139612eb4565b95945050505050565b6060612eac8484600085612eed565b949350505050565b60608315612ec3575081610bba565b825115612ed35782518084602001fd5b8160405162461bcd60e51b8152600401610cc69190613518565b606082471015612f4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc6565b6001600160a01b0385163b612fa55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc6565b600080866001600160a01b03168587604051612fc19190613428565b60006040518083038185875af1925050503d8060008114612ffe576040519150601f19603f3d011682016040523d82523d6000602084013e613003565b606091505b5091509150613013828286612eb4565b979650505050505050565b828054828255906000526020600020908101928215613073579160200282015b8281111561307357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061303e565b5061307f929150613083565b5090565b5b8082111561307f5760008155600101613084565b80356001600160a01b03811681146130af57600080fd5b919050565b805180151581146130af57600080fd5b6000602082840312156130d657600080fd5b610bba82613098565b600080604083850312156130f257600080fd5b6130fb83613098565b915060208084013567ffffffffffffffff8082111561311957600080fd5b818601915086601f83011261312d57600080fd5b81358181111561313f5761313f61379d565b613151601f8201601f19168501613638565b9150808252878482850101111561316757600080fd5b80848401858401376000848284010152508093505050509250929050565b6000602080838503121561319857600080fd5b823567ffffffffffffffff8111156131af57600080fd5b8301601f810185136131c057600080fd5b80356131d36131ce82613669565b613638565b80828252848201915084840188868560051b87010111156131f357600080fd5b600094505b8385101561321d5761320981613098565b8352600194909401939185019185016131f8565b50979650505050505050565b6000602080838503121561323c57600080fd5b825167ffffffffffffffff81111561325357600080fd5b8301601f8101851361326457600080fd5b80516132726131ce82613669565b80828252848201915084840188868560051b870101111561329257600080fd5b600094505b8385101561321d578051835260019490940193918501918501613297565b6000602082840312156132c757600080fd5b610bba826130b4565b6000602082840312156132e257600080fd5b5035919050565b6000602082840312156132fb57600080fd5b5051919050565b6000806040838503121561331557600080fd5b8235915061332560208401613098565b90509250929050565b6000806040838503121561334157600080fd5b50508035926020909101359150565b60006020828403121561336257600080fd5b81356001600160e01b031981168114610bba57600080fd5b6000806040838503121561338d57600080fd5b82519150613325602084016130b4565b6000806000606084860312156133b257600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b8381101561341d57815180516001600160a01b039081168952848201511684890152604090810151151590880152606090960195908201906001016133dd565b509495945050505050565b6000825161343a8184602087016136fd565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161347c8160178501602088016136fd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516134ad8160288401602088016136fd565b01602801949350505050565b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b8181101561350a5785548516835260019586019592840192016134ec565b509098975050505050505050565b60208152600082518060208401526135378160408501602087016136fd565b601f01601f19169190910160400192915050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b828152604060208201526000612eac60408301846133c9565b85815284602082015260a06040820152600061361b60a08301866133c9565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156136615761366161379d565b604052919050565b600067ffffffffffffffff8211156136835761368361379d565b5060051b60200190565b600082198211156136a0576136a061375b565b500190565b6000826136c257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156136e1576136e161375b565b500290565b6000828210156136f8576136f861375b565b500390565b60005b83811015613718578181015183820152602001613700565b838111156117505750506000910152565b6000816137385761373861375b565b506000190190565b60006000198214156137545761375461375b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe8b5b16d04624687fcf0d0228f19993c9157c1ed07b41d8d430fd9100eb099fe8360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564b17d0a42cc710456bf9c3efb785dcd0cb93a0ac358113307b5c64b285b516b5ca2646970667358221220d98914cb77e2e006f8043794331a700c5ae0cfb7200929b6d7b6c8800d4ca68b64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c80637651b1e6116101e7578063b29d404b1161010d578063d5f39488116100a0578063ecf173ff1161006f578063ecf173ff14610931578063f301af4214610a7b578063f896acc714610a9b578063fbfa77cf14610abb57600080fd5b8063d5f39488146109fb578063d68e130214610a1c578063db8426a814610a33578063e46257d214610a5b57600080fd5b8063cc32d176116100dc578063cc32d1761461098f578063d0e30db0146109a6578063d32b9604146109bb578063d547741f146109db57600080fd5b8063b29d404b14610910578063bc063e1a14610931578063bfd9041b14610947578063ca15c8731461096f57600080fd5b80638888f9f61161018557806391d148541161015457806391d14854146108a45780639aa9645f146108c45780639cfdede3146108d9578063a217fddf146108fb57600080fd5b80638888f9f6146108355780638c04166f146108565780639010d07c1461086d57806390321e1a1461088d57600080fd5b806382b0b175116101c157806382b0b175146107c25780638456cb59146107d7578063862a179e146107ec578063888799851461082057600080fd5b80637651b1e61461075a57806378d21fc2146107825780637f51bb1f146107a257600080fd5b80633f4ba83a116102d7578063615911491161026a5780636ba1b3e0116102395780636ba1b3e0146106f95780636f33a0031461070e578063722713f714610723578063724c184c1461073857600080fd5b8063615911491461067957806361d027b314610699578063651eebfe146106ba5780636586ba6f146106d157600080fd5b80634f1ef286116102a65780634f1ef28614610621578063526e10801461063457806352d1902d1461064b5780635c975abb1461066057600080fd5b80633f4ba83a146105cc5780634641257d146105e15780634700d305146105f65780634870dd9a1461060b57600080fd5b80632257a7381161034f5780632e1a7d4d1161031e5780632e1a7d4d1461054a5780632f2ff15d1461056c57806336568abe1461058c5780633659cfe6146105ac57600080fd5b80632257a738146104b9578063248a9ca3146104d057806325ed32ca146105005780632a0acc6a1461051657600080fd5b80631aa0e5481161038b5780631aa0e548146104225780631df4ccfc1461045a57806321dbe87614610471578063224290851461049957600080fd5b806301ffc9a7146103b257806313c6c475146103e757806316d3bfbb1461040a575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613350565b610adc565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc606481565b6040519081526020016103de565b34801561041657600080fd5b506103fc6301e1338081565b34801561042e57600080fd5b5061044261043d3660046132d0565b610b07565b6040516001600160a01b0390911681526020016103de565b34801561046657600080fd5b506103fc6101665481565b34801561047d57600080fd5b506104427321be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b3480156104a557600080fd5b506103d26104b436600461339d565b610b32565b3480156104c557600080fd5b506103fc61015f5481565b3480156104dc57600080fd5b506103fc6104eb3660046132d0565b600090815260c9602052604090206001015490565b34801561050c57600080fd5b506103fc61070881565b34801561052257600080fd5b506103fc7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b34801561055657600080fd5b5061056a6105653660046132d0565b610bc1565b005b34801561057857600080fd5b5061056a610587366004613302565b610c30565b34801561059857600080fd5b5061056a6105a7366004613302565b610c5a565b3480156105b857600080fd5b5061056a6105c73660046130c4565b610cd9565b3480156105d857600080fd5b5061056a610db9565b3480156105ed57600080fd5b506103fc610df4565b34801561060257600080fd5b5061056a610e91565b34801561061757600080fd5b506103fc61271081565b61056a61062f3660046130df565b610eb8565b34801561064057600080fd5b506103fc6101695481565b34801561065757600080fd5b506103fc610f85565b34801561066c57600080fd5b5061012d5460ff166103d2565b34801561068557600080fd5b5061056a6106943660046132d0565b611039565b3480156106a557600080fd5b5061016454610442906001600160a01b031681565b3480156106c657600080fd5b506103fc6101605481565b3480156106dd57600080fd5b50610442733fd3a0c85b70754efc07ac9ac0cbbdce664865a681565b34801561070557600080fd5b5061056a61108e565b34801561071a57600080fd5b5061056a6110ad565b34801561072f57600080fd5b506103fc611126565b34801561074457600080fd5b506103fc6000805160206137b483398151915281565b34801561076657600080fd5b50610442735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d81565b34801561078e57600080fd5b5061056a61079d366004613185565b6111c2565b3480156107ae57600080fd5b506103d26107bd3660046130c4565b6112c3565b3480156107ce57600080fd5b5061056a61133b565b3480156107e357600080fd5b5061056a61138f565b3480156107f857600080fd5b506103fc7f71a9859d7dd21b24504a6f306077ffc2d510b4d4b61128e931fe937441ad183681565b34801561082c57600080fd5b5061056a6113ae565b34801561084157600080fd5b5061016554610442906001600160a01b031681565b34801561086257600080fd5b506103fc61016d5481565b34801561087957600080fd5b5061044261088836600461332e565b611414565b34801561089957600080fd5b506103fc6101675481565b3480156108b057600080fd5b506103d26108bf366004613302565b61142c565b3480156108d057600080fd5b506103fc611457565b3480156108e557600080fd5b506103fc60008051602061381b83398151915281565b34801561090757600080fd5b506103fc600081565b34801561091c57600080fd5b506040805160008082526020820152016103de565b34801561093d57600080fd5b506103fc6103e881565b34801561095357600080fd5b50610442737547d05dff1da6b4a2ebb3f0833afe3c62abd9a181565b34801561097b57600080fd5b506103fc61098a3660046132d0565b6114dc565b34801561099b57600080fd5b506103fc6101685481565b3480156109b257600080fd5b5061056a6114f3565b3480156109c757600080fd5b5061056a6109d63660046132d0565b611503565b3480156109e757600080fd5b5061056a6109f6366004613302565b611552565b348015610a0757600080fd5b5061016154610442906001600160a01b031681565b348015610a2857600080fd5b506103fc61016a5481565b348015610a3f57600080fd5b50610442731a05eb736873485655f29a37def8a0aa87f5a44781565b348015610a6757600080fd5b5061056a610a763660046130c4565b611577565b348015610a8757600080fd5b50610442610a963660046132d0565b6115e3565b348015610aa757600080fd5b5061056a610ab63660046132d0565b6115f4565b348015610ac757600080fd5b5061016354610442906001600160a01b031681565b60006001600160e01b03198216635a05180f60e01b1480610b015750610b0182611658565b92915050565b61016c8181548110610b1857600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610b3d8161168d565b612710610b4a848661368d565b14610b5457600080fd5b6103e8821115610b6357600080fd5b61016784905561016883905561016982905560408051858152602081018590529081018390527fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd9060600160405180910390a15060015b9392505050565b610163546001600160a01b03163314610bd957600080fd5b80610be357600080fd5b610beb611126565b811115610bf757600080fd5b600061271061016a5483610c0b91906136c7565b610c1591906136a5565b9050610c2181836136e6565b9150610c2c82611756565b5050565b600082815260c96020526040902060010154610c4b81611888565b610c558383611892565b505050565b6001600160a01b0381163314610ccf5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610c2c82826118b4565b306001600160a01b037f0000000000000000000000007f5dc0a5a07ec4684113d42456b924e1b18577ce161415610d225760405162461bcd60e51b8152600401610cc69061354b565b7f0000000000000000000000007f5dc0a5a07ec4684113d42456b924e1b18577ce6001600160a01b0316610d6b6000805160206137d4833981519152546001600160a01b031690565b6001600160a01b031614610d915760405162461bcd60e51b8152600401610cc690613597565b610d9a816118d6565b60408051600080825260208201909252610db691839190611904565b50565b610de27fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261168d565b610dea611a7e565b610df26114f3565b565b6000610dfe611acc565b4261015f541415610e0e57600080fd5b60008061015f5411610e21576000610e2f565b61015f54610e2f90426136e6565b4261015f559050600080610e41611b13565b60408051838152602081018890529081018290529296509350915033907fd36d015b8c4cd6e713194e4f2e8d3f4fc668064a37283a26e87c714ce78230349060600160405180910390a250505090565b610ea86000805160206137b483398151915261168d565b610eb0611bb2565b610df261138f565b306001600160a01b037f0000000000000000000000007f5dc0a5a07ec4684113d42456b924e1b18577ce161415610f015760405162461bcd60e51b8152600401610cc69061354b565b7f0000000000000000000000007f5dc0a5a07ec4684113d42456b924e1b18577ce6001600160a01b0316610f4a6000805160206137d4833981519152546001600160a01b031690565b6001600160a01b031614610f705760405162461bcd60e51b8152600401610cc690613597565b610f79826118d6565b610c2c82826001611904565b6000306001600160a01b037f0000000000000000000000007f5dc0a5a07ec4684113d42456b924e1b18577ce16146110255760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610cc6565b506000805160206137d48339815191525b90565b611043600061168d565b606481111561105157600080fd5b61016a8190556040518181527f3790aeee57809af98fad1b89b9266c7934e03ed46702b541f2fef6f1e89d6827906020015b60405180910390a150565b6110a560008051602061381b83398151915261168d565b610df2611c15565b6110c46000805160206137b483398151915261168d565b610161546110ea906000805160206137b4833981519152906001600160a01b03166118b4565b61016180546001600160a01b03191690556040517feaf2b442cd5e40fc7c4d20092b3f0d1bc2ea72bf451aa225a217a9719eed3fe990600090a1565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab91906132e9565b6111b3611457565b6111bd919061368d565b905090565b6111d960008051602061381b83398151915261168d565b733fd3a0c85b70754efc07ac9ac0cbbdce664865a66001600160a01b03168160008151811061120a5761120a613787565b60200260200101516001600160a01b031614801561127357507321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316816001835161125091906136e6565b8151811061126057611260613787565b60200260200101516001600160a01b0316145b6112af5760405162461bcd60e51b815260206004820152600d60248201526c12539590531251081253941555609a1b6044820152606401610cc6565b8051610c2c9061016c90602084019061301e565b60006112ce8161168d565b6001600160a01b0382166112e157600080fd5b61016480546001600160a01b0319166001600160a01b0384169081179091556040519081527f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d19060200160405180910390a1506001919050565b61135260008051602061381b83398151915261168d565b426101608190556040519081527fc014b2f908ff652c481d15b3bc4cd29550cd1ffffc53ad4365727847c03ee6d2906020015b60405180910390a1565b6113a66000805160206137b483398151915261168d565b610df2611d41565b6113c56000805160206137b483398151915261168d565b6113d46301e1338060646136c7565b6113de904261368d565b6101608190556040519081527ff8843fc247d173018cd96fde7c1717f82fafdc216c21ff715f9669cb2fa5e2bb90602001611385565b600082815260fb60205260408120610bba9083611d7f565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b8152306004820152600090735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d906370a082319060240160206040518083038186803b1580156114a457600080fd5b505afa1580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bd91906132e9565b600081815260fb60205260408120610b0190611d8b565b6114fb611acc565b610df2611d95565b61150d600061168d565b6103e881111561151c57600080fd5b6101668190556040518181527f2e59d502792bca3d730c472cd3acfbc16d0f9fe6ce0cddbdf0f80830251dfaca90602001611083565b600082815260c9602052604090206001015461156d81611888565b610c5583836118b4565b611581600061168d565b6001600160a01b03811661159457600080fd5b61016580546001600160a01b0319166001600160a01b0383169081179091556040519081527fa11c447ac90d9534769dc85d422963d67c1d8d899de887301417cedf4dec738d90602001611083565b61016b8181548110610b1857600080fd5b61271081111561161a576040516334b746e960e11b815260048101829052602401610cc6565b6116437fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261168d565b61016d55565b6001600160a01b03163b151590565b60006001600160e01b03198216637965db0b60e01b1480610b0157506301ffc9a760e01b6001600160e01b0319831614610b01565b610162546000805b828110156116f45761016281815481106116b1576116b1613787565b90600052602060002001548414156116cb578091506116f4565b6116d66001846136e6565b8114156116e257600080fd5b806116ec81613740565b915050611695565b5060005b81811161175057611727610162828154811061171657611716613787565b90600052602060002001543361142c565b1561173157611750565b8181141561173e57600080fd5b8061174881613740565b9150506116f8565b50505050565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b1580156117a357600080fd5b505afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db91906132e9565b90508181101561185b5760006117f182846136e6565b604051632e1a7d4d60e01b815260048101829052909150735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d90632e1a7d4d90602401600060405180830381600087803b15801561184157600080fd5b505af1158015611855573d6000803e3d6000fd5b50505050505b61016354610c2c90737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906001600160a01b031684611f60565b610db68133611fc3565b61189c8282612027565b600082815260fb60205260409020610c5590826120ad565b6118be82826120c2565b600082815260fb60205260409020610c559082612129565b6118e0600061168d565b42610708610160546118f2919061368d565b106118fc57600080fd5b610db66113ae565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561193757610c558361213e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561197057600080fd5b505afa9250505080156119a0575060408051601f3d908101601f1916820190925261199d918101906132e9565b60015b611a035760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610cc6565b6000805160206137d48339815191528114611a725760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610cc6565b50610c558383836121da565b611a866121ff565b61012d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001611385565b61012d5460ff1615610df25760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610cc6565b6040516331279d3d60e01b815260009081908190735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d906331279d3d90611b5590309061016b906004016134b9565b600060405180830381600087803b158015611b6f57600080fd5b505af1158015611b83573d6000803e3d6000fd5b50505050611b8f612249565b611b976125e3565b9250611ba1611126565b9150611bab61274c565b9050909192565b735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c0157600080fd5b505af1158015611750573d6000803e3d6000fd5b611c1d611b13565b505050735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d6001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c6f57600080fd5b505af1158015611c83573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009250737547d05dff1da6b4a2ebb3f0833afe3c62abd9a191506370a082319060240160206040518083038186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0c91906132e9565b90508015610db65761016354610db690737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906001600160a01b031683611f60565b611d49611acc565b61012d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ab43390565b6000610bba83836128ce565b6000610b01825490565b6040516370a0823160e01b8152306004820152600090737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1906370a082319060240160206040518083038186803b158015611de257600080fd5b505afa158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a91906132e9565b90508015610db65760405163fc97a30360e01b8152737547d05dff1da6b4a2ebb3f0833afe3c62abd9a16004820152600090735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d9063fc97a3039060240160206040518083038186803b158015611e8357600080fd5b505afa158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906132e9565b9050611ef0737547d05dff1da6b4a2ebb3f0833afe3c62abd9a1735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d846128f8565b604051631c57762b60e31b81526004810183905260248101829052735e689d7fb26ffc4bd615c98c8517a18ef1f5e68d9063e2bbb15890604401600060405180830381600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050505050565b6040516001600160a01b038316602482015260448101829052610c5590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526129b9565b611fcd828261142c565b610c2c57611fe5816001600160a01b03166014612a8b565b611ff0836020612a8b565b604051602001612001929190613444565b60408051601f198184030181529082905262461bcd60e51b8252610cc691600401613518565b612031828261142c565b610c2c57600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556120693390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610bba836001600160a01b038416612c27565b6120cc828261142c565b15610c2c57600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610bba836001600160a01b038416612c76565b6001600160a01b0381163b6121ab5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610cc6565b6000805160206137d483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6121e383612d69565b6000825111806121f05750805b15610c55576117508383612da9565b61012d5460ff16610df25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610cc6565b6040516370a0823160e01b8152306004820152733fd3a0c85b70754efc07ac9ac0cbbdce664865a69060009082906370a082319060240160206040518083038186803b15801561229857600080fd5b505afa1580156122ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d091906132e9565b61016c549091506002118015906122e75750600081115b15610c2c576123146001600160a01b038316731a05eb736873485655f29a37def8a0aa87f5a447836128f8565b604051635e1e632560e01b815260048101829052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527321be370d5312f44cb42ce377bc9b8a0cef1a4c836044820152731a05eb736873485655f29a37def8a0aa87f5a447906000908290635e1e632590606401604080518083038186803b15801561239757600080fd5b505afa1580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf919061337a565b60408051600180825281830190925291935060009250816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816123ea5790505090506040518060600160405280733fd3a0c85b70754efc07ac9ac0cbbdce664865a66001600160a01b031681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031681526020018315158152508160008151811061248357612483613787565b60200260200101819052506000836001600160a01b0316639881fcb486846040518363ffffffff1660e01b81526004016124be9291906135e3565b60006040518083038186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125129190810190613229565b9050600061271061016d548360018151811061253057612530613787565b602002602001015161254291906136c7565b61254c91906136a5565b604051631e82ecdb60e31b81529091506001600160a01b0386169063f41766d89061258390899085908890309042906004016135fc565b600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d99190810190613229565b5050505050505050565b610166546040516370a0823160e01b81523060048201526000917321be370d5312f44cb42ce377bc9b8a0cef1a4c839183916127109184906370a082319060240160206040518083038186803b15801561263c57600080fd5b505afa158015612650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267491906132e9565b61267e91906136c7565b61268891906136a5565b905080156127475761271061016754826126a291906136c7565b6126ac91906136a5565b9250600061271061016854836126c291906136c7565b6126cc91906136a5565b9050600061271061016954836126e291906136c7565b6126ec91906136a5565b90506126f881836136e6565b915061270e6001600160a01b0385163387611f60565b61016454612729906001600160a01b03868116911684611f60565b61016554612744906001600160a01b03868116911683611f60565b50505b505090565b6040516370a0823160e01b81523060048201526000907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906370a082319060240160206040518083038186803b15801561279957600080fd5b505afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d191906132e9565b90508015611036576101635460405163095ea7b360e01b81526001600160a01b039091166004820152602481018290527321be370d5312f44cb42ce377bc9b8a0cef1a4c839063095ea7b390604401602060405180830381600087803b15801561283a57600080fd5b505af115801561284e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287291906132b5565b5061016354604051639f20b31f60e01b8152600481018390526001600160a01b0390911690639f20b31f90602401600060405180830381600087803b1580156128ba57600080fd5b505af1158015612744573d6000803e3d6000fd5b60008260000182815481106128e5576128e5613787565b9060005260206000200154905092915050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561294457600080fd5b505afa158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c91906132e9565b612986919061368d565b6040516001600160a01b03851660248201526044810182905290915061175090859063095ea7b360e01b90606401611f8c565b6000612a0e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e9d9092919063ffffffff16565b805190915015610c555780806020019051810190612a2c91906132b5565b610c555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc6565b60606000612a9a8360026136c7565b612aa590600261368d565b67ffffffffffffffff811115612abd57612abd61379d565b6040519080825280601f01601f191660200182016040528015612ae7576020820181803683370190505b509050600360fc1b81600081518110612b0257612b02613787565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b3157612b31613787565b60200101906001600160f81b031916908160001a9053506000612b558460026136c7565b612b6090600161368d565b90505b6001811115612bd8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b9457612b94613787565b1a60f81b828281518110612baa57612baa613787565b60200101906001600160f81b031916908160001a90535060049490941c93612bd181613729565b9050612b63565b508315610bba5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cc6565b6000818152600183016020526040812054612c6e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b01565b506000610b01565b60008181526001830160205260408120548015612d5f576000612c9a6001836136e6565b8554909150600090612cae906001906136e6565b9050818114612d13576000866000018281548110612cce57612cce613787565b9060005260206000200154905080876000018481548110612cf157612cf1613787565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612d2457612d24613771565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b01565b6000915050610b01565b612d728161213e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b612e115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610cc6565b600080846001600160a01b031684604051612e2c9190613428565b600060405180830381855af49150503d8060008114612e67576040519150601f19603f3d011682016040523d82523d6000602084013e612e6c565b606091505b5091509150612e9482826040518060600160405280602781526020016137f460279139612eb4565b95945050505050565b6060612eac8484600085612eed565b949350505050565b60608315612ec3575081610bba565b825115612ed35782518084602001fd5b8160405162461bcd60e51b8152600401610cc69190613518565b606082471015612f4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc6565b6001600160a01b0385163b612fa55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc6565b600080866001600160a01b03168587604051612fc19190613428565b60006040518083038185875af1925050503d8060008114612ffe576040519150601f19603f3d011682016040523d82523d6000602084013e613003565b606091505b5091509150613013828286612eb4565b979650505050505050565b828054828255906000526020600020908101928215613073579160200282015b8281111561307357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061303e565b5061307f929150613083565b5090565b5b8082111561307f5760008155600101613084565b80356001600160a01b03811681146130af57600080fd5b919050565b805180151581146130af57600080fd5b6000602082840312156130d657600080fd5b610bba82613098565b600080604083850312156130f257600080fd5b6130fb83613098565b915060208084013567ffffffffffffffff8082111561311957600080fd5b818601915086601f83011261312d57600080fd5b81358181111561313f5761313f61379d565b613151601f8201601f19168501613638565b9150808252878482850101111561316757600080fd5b80848401858401376000848284010152508093505050509250929050565b6000602080838503121561319857600080fd5b823567ffffffffffffffff8111156131af57600080fd5b8301601f810185136131c057600080fd5b80356131d36131ce82613669565b613638565b80828252848201915084840188868560051b87010111156131f357600080fd5b600094505b8385101561321d5761320981613098565b8352600194909401939185019185016131f8565b50979650505050505050565b6000602080838503121561323c57600080fd5b825167ffffffffffffffff81111561325357600080fd5b8301601f8101851361326457600080fd5b80516132726131ce82613669565b80828252848201915084840188868560051b870101111561329257600080fd5b600094505b8385101561321d578051835260019490940193918501918501613297565b6000602082840312156132c757600080fd5b610bba826130b4565b6000602082840312156132e257600080fd5b5035919050565b6000602082840312156132fb57600080fd5b5051919050565b6000806040838503121561331557600080fd5b8235915061332560208401613098565b90509250929050565b6000806040838503121561334157600080fd5b50508035926020909101359150565b60006020828403121561336257600080fd5b81356001600160e01b031981168114610bba57600080fd5b6000806040838503121561338d57600080fd5b82519150613325602084016130b4565b6000806000606084860312156133b257600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b8381101561341d57815180516001600160a01b039081168952848201511684890152604090810151151590880152606090960195908201906001016133dd565b509495945050505050565b6000825161343a8184602087016136fd565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161347c8160178501602088016136fd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516134ad8160288401602088016136fd565b01602801949350505050565b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b8181101561350a5785548516835260019586019592840192016134ec565b509098975050505050505050565b60208152600082518060208401526135378160408501602087016136fd565b601f01601f19169190910160400192915050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b828152604060208201526000612eac60408301846133c9565b85815284602082015260a06040820152600061361b60a08301866133c9565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156136615761366161379d565b604052919050565b600067ffffffffffffffff8211156136835761368361379d565b5060051b60200190565b600082198211156136a0576136a061375b565b500190565b6000826136c257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156136e1576136e161375b565b500290565b6000828210156136f8576136f861375b565b500390565b60005b83811015613718578181015183820152602001613700565b838111156117505750506000910152565b6000816137385761373861375b565b506000190190565b60006000198214156137545761375461375b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe8b5b16d04624687fcf0d0228f19993c9157c1ed07b41d8d430fd9100eb099fe8360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564b17d0a42cc710456bf9c3efb785dcd0cb93a0ac358113307b5c64b285b516b5ca2646970667358221220d98914cb77e2e006f8043794331a700c5ae0cfb7200929b6d7b6c8800d4ca68b64736f6c63430008070033
Deployed Bytecode Sourcemap
41306:4999:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17267:219;;;;;;;;;;-1:-1:-1;17267:219:0;;;;;:::i;:::-;;:::i;:::-;;;9057:14:1;;9050:22;9032:41;;9020:2;9005:18;17267:219:0;;;;;;;;26449:46;;;;;;;;;;;;26492:3;26449:46;;;;;9230:25:1;;;9218:2;9203:18;26449:46:0;9084:177:1;25812:43:0;;;;;;;;;;;;25847:8;25812:43;;41941:32;;;;;;;;;;-1:-1:-1;41941:32:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7473:32:1;;;7455:51;;7443:2;7428:18;41941:32:0;7309:203:1;26556:23:0;;;;;;;;;;;;;;;;41554:82;;;;;;;;;;;;41593:42;41554:82;;29936:438;;;;;;;;;;-1:-1:-1;29936:438:0;;;;;:::i;:::-;;:::i;25922:35::-;;;;;;;;;;;;;;;;11061:125;;;;;;;;;;-1:-1:-1;11061:125:0;;;;;:::i;:::-;11135:7;11158:12;;;:6;:12;;;;;:22;;;;11061:125;25862:53;;;;;;;;;;;;25905:10;25862:53;;26218:50;;;;;;;;;;;;26250:18;26218:50;;28421:288;;;;;;;;;;-1:-1:-1;28421:288:0;;;;;:::i;:::-;;:::i;:::-;;11192:141;;;;;;;;;;-1:-1:-1;11192:141:0;;;;;:::i;:::-;;:::i;11488:208::-;;;;;;;;;;-1:-1:-1;11488:208:0;;;;;:::i;:::-;;:::i;24000:190::-;;;;;;;;;;-1:-1:-1;24000:190:0;;;;;:::i;:::-;;:::i;29625:102::-;;;;;;;;;;;;;:::i;28715:513::-;;;;;;;;;;;;;:::i;29419:111::-;;;;;;;;;;;;;:::i;25757:48::-;;;;;;;;;;;;25799:6;25757:48;;24196:215;;;;;;:::i;:::-;;:::i;26642:28::-;;;;;;;;;;;;;;;;23867:127;;;;;;;;;;;;;:::i;25040:80::-;;;;;;;;;;-1:-1:-1;25107:7:0;;;;25040:80;;30380:227;;;;;;;;;;-1:-1:-1;30380:227:0;;;;;:::i;:::-;;:::i;26338:23::-;;;;;;;;;;-1:-1:-1;26338:23:0;;;;-1:-1:-1;;;;;26338:23:0;;;25964:34;;;;;;;;;;;;;;;;41641:83;;;;;;;;;;;;41681:42;41641:83;;29308:105;;;;;;;;;;;;;:::i;31739:163::-;;;;;;;;;;;;;:::i;44993:151::-;;;;;;;;;;;;;:::i;26157:56::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26157:56:0;;41729:83;;;;;;;;;;;;41769:42;41729:83;;45654:213;;;;;;;;;;-1:-1:-1;45654:213:0;;;;;:::i;:::-;;:::i;30613:242::-;;;;;;;;;;-1:-1:-1;30613:242:0;;;;;:::i;:::-;;:::i;31150:181::-;;;;;;;;;;;;;:::i;29536:83::-;;;;;;;;;;;;;:::i;26035:52::-;;;;;;;;;;;;26068:19;26035:52;;31337:190;;;;;;;;;;;;;:::i;26366:33::-;;;;;;;;;;-1:-1:-1;26366:33:0;;;;-1:-1:-1;;;;;26366:33:0;;;41980:26;;;;;;;;;;;;;;;;17492:147;;;;;;;;;;-1:-1:-1;17492:147:0;;;;;:::i;:::-;;:::i;26584:22::-;;;;;;;;;;;;;;;;10382:141;;;;;;;;;;-1:-1:-1;10382:141:0;;;;;:::i;:::-;;:::i;45150:123::-;;;;;;;;;;;;;:::i;26092:60::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26092:60:0;;10036:49;;;;;;;;;;-1:-1:-1;10036:49:0;10081:4;10036:49;;45873:100;;;;;;;;;;-1:-1:-1;45873:100:0;;;45932:14;16664:25:1;;;16720:2;16705:18;;16698:34;16637:18;45873:100:0;16490:248:1;26406:38:0;;;;;;;;;;;;26440:4;26406:38;;41817:86;;;;;;;;;;;;41860:42;41817:86;;17645:136;;;;;;;;;;-1:-1:-1;17645:136:0;;;;;:::i;:::-;;:::i;26611:26::-;;;;;;;;;;;;;;;;28343:72;;;;;;;;;;;;;:::i;29733:197::-;;;;;;;;;;-1:-1:-1;29733:197:0;;;;;:::i;:::-;;:::i;11339:143::-;;;;;;;;;;-1:-1:-1;11339:143:0;;;;;:::i;:::-;;:::i;26005:23::-;;;;;;;;;;-1:-1:-1;26005:23:0;;;;-1:-1:-1;;;;;26005:23:0;;;26675:26;;;;;;;;;;;;;;;;41453:94;;;;;;;;;;;;41504:42;41453:94;;30861:283;;;;;;;;;;-1:-1:-1;30861:283:0;;;;;:::i;:::-;;:::i;41910:24::-;;;;;;;;;;-1:-1:-1;41910:24:0;;;;;:::i;:::-;;:::i;45389:259::-;;;;;;;;;;-1:-1:-1;45389:259:0;;;;;:::i;:::-;;:::i;26313:20::-;;;;;;;;;;-1:-1:-1;26313:20:0;;;;-1:-1:-1;;;;;26313:20:0;;;17267:219;17352:4;-1:-1:-1;;;;;;17372:68:0;;-1:-1:-1;;;17372:68:0;;:108;;;17444:36;17468:11;17444:23;:36::i;:::-;17365:115;17267:219;-1:-1:-1;;17267:219:0:o;41941:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41941:32:0;;-1:-1:-1;41941:32:0;:::o;29936:438::-;30038:4;30051:32;30038:4;30051:12;:32::i;:::-;25799:6;30098:23;30109:12;30098:8;:23;:::i;:::-;:42;30090:51;;;;;;26545:4;30156:14;:36;;30148:45;;;;;;30202:7;:18;;;30227:11;:26;;;30260:13;:30;;;30302:48;;;17575:25:1;;;17631:2;17616:18;;17609:34;;;17659:18;;;17652:34;;;30302:48:0;;17563:2:1;17548:18;30302:48:0;;;;;;;-1:-1:-1;30364:4:0;29936:438;;;;;;:::o;28421:288::-;28503:5;;-1:-1:-1;;;;;28503:5:0;28489:10;:19;28481:28;;;;;;28524:12;28516:21;;;;;;28563:11;:9;:11::i;:::-;28552:7;:22;;28544:31;;;;;;28584:19;25799:6;28617:11;;28607:7;:21;;;;:::i;:::-;28606:41;;;;:::i;:::-;28584:63;-1:-1:-1;28654:22:0;28584:63;28654:22;;:::i;:::-;;;28685:18;28695:7;28685:9;:18::i;:::-;28474:235;28421:288;:::o;11192:141::-;11135:7;11158:12;;;:6;:12;;;;;:22;;;10131:16;10142:4;10131:10;:16::i;:::-;11302:25:::1;11313:4;11319:7;11302:10;:25::i;:::-;11192:141:::0;;;:::o;11488:208::-;-1:-1:-1;;;;;11580:23:0;;7459:10;11580:23;11572:83;;;;-1:-1:-1;;;11572:83:0;;15326:2:1;11572:83:0;;;15308:21:1;15365:2;15345:18;;;15338:30;15404:34;15384:18;;;15377:62;-1:-1:-1;;;15455:18:1;;;15448:45;15510:19;;11572:83:0;;;;;;;;;11664:26;11676:4;11682:7;11664:11;:26::i;24000:190::-;23546:4;-1:-1:-1;;;;;23555:6:0;23538:23;;;23530:80;;;;-1:-1:-1;;;23530:80:0;;;;;;;:::i;:::-;23649:6;-1:-1:-1;;;;;23625:30:0;:20;-1:-1:-1;;;;;;;;;;;19740:65:0;-1:-1:-1;;;;;19740:65:0;;19664:147;23625:20;-1:-1:-1;;;;;23625:30:0;;23617:87;;;;-1:-1:-1;;;23617:87:0;;;;;;;:::i;:::-;24080:36:::1;24098:17;24080;:36::i;:::-;24164:12;::::0;;24174:1:::1;24164:12:::0;;;::::1;::::0;::::1;::::0;;;24123:61:::1;::::0;24145:17;;24164:12;24123:21:::1;:61::i;:::-;24000:190:::0;:::o;29625:102::-;29669:19;26250:18;29669:12;:19::i;:::-;29695:10;:8;:10::i;:::-;29712:9;:7;:9::i;:::-;29625:102::o;28715:513::-;28775:17;24936:19;:17;:19::i;:::-;28833:15:::1;28809:20;;:39;;28801:48;;;::::0;::::1;;28858:22;28906:1:::0;28883:20:::1;;:24;:69;;28951:1;28883:69;;;28928:20;::::0;28910:38:::1;::::0;:15:::1;:38;:::i;:::-;28982:15;28959:20;:38:::0;28858:94;-1:-1:-1;29006:19:0::1;::::0;29116:14:::1;:12;:14::i;:::-;29144:78;::::0;;17575:25:1;;;17631:2;17616:18;;17609:34;;;17659:18;;;17652:34;;;29067:63:0;;-1:-1:-1;29067:63:0;-1:-1:-1;29067:63:0;-1:-1:-1;29160:10:0::1;::::0;29144:78:::1;::::0;17563:2:1;17548:18;29144:78:0::1;;;;;;;28794:434;;;28715:513:::0;:::o;29419:111::-;29461:22;-1:-1:-1;;;;;;;;;;;29461:12:0;:22::i;:::-;29490:20;:18;:20::i;:::-;29517:7;:5;:7::i;24196:215::-;23546:4;-1:-1:-1;;;;;23555:6:0;23538:23;;;23530:80;;;;-1:-1:-1;;;23530:80:0;;;;;;;:::i;:::-;23649:6;-1:-1:-1;;;;;23625:30:0;:20;-1:-1:-1;;;;;;;;;;;19740:65:0;-1:-1:-1;;;;;19740:65:0;;19664:147;23625:20;-1:-1:-1;;;;;23625:30:0;;23617:87;;;;-1:-1:-1;;;23617:87:0;;;;;;;:::i;:::-;24310:36:::1;24328:17;24310;:36::i;:::-;24353:52;24375:17;24394:4;24400;24353:21;:52::i;23867:127::-:0;23945:7;23771:4;-1:-1:-1;;;;;23780:6:0;23763:23;;23755:92;;;;-1:-1:-1;;;23755:92:0;;12141:2:1;23755:92:0;;;12123:21:1;12180:2;12160:18;;;12153:30;12219:34;12199:18;;;12192:62;12290:26;12270:18;;;12263:54;12334:19;;23755:92:0;11939:420:1;23755:92:0;-1:-1:-1;;;;;;;;;;;;23854:1:0::1;23867:127:::0;:::o;30380:227::-;30445:32;10081:4;30445:12;:32::i;:::-;26492:3;30492:12;:32;;30484:41;;;;;;30532:11;:26;;;30570:31;;9230:25:1;;;30570:31:0;;9218:2:1;9203:18;30570:31:0;;;;;;;;30380:227;:::o;29308:105::-;29359:24;-1:-1:-1;;;;;;;;;;;29359:12:0;:24::i;:::-;29390:17;:15;:17::i;31739:163::-;31779:22;-1:-1:-1;;;;;;;;;;;31779:12:0;:22::i;:::-;31830:8;;31808:31;;-1:-1:-1;;;;;;;;;;;26192:21:0;-1:-1:-1;;;;;31830:8:0;31808:11;:31::i;:::-;31846:8;:21;;-1:-1:-1;;;;;;31846:21:0;;;31879:17;;;;31865:1;;31879:17;31739:163::o;44993:151::-;45086:52;;-1:-1:-1;;;45086:52:0;;45132:4;45086:52;;;7455:51:1;45044:7:0;;41860:42;;45086:37;;7428:18:1;;45086:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45067:16;:14;:16::i;:::-;:71;;;;:::i;:::-;45060:78;;44993:151;:::o;45654:213::-;45722:24;-1:-1:-1;;;;;;;;;;;45722:12:0;:24::i;:::-;41681:42;-1:-1:-1;;;;;45761:17:0;:5;45767:1;45761:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;45761:17:0;;:52;;;;;41593:42;-1:-1:-1;;;;;45782:31:0;:5;45803:1;45788:5;:12;:16;;;;:::i;:::-;45782:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;45782:31:0;;45761:52;45753:78;;;;-1:-1:-1;;;45753:78:0;;10217:2:1;45753:78:0;;;10199:21:1;10256:2;10236:18;;;10229:30;-1:-1:-1;;;10275:18:1;;;10268:43;10328:18;;45753:78:0;10015:337:1;45753:78:0;45838:23;;;;:15;;:23;;;;;:::i;30613:242::-;30676:4;30689:32;30676:4;30689:12;:32::i;:::-;-1:-1:-1;;;;;30736:25:0;;30728:34;;;;;;30769:8;:22;;-1:-1:-1;;;;;;30769:22:0;-1:-1:-1;;;;;30769:22:0;;;;;;;;30803:28;;7455:51:1;;;30803:28:0;;7443:2:1;7428:18;30803:28:0;;;;;;;-1:-1:-1;30845:4:0;;30613:242;-1:-1:-1;30613:242:0:o;31150:181::-;31201:24;-1:-1:-1;;;;;;;;;;;31201:12:0;:24::i;:::-;31254:15;31232:19;:37;;;31281:44;;9230:25:1;;;31281:44:0;;9218:2:1;9203:18;31281:44:0;;;;;;;;31150:181::o;29536:83::-;29576:22;-1:-1:-1;;;;;;;;;;;29576:12:0;:22::i;:::-;29605:8;:6;:8::i;31337:190::-;31383:22;-1:-1:-1;;;;;;;;;;;31383:12:0;:22::i;:::-;31453:14;25847:8;31464:3;31453:14;:::i;:::-;31434:34;;:15;:34;:::i;:::-;31412:19;:56;;;31480:41;;9230:25:1;;;31480:41:0;;9218:2:1;9203:18;31480:41:0;9084:177:1;17492:147:0;17582:7;17605:18;;;:12;:18;;;;;:28;;17627:5;17605:21;:28::i;10382:141::-;10468:4;10488:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;10488:29:0;;;;;;;;;;;;;;;10382:141::o;45150:123::-;45220:47;;-1:-1:-1;;;45220:47:0;;45261:4;45220:47;;;7455:51:1;45197:7:0;;41769:42;;45220:32;;7428:18:1;;45220:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17645:136::-;17725:7;17748:18;;;:12;:18;;;;;:27;;:25;:27::i;28343:72::-;24936:19;:17;:19::i;:::-;28399:10:::1;:8;:10::i;29733:197::-:0;29792:32;10081:4;29792:12;:32::i;:::-;26440:4;29839:9;:20;;29831:29;;;;;;29867:8;:20;;;29899:25;;9230::1;;;29899::0;;9218:2:1;9203:18;29899:25:0;9084:177:1;11339:143:0;11135:7;11158:12;;;:6;:12;;;;;:22;;;10131:16;10142:4;10131:10;:16::i;:::-;11450:26:::1;11462:4;11468:7;11450:11;:26::i;30861:283::-:0;30943:32;10081:4;30943:12;:32::i;:::-;-1:-1:-1;;;;;30990:36:0;;30982:45;;;;;;31034:18;:43;;-1:-1:-1;;;;;;31034:43:0;-1:-1:-1;;;;;31034:43:0;;;;;;;;31089:49;;7455:51:1;;;31089:49:0;;7443:2:1;7428:18;31089:49:0;7309:203:1;41910:24:0;;;;;;;;;;;;45389:259;45473:5;45458:12;:20;45454:130;;;45496:80;;-1:-1:-1;;;45496:80:0;;;;;9230:25:1;;;9203:18;;45496:80:0;9084:177:1;45454:130:0;45590:19;26250:18;45590:12;:19::i;:::-;45616:11;:26;45389:259::o;3390:109::-;-1:-1:-1;;;;;3470:19:0;;:23;;;3390:109::o;10167:209::-;10252:4;-1:-1:-1;;;;;;10272:58:0;;-1:-1:-1;;;10272:58:0;;:98;;-1:-1:-1;;;;;;;;;;9513:51:0;;;10334:36;9408:162;31908:556;31984:15;:22;31965:16;;32046:204;32070:8;32066:1;:12;32046:204;;;32106:15;32122:1;32106:18;;;;;;;;:::i;:::-;;;;;;;;;32098:4;:26;32094:149;;;32158:1;32137:22;;32170:5;;32094:149;32200:12;32211:1;32200:8;:12;:::i;:::-;32195:1;:17;32191:52;;;32225:8;;;32191:52;32080:3;;;;:::i;:::-;;;;32046:204;;;;32263:9;32258:201;32283:18;32278:1;:23;32258:201;;32321:39;32329:15;32345:1;32329:18;;;;;;;;:::i;:::-;;;;;;;;;32349:10;32321:7;:39::i;:::-;32317:135;;;32373:5;;32317:135;32403:18;32398:1;:23;32394:58;;;32434:8;;;32394:58;32303:3;;;;:::i;:::-;;;;32258:201;;;;31958:506;;31908:556;:::o;42421:364::-;42510:52;;-1:-1:-1;;;42510:52:0;;42556:4;42510:52;;;7455:51:1;42482:25:0;;41860:42;;42510:37;;7428:18:1;;42510:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42482:80;;42593:7;42573:17;:27;42569:148;;;42611:17;42631:27;42641:17;42631:7;:27;:::i;:::-;42667:42;;-1:-1:-1;;;42667:42:0;;;;;9230:25:1;;;42611:47:0;;-1:-1:-1;41769:42:0;;42667:31;;9203:18:1;;42667:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42602:115;42569:148;42764:5;;42723:56;;41860:42;;-1:-1:-1;;;;;42764:5:0;42771:7;42723:40;:56::i;10529:99::-;10592:30;10603:4;7459:10;10592;:30::i;17787:159::-;17871:31;17888:4;17894:7;17871:16;:31::i;:::-;17909:18;;;;:12;:18;;;;;:31;;17932:7;17909:22;:31::i;17952:164::-;18037:32;18055:4;18061:7;18037:17;:32::i;:::-;18076:18;;;;:12;:18;;;;;:34;;18102:7;18076:25;:34::i;31533:200::-;31594:32;10081:4;31594:12;:32::i;:::-;31682:15;25905:10;31641:19;;:38;;;;:::i;:::-;:56;31633:65;;;;;;31705:22;:20;:22::i;20497:595::-;19416:66;20610:59;;;20606:481;;;20680:37;20699:17;20680:18;:37::i;20606:481::-;20773:17;-1:-1:-1;;;;;20744:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20744:63:0;;;;;;;;-1:-1:-1;;20744:63:0;;;;;;;;;;;;:::i;:::-;;;20740:278;;20952:56;;-1:-1:-1;;;20952:56:0;;13321:2:1;20952:56:0;;;13303:21:1;13360:2;13340:18;;;13333:30;13399:34;13379:18;;;13372:62;-1:-1:-1;;;13450:18:1;;;13443:44;13504:19;;20952:56:0;13119:410:1;20740:278:0;-1:-1:-1;;;;;;;;;;;20850:28:0;;20842:82;;;;-1:-1:-1;;;20842:82:0;;12911:2:1;20842:82:0;;;12893:21:1;12950:2;12930:18;;;12923:30;12989:34;12969:18;;;12962:62;-1:-1:-1;;;13040:18:1;;;13033:39;13089:19;;20842:82:0;12709:405:1;20842:82:0;20808:126;21026:53;21044:17;21063:4;21069:9;21026:17;:53::i;25456:110::-;25004:16;:14;:16::i;:::-;25511:7:::1;:15:::0;;-1:-1:-1;;25511:15:0::1;::::0;;25538:22:::1;7459:10:::0;25547:12:::1;25538:22;::::0;-1:-1:-1;;;;;7473:32:1;;;7455:51;;7443:2;7428:18;25538:22:0::1;7309:203:1::0;25126:102:0;25107:7;;;;25192:9;25184:38;;;;-1:-1:-1;;;25184:38:0;;12566:2:1;25184:38:0;;;12548:21:1;12605:2;12585:18;;;12578:30;-1:-1:-1;;;12624:18:1;;;12617:46;12680:18;;25184:38:0;12364:340:1;42791:353:0;42937:56;;-1:-1:-1;;;42937:56:0;;42857:17;;;;;;41769:42;;42937:32;;:56;;42978:4;;42985:7;;42937:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43000:25;:23;:25::i;:::-;43044:13;:11;:13::i;:::-;43032:25;;43087:11;:9;:11::i;:::-;43064:34;;43119:19;:17;:19::i;:::-;43105:33;;42791:353;;;:::o;45279:104::-;41769:42;-1:-1:-1;;;;;45341:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45979:323;46031:14;:12;:14::i;:::-;;;;41769:42;-1:-1:-1;;;;;46054:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46127:52:0;;-1:-1:-1;;;46127:52:0;;46173:4;46127:52;;;7455:51:1;46099:25:0;;-1:-1:-1;41860:42:0;;-1:-1:-1;46127:37:0;;7428:18:1;;46127:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46099:80;-1:-1:-1;46190:22:0;;46186:111;;46264:5;;46223:66;;41860:42;;-1:-1:-1;;;;;46264:5:0;46271:17;46223:40;:66::i;25342:108::-;24936:19;:17;:19::i;:::-;25398:7:::1;:14:::0;;-1:-1:-1;;25398:14:0::1;25408:4;25398:14;::::0;;25424:20:::1;25431:12;7459:10:::0;;7383:92;15444:152;15518:7;15565:22;15569:3;15581:5;15565:3;:22::i;15327:111::-;15390:7;15413:19;15421:3;13725:18;;13646:103;42013:402;42086:52;;-1:-1:-1;;;42086:52:0;;42132:4;42086:52;;;7455:51:1;42058:25:0;;41860:42;;42086:37;;7428:18:1;;42086:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42058:80;-1:-1:-1;42149:22:0;;42145:265;;42205:41;;-1:-1:-1;;;42205:41:0;;41860:42;42205:41;;;7455:51:1;42182:20:0;;41769:42;;42205:31;;7428:18:1;;42205:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42182:64;-1:-1:-1;42255:75:0;41860:42;41769;42312:17;42255:49;:75::i;:::-;42339:63;;-1:-1:-1;;;42339:63:0;;;;;16664:25:1;;;16705:18;;;16698:34;;;41769:42:0;;42339:30;;16637:18:1;;42339:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42173:237;42051:364;42013:402::o;34074:182::-;34191:58;;-1:-1:-1;;;;;8805:32:1;;34191:58:0;;;8787:51:1;8854:18;;;8847:34;;;34164:86:0;;34184:5;;-1:-1:-1;;;34214:23:0;8760:18:1;;34191:58:0;;;;-1:-1:-1;;34191:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34191:58:0;-1:-1:-1;;;;;;34191:58:0;;;;;;;;;;34164:19;:86::i;10634:421::-;10719:22;10727:4;10733:7;10719;:22::i;:::-;10714:336;;10859:52;10898:7;-1:-1:-1;;;;;10859:52:0;10908:2;10859:30;:52::i;:::-;10960:49;10999:4;11006:2;10960:30;:49::i;:::-;10788:234;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10788:234:0;;;;;;;;;;-1:-1:-1;;;10752:290:0;;;;;;;:::i;12057:216::-;12137:22;12145:4;12151:7;12137;:22::i;:::-;12132:136;;12170:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;12170:29:0;;;;;;;;;:36;;-1:-1:-1;;12170:36:0;12202:4;12170:36;;;12247:12;7459:10;;7383:92;12247:12;-1:-1:-1;;;;;12220:40:0;12238:7;-1:-1:-1;;;;;12220:40:0;12232:4;12220:40;;;;;;;;;;12057:216;;:::o;14850:146::-;14920:4;14940:50;14945:3;-1:-1:-1;;;;;14965:23:0;;14940:4;:50::i;12279:217::-;12359:22;12367:4;12373:7;12359;:22::i;:::-;12355:136;;;12424:5;12392:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;12392:29:0;;;;;;;;;;:37;;-1:-1:-1;;12392:37:0;;;12443:40;7459:10;;12392:12;;12443:40;;12424:5;12443:40;12279:217;;:::o;15002:152::-;15075:4;15095:53;15103:3;-1:-1:-1;;;;;15123:23:0;;15095:7;:53::i;19817:274::-;-1:-1:-1;;;;;3470:19:0;;;19887:106;;;;-1:-1:-1;;;19887:106:0;;13736:2:1;19887:106:0;;;13718:21:1;13775:2;13755:18;;;13748:30;13814:34;13794:18;;;13787:62;-1:-1:-1;;;13865:18:1;;;13858:43;13918:19;;19887:106:0;13534:409:1;19887:106:0;-1:-1:-1;;;;;;;;;;;20000:85:0;;-1:-1:-1;;;;;;20000:85:0;-1:-1:-1;;;;;20000:85:0;;;;;;;;;;19817:274::o;20248:243::-;20353:29;20364:17;20353:10;:29::i;:::-;20407:1;20393:4;:11;:15;:28;;;;20412:9;20393:28;20389:97;;;20432:46;20454:17;20473:4;20432:21;:46::i;25234:102::-;25107:7;;;;25289:41;;;;-1:-1:-1;;;25289:41:0;;10559:2:1;25289:41:0;;;10541:21:1;10598:2;10578:18;;;10571:30;-1:-1:-1;;;10617:18:1;;;10610:50;10677:18;;25289:41:0;10357:344:1;43150:863:0;43281:30;;-1:-1:-1;;;43281:30:0;;43305:4;43281:30;;;7455:51:1;41681:42:0;;43201:23;;41681:42;;43281:15;;7428:18:1;;43281:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43324:15;:22;43258:53;;-1:-1:-1;43350:1:0;-1:-1:-1;43324:27:0;;;:47;;;43370:1;43355:12;:16;43324:47;43320:688;;;43382:59;-1:-1:-1;;;;;43382:27:0;;41504:42;43428:12;43382:27;:59::i;:::-;43542:46;;-1:-1:-1;;;43542:46:0;;;;;15924:25:1;;;41681:42:0;16003:18:1;;;15996:43;41593:42:0;16055:18:1;;;16048:43;41504:42:0;;43450:23;;41504:42;;43542:19;;15897:18:1;;43542:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43640:31;;;43669:1;43640:31;;;;;;;;;43521:67;;-1:-1:-1;43599:38:0;;-1:-1:-1;43640:31:0;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;43640:31:0;;-1:-1:-1;;43640:31:0;;;;;;;;;;;43599:72;;43692:66;;;;;;;;41681:42;-1:-1:-1;;;;;43692:66:0;;;;;41593:42;-1:-1:-1;;;;;43692:66:0;;;;;43747:9;43692:66;;;;;43680:6;43687:1;43680:9;;;;;;;;:::i;:::-;;;;;;:78;;;;43767:21;43791:6;-1:-1:-1;;;;;43791:20:0;;43812:12;43826:6;43791:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43791:42:0;;;;;;;;;;;;:::i;:::-;43767:66;;43842:15;43889:5;43874:11;;43861:7;43869:1;43861:10;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;43860:34;;;;:::i;:::-;43903:97;;-1:-1:-1;;;43903:97:0;;43842:52;;-1:-1:-1;;;;;;43903:31:0;;;;;:97;;43935:12;;43842:52;;43961:6;;43977:4;;43984:15;;43903:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43903:97:0;;;;;;;;;;;;:::i;:::-;;43373:635;;;;;43194:819;;43150:863::o;44019:662::-;44188:8;;44156:29;;-1:-1:-1;;;44156:29:0;;44179:4;44156:29;;;7455:51:1;44060:17:0;;41593:42;;44060:17;;25799:6;;41593:42;;44156:14;;7428:18:1;;44156:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;44155:60;;;;:::i;:::-;44141:74;-1:-1:-1;44226:8:0;;44222:454;;25799:6;44264:7;;44258:3;:13;;;;:::i;:::-;44257:33;;;;:::i;:::-;44245:45;;44299:26;25799:6;44335:11;;44329:3;:17;;;;:::i;:::-;44328:37;;;;:::i;:::-;44299:66;;44374:23;25799:6;44422:13;;44401:18;:34;;;;:::i;:::-;44400:54;;;;:::i;:::-;44374:80;-1:-1:-1;44463:37:0;44374:80;44463:37;;:::i;:::-;;-1:-1:-1;44509:40:0;-1:-1:-1;;;;;44509:17:0;;44527:10;44539:9;44509:17;:40::i;:::-;44576:8;;44558:47;;-1:-1:-1;;;;;44558:17:0;;;;44576:8;44586:18;44558:17;:47::i;:::-;44632:18;;44614:54;;-1:-1:-1;;;;;44614:17:0;;;;44632:18;44652:15;44614:17;:54::i;:::-;44236:440;;44222:454;44079:602;;44019:662;:::o;44687:300::-;44776:48;;-1:-1:-1;;;44776:48:0;;44818:4;44776:48;;;7455:51:1;44734:19:0;;41593:42;;44776:33;;7428:18:1;;44776:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44762:62;-1:-1:-1;44835:15:0;;44831:151;;44893:5;;44861:51;;-1:-1:-1;;;44861:51:0;;-1:-1:-1;;;;;44893:5:0;;;44861:51;;;8787::1;8854:18;;;8847:34;;;41593:42:0;;44861:31;;8760:18:1;;44861:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44928:5:0;;44921:53;;-1:-1:-1;;;44921:53:0;;;;;9230:25:1;;;-1:-1:-1;;;;;44928:5:0;;;;44921:40;;9203:18:1;;44921:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13755:114;13822:7;13845:3;:11;;13857:5;13845:18;;;;;;;;:::i;:::-;;;;;;;;;13838:25;;13755:114;;;;:::o;34831:284::-;34958:39;;-1:-1:-1;;;34958:39:0;;34982:4;34958:39;;;7729:34:1;-1:-1:-1;;;;;7799:15:1;;;7779:18;;;7772:43;34935:20:0;;35000:5;;34958:15;;;;;7664:18:1;;34958:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;35039:69;;-1:-1:-1;;;;;8805:32:1;;35039:69:0;;;8787:51:1;8854:18;;;8847:34;;;34935:70:0;;-1:-1:-1;35012:97:0;;35032:5;;-1:-1:-1;;;35062:22:0;8760:18:1;;35039:69:0;8613:274:1;36018:324:0;36106:23;36132:69;36160:4;36132:69;;;;;;;;;;;;;;;;;36140:5;-1:-1:-1;;;;;36132:27:0;;;:69;;;;;:::i;:::-;36212:17;;36106:95;;-1:-1:-1;36212:21:0;36208:129;;36263:10;36252:30;;;;;;;;;;;;:::i;:::-;36244:85;;;;-1:-1:-1;;;36244:85:0;;14915:2:1;36244:85:0;;;14897:21:1;14954:2;14934:18;;;14927:30;14993:34;14973:18;;;14966:62;-1:-1:-1;;;15044:18:1;;;15037:40;15094:19;;36244:85:0;14713:406:1;8518:409:0;8593:13;8615:19;8647:10;8651:6;8647:1;:10;:::i;:::-;:14;;8660:1;8647:14;:::i;:::-;8637:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8637:25:0;;8615:47;;-1:-1:-1;;;8669:6:0;8676:1;8669:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8669:15:0;;;;;;;;;-1:-1:-1;;;8691:6:0;8698:1;8691:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8691:15:0;;;;;;;;-1:-1:-1;8718:9:0;8730:10;8734:6;8730:1;:10;:::i;:::-;:14;;8743:1;8730:14;:::i;:::-;8718:26;;8713:119;8750:1;8746;:5;8713:119;;;-1:-1:-1;;;8792:5:0;8800:3;8792:11;8779:25;;;;;;;:::i;:::-;;;;8767:6;8774:1;8767:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;8767:37:0;;;;;;;;-1:-1:-1;8823:1:0;8813:11;;;;;8753:3;;;:::i;:::-;;;8713:119;;;-1:-1:-1;8846:10:0;;8838:55;;;;-1:-1:-1;;;8838:55:0;;9856:2:1;8838:55:0;;;9838:21:1;;;9875:18;;;9868:30;9934:34;9914:18;;;9907:62;9986:18;;8838:55:0;9654:356:1;12663:255:0;12726:4;13610:19;;;:12;;;:19;;;;;;12739:174;;-1:-1:-1;12776:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;12832:18;;12810:19;;;:12;;;:19;;;;;;:40;;;;12859:11;;12739:174;-1:-1:-1;12900:5:0;12893:12;;12924:587;12990:4;13024:19;;;:12;;;:19;;;;;;13056:15;;13052:454;;13082:21;13106:14;13119:1;13106:10;:14;:::i;:::-;13149:18;;13082:38;;-1:-1:-1;13129:17:0;;13149:22;;13170:1;;13149:22;:::i;:::-;13129:42;;13199:13;13186:9;:26;13182:195;;13225:17;13245:3;:11;;13257:9;13245:22;;;;;;;;:::i;:::-;;;;;;;;;13225:42;;13309:9;13280:3;:11;;13292:13;13280:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13331:23;;;:12;;;:23;;;;;:36;;;13182:195;13387:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13422:3;:12;;:19;13435:5;13422:19;;;;;;;;;;;13415:26;;;13459:4;13452:11;;;;;;;13052:454;13493:5;13486:12;;;;;20097:145;20160:37;20179:17;20160:18;:37::i;:::-;20209:27;;-1:-1:-1;;;;;20209:27:0;;;;;;;;20097:145;:::o;22762:387::-;22845:12;-1:-1:-1;;;;;3470:19:0;;;22866:88;;;;-1:-1:-1;;;22866:88:0;;14150:2:1;22866:88:0;;;14132:21:1;14189:2;14169:18;;;14162:30;14228:34;14208:18;;;14201:62;-1:-1:-1;;;14279:18:1;;;14272:36;14325:19;;22866:88:0;13948:402:1;22866:88:0;22964:12;22978:23;23005:6;-1:-1:-1;;;;;23005:19:0;23025:4;23005:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22963:67;;;;23044:99;23080:7;23089:10;23044:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;23037:106;22762:387;-1:-1:-1;;;;;22762:387:0:o;3989:189::-;4092:12;4120:52;4142:6;4150:4;4156:1;4159:12;4120:21;:52::i;:::-;4113:59;3989:189;-1:-1:-1;;;;3989:189:0:o;5462:454::-;5598:12;5623:7;5619:292;;;-1:-1:-1;5648:10:0;5641:17;;5619:292;5685:17;;:21;5681:223;;5770:10;5764:17;5821:15;5808:10;5804:2;5800:19;5793:44;5681:223;5881:12;5874:20;;-1:-1:-1;;;5874:20:0;;;;;;;;:::i;4410:474::-;4562:12;4616:5;4591:21;:30;;4583:81;;;;-1:-1:-1;;;4583:81:0;;11734:2:1;4583:81:0;;;11716:21:1;11773:2;11753:18;;;11746:30;11812:34;11792:18;;;11785:62;-1:-1:-1;;;11863:18:1;;;11856:36;11909:19;;4583:81:0;11532:402:1;4583:81:0;-1:-1:-1;;;;;3470:19:0;;;4671:60;;;;-1:-1:-1;;;4671:60:0;;14557:2:1;4671:60:0;;;14539:21:1;14596:2;14576:18;;;14569:30;14635:31;14615:18;;;14608:59;14684:18;;4671:60:0;14355:353:1;4671:60:0;4741:12;4755:23;4782:6;-1:-1:-1;;;;;4782:11:0;4801:5;4808:4;4782:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4740:73;;;;4827:51;4844:7;4853:10;4865:12;4827:16;:51::i;:::-;4820:58;4410:474;-1:-1:-1;;;;;;;4410:474:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:164::-;268:13;;317;;310:21;300:32;;290:60;;346:1;343;336:12;361:186;420:6;473:2;461:9;452:7;448:23;444:32;441:52;;;489:1;486;479:12;441:52;512:29;531:9;512:29;:::i;552:837::-;629:6;637;690:2;678:9;669:7;665:23;661:32;658:52;;;706:1;703;696:12;658:52;729:29;748:9;729:29;:::i;:::-;719:39;;777:2;830;819:9;815:18;802:32;853:18;894:2;886:6;883:14;880:34;;;910:1;907;900:12;880:34;948:6;937:9;933:22;923:32;;993:7;986:4;982:2;978:13;974:27;964:55;;1015:1;1012;1005:12;964:55;1051:2;1038:16;1073:2;1069;1066:10;1063:36;;;1079:18;;:::i;:::-;1121:53;1164:2;1145:13;;-1:-1:-1;;1141:27:1;1137:36;;1121:53;:::i;:::-;1108:66;;1197:2;1190:5;1183:17;1237:7;1232:2;1227;1223;1219:11;1215:20;1212:33;1209:53;;;1258:1;1255;1248:12;1209:53;1313:2;1308;1304;1300:11;1295:2;1288:5;1284:14;1271:45;1357:1;1352:2;1347;1340:5;1336:14;1332:23;1325:34;;1378:5;1368:15;;;;;552:837;;;;;:::o;1394:908::-;1478:6;1509:2;1552;1540:9;1531:7;1527:23;1523:32;1520:52;;;1568:1;1565;1558:12;1520:52;1608:9;1595:23;1641:18;1633:6;1630:30;1627:50;;;1673:1;1670;1663:12;1627:50;1696:22;;1749:4;1741:13;;1737:27;-1:-1:-1;1727:55:1;;1778:1;1775;1768:12;1727:55;1814:2;1801:16;1837:60;1853:43;1893:2;1853:43;:::i;:::-;1837:60;:::i;:::-;1919:3;1943:2;1938:3;1931:15;1971:2;1966:3;1962:12;1955:19;;2002:2;1998;1994:11;2050:7;2045:2;2039;2036:1;2032:10;2028:2;2024:19;2020:28;2017:41;2014:61;;;2071:1;2068;2061:12;2014:61;2093:1;2084:10;;2103:169;2117:2;2114:1;2111:9;2103:169;;;2174:23;2193:3;2174:23;:::i;:::-;2162:36;;2135:1;2128:9;;;;;2218:12;;;;2250;;2103:169;;;-1:-1:-1;2291:5:1;1394:908;-1:-1:-1;;;;;;;1394:908:1:o;2307:892::-;2402:6;2433:2;2476;2464:9;2455:7;2451:23;2447:32;2444:52;;;2492:1;2489;2482:12;2444:52;2525:9;2519:16;2558:18;2550:6;2547:30;2544:50;;;2590:1;2587;2580:12;2544:50;2613:22;;2666:4;2658:13;;2654:27;-1:-1:-1;2644:55:1;;2695:1;2692;2685:12;2644:55;2724:2;2718:9;2747:60;2763:43;2803:2;2763:43;:::i;2747:60::-;2829:3;2853:2;2848:3;2841:15;2881:2;2876:3;2872:12;2865:19;;2912:2;2908;2904:11;2960:7;2955:2;2949;2946:1;2942:10;2938:2;2934:19;2930:28;2927:41;2924:61;;;2981:1;2978;2971:12;2924:61;3003:1;2994:10;;3013:156;3027:2;3024:1;3021:9;3013:156;;;3084:10;;3072:23;;3045:1;3038:9;;;;;3115:12;;;;3147;;3013:156;;3204:202;3271:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:52;;;3340:1;3337;3330:12;3292:52;3363:37;3390:9;3363:37;:::i;3411:180::-;3470:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;-1:-1:-1;3562:23:1;;3411:180;-1:-1:-1;3411:180:1:o;3596:184::-;3666:6;3719:2;3707:9;3698:7;3694:23;3690:32;3687:52;;;3735:1;3732;3725:12;3687:52;-1:-1:-1;3758:16:1;;3596:184;-1:-1:-1;3596:184:1:o;3785:254::-;3853:6;3861;3914:2;3902:9;3893:7;3889:23;3885:32;3882:52;;;3930:1;3927;3920:12;3882:52;3966:9;3953:23;3943:33;;3995:38;4029:2;4018:9;4014:18;3995:38;:::i;:::-;3985:48;;3785:254;;;;;:::o;4044:248::-;4112:6;4120;4173:2;4161:9;4152:7;4148:23;4144:32;4141:52;;;4189:1;4186;4179:12;4141:52;-1:-1:-1;;4212:23:1;;;4282:2;4267:18;;;4254:32;;-1:-1:-1;4044:248:1:o;4297:286::-;4355:6;4408:2;4396:9;4387:7;4383:23;4379:32;4376:52;;;4424:1;4421;4414:12;4376:52;4450:23;;-1:-1:-1;;;;;;4502:32:1;;4492:43;;4482:71;;4549:1;4546;4539:12;4962:263;5038:6;5046;5099:2;5087:9;5078:7;5074:23;5070:32;5067:52;;;5115:1;5112;5105:12;5067:52;5144:9;5138:16;5128:26;;5173:46;5215:2;5204:9;5200:18;5173:46;:::i;5230:316::-;5307:6;5315;5323;5376:2;5364:9;5355:7;5351:23;5347:32;5344:52;;;5392:1;5389;5382:12;5344:52;-1:-1:-1;;5415:23:1;;;5485:2;5470:18;;5457:32;;-1:-1:-1;5536:2:1;5521:18;;;5508:32;;5230:316;-1:-1:-1;5230:316:1:o;5551:683::-;5609:3;5647:5;5641:12;5674:6;5669:3;5662:19;5700:4;5729:2;5724:3;5720:12;5713:19;;5766:2;5759:5;5755:14;5787:1;5797:412;5811:6;5808:1;5805:13;5797:412;;;5870:13;;5954:9;;-1:-1:-1;;;;;5950:18:1;;;5938:31;;6013:11;;;6007:18;6003:27;5989:12;;;5982:49;6054:4;6112:11;;;6106:18;6099:26;6092:34;6078:12;;;6071:56;6156:4;6147:14;;;;6184:15;;;;5923:1;5826:9;5797:412;;;-1:-1:-1;6225:3:1;;5551:683;-1:-1:-1;;;;;5551:683:1:o;6239:274::-;6368:3;6406:6;6400:13;6422:53;6468:6;6463:3;6456:4;6448:6;6444:17;6422:53;:::i;:::-;6491:16;;;;;6239:274;-1:-1:-1;;6239:274:1:o;6518:786::-;6929:25;6924:3;6917:38;6899:3;6984:6;6978:13;7000:62;7055:6;7050:2;7045:3;7041:12;7034:4;7026:6;7022:17;7000:62;:::i;:::-;-1:-1:-1;;;7121:2:1;7081:16;;;7113:11;;;7106:40;7171:13;;7193:63;7171:13;7242:2;7234:11;;7227:4;7215:17;;7193:63;:::i;:::-;7276:17;7295:2;7272:26;;6518:786;-1:-1:-1;;;;6518:786:1:o;7826:782::-;7993:4;8041:2;8030:9;8026:18;8080:1;8076;8071:3;8067:11;8063:19;8121:2;8113:6;8109:15;8098:9;8091:34;8144:2;8182;8177;8166:9;8162:18;8155:30;8205:6;8240;8234:13;8271:6;8263;8256:22;8309:2;8298:9;8294:18;8287:25;;8331:6;8328:1;8321:17;8374:2;8371:1;8361:16;8347:30;;8395:1;8405:177;8419:6;8416:1;8413:13;8405:177;;;8484:13;;8480:22;;8468:35;;8570:1;8558:14;;;;8523:12;;;;8434:9;8405:177;;;-1:-1:-1;8599:3:1;;7826:782;-1:-1:-1;;;;;;;;7826:782:1:o;9266:383::-;9415:2;9404:9;9397:21;9378:4;9447:6;9441:13;9490:6;9485:2;9474:9;9470:18;9463:34;9506:66;9565:6;9560:2;9549:9;9545:18;9540:2;9532:6;9528:15;9506:66;:::i;:::-;9633:2;9612:15;-1:-1:-1;;9608:29:1;9593:45;;;;9640:2;9589:54;;9266:383;-1:-1:-1;;9266:383:1:o;10706:408::-;10908:2;10890:21;;;10947:2;10927:18;;;10920:30;10986:34;10981:2;10966:18;;10959:62;-1:-1:-1;;;11052:2:1;11037:18;;11030:42;11104:3;11089:19;;10706:408::o;11119:::-;11321:2;11303:21;;;11360:2;11340:18;;;11333:30;11399:34;11394:2;11379:18;;11372:62;-1:-1:-1;;;11465:2:1;11450:18;;11443:42;11517:3;11502:19;;11119:408::o;16102:383::-;16355:6;16344:9;16337:25;16398:2;16393;16382:9;16378:18;16371:30;16318:4;16418:61;16475:2;16464:9;16460:18;16452:6;16418:61;:::i;16743:625::-;17080:6;17069:9;17062:25;17123:6;17118:2;17107:9;17103:18;17096:34;17166:3;17161:2;17150:9;17146:18;17139:31;17043:4;17187:62;17244:3;17233:9;17229:19;17221:6;17187:62;:::i;:::-;-1:-1:-1;;;;;17285:32:1;;;;17280:2;17265:18;;17258:60;-1:-1:-1;17349:3:1;17334:19;17327:35;17179:70;16743:625;-1:-1:-1;;;16743:625:1:o;17697:275::-;17768:2;17762:9;17833:2;17814:13;;-1:-1:-1;;17810:27:1;17798:40;;17868:18;17853:34;;17889:22;;;17850:62;17847:88;;;17915:18;;:::i;:::-;17951:2;17944:22;17697:275;;-1:-1:-1;17697:275:1:o;17977:183::-;18037:4;18070:18;18062:6;18059:30;18056:56;;;18092:18;;:::i;:::-;-1:-1:-1;18137:1:1;18133:14;18149:4;18129:25;;17977:183::o;18165:128::-;18205:3;18236:1;18232:6;18229:1;18226:13;18223:39;;;18242:18;;:::i;:::-;-1:-1:-1;18278:9:1;;18165:128::o;18298:217::-;18338:1;18364;18354:132;;18408:10;18403:3;18399:20;18396:1;18389:31;18443:4;18440:1;18433:15;18471:4;18468:1;18461:15;18354:132;-1:-1:-1;18500:9:1;;18298:217::o;18520:168::-;18560:7;18626:1;18622;18618:6;18614:14;18611:1;18608:21;18603:1;18596:9;18589:17;18585:45;18582:71;;;18633:18;;:::i;:::-;-1:-1:-1;18673:9:1;;18520:168::o;18693:125::-;18733:4;18761:1;18758;18755:8;18752:34;;;18766:18;;:::i;:::-;-1:-1:-1;18803:9:1;;18693:125::o;18823:258::-;18895:1;18905:113;18919:6;18916:1;18913:13;18905:113;;;18995:11;;;18989:18;18976:11;;;18969:39;18941:2;18934:10;18905:113;;;19036:6;19033:1;19030:13;19027:48;;;-1:-1:-1;;19071:1:1;19053:16;;19046:27;18823:258::o;19086:136::-;19125:3;19153:5;19143:39;;19162:18;;:::i;:::-;-1:-1:-1;;;19198:18:1;;19086:136::o;19227:135::-;19266:3;-1:-1:-1;;19287:17:1;;19284:43;;;19307:18;;:::i;:::-;-1:-1:-1;19354:1:1;19343:13;;19227:135::o;19367:127::-;19428:10;19423:3;19419:20;19416:1;19409:31;19459:4;19456:1;19449:15;19483:4;19480:1;19473:15;19499:127;19560:10;19555:3;19551:20;19548:1;19541:31;19591:4;19588:1;19581:15;19615:4;19612:1;19605:15;19631:127;19692:10;19687:3;19683:20;19680:1;19673:31;19723:4;19720:1;19713:15;19747:4;19744:1;19737:15;19763:127;19824:10;19819:3;19815:20;19812:1;19805:31;19855:4;19852:1;19845:15;19879:4;19876:1;19869:15
Swarm Source
ipfs://d98914cb77e2e006f8043794331a700c5ae0cfb7200929b6d7b6c8800d4ca68b
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.