FTM Price: $1.00 (-1.10%)
Gas: 97 GWei

Contract

0x7F5dC0A5A07Ec4684113D42456b924e1B18577CE
 

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

FTM Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x60a06040551917492023-02-06 11:18:12416 days ago1675682292IN
 Create: NyPtvFantomUsdcWftmEqualizerStrategyToWftm_V2
0 FTM0.6400574200

Latest 1 internal transaction

Parent Txn Hash Block From To Value
551917492023-02-06 11:18:12416 days ago1675682292  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NyPtvFantomUsdcWftmEqualizerStrategyToWftm_V2

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.