More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 423 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Reward Claim All | 20969055 | 176 days ago | IN | 0 ETH | 0.00779128 | ||||
Reward Claim All | 20707231 | 212 days ago | IN | 0 ETH | 0.00130516 | ||||
Reward Claim All | 20577048 | 230 days ago | IN | 0 ETH | 0.00072852 | ||||
Reward Claim All | 20406226 | 254 days ago | IN | 0 ETH | 0.00123411 | ||||
Reward Claim All | 20149614 | 290 days ago | IN | 0 ETH | 0.00116972 | ||||
Apply Interest H... | 19937174 | 320 days ago | IN | 0 ETH | 0.00274915 | ||||
Reward Claim All | 19908017 | 324 days ago | IN | 0 ETH | 0.0022476 | ||||
Reward Claim All | 19775106 | 343 days ago | IN | 0 ETH | 0.00637772 | ||||
Reward Claim All | 19754716 | 345 days ago | IN | 0 ETH | 0.00650025 | ||||
Owner Reward Tra... | 19729803 | 349 days ago | IN | 0 ETH | 0.00048482 | ||||
Reward Claim All | 19555164 | 373 days ago | IN | 0 ETH | 0.0140398 | ||||
Reward Claim All | 19258871 | 415 days ago | IN | 0 ETH | 0.01283834 | ||||
Reward Claim All | 19248356 | 416 days ago | IN | 0 ETH | 0.01312281 | ||||
Apply Interest H... | 18988292 | 453 days ago | IN | 0 ETH | 0.00909548 | ||||
Reward Claim All | 18945603 | 459 days ago | IN | 0 ETH | 0.01110172 | ||||
Reward Claim All | 18878224 | 468 days ago | IN | 0 ETH | 0.02989688 | ||||
Owner Reward Tra... | 18817312 | 477 days ago | IN | 0 ETH | 0.00333885 | ||||
Reward Claim All | 18734133 | 489 days ago | IN | 0 ETH | 0.01961882 | ||||
Reward Claim All | 18604413 | 507 days ago | IN | 0 ETH | 0.00885401 | ||||
Reward Claim All | 18604374 | 507 days ago | IN | 0 ETH | 0.00884819 | ||||
Reward Claim All | 18297343 | 550 days ago | IN | 0 ETH | 0.00361249 | ||||
Reward Claim All | 18188457 | 565 days ago | IN | 0 ETH | 0.00670002 | ||||
Owner Reward Tra... | 18110046 | 576 days ago | IN | 0 ETH | 0.00058568 | ||||
Reward Claim All | 18080605 | 580 days ago | IN | 0 ETH | 0.00683059 | ||||
Owner Reward Tra... | 18011840 | 590 days ago | IN | 0 ETH | 0.0012917 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22004170 | 31 days ago | 0.00605028 ETH | ||||
Transfer | 22004170 | 31 days ago | 0.00605028 ETH | ||||
Transfer | 22004094 | 31 days ago | 0.01470571 ETH | ||||
Transfer | 22004094 | 31 days ago | 0.01470571 ETH | ||||
Transfer | 22004063 | 31 days ago | 0.00599037 ETH | ||||
Transfer | 22004063 | 31 days ago | 0.00599037 ETH | ||||
Transfer | 21257498 | 135 days ago | 3.92841896 ETH | ||||
Transfer | 21257498 | 135 days ago | 3.92841896 ETH | ||||
Transfer | 18985374 | 453 days ago | 0.18137481 ETH | ||||
Transfer | 18985374 | 453 days ago | 0.18137481 ETH | ||||
Transfer | 18136358 | 572 days ago | 11.4451735 ETH | ||||
Transfer | 18136358 | 572 days ago | 11.4451735 ETH | ||||
Transfer | 18059269 | 583 days ago | 0.00205808 ETH | ||||
Transfer | 18059269 | 583 days ago | 0.00205808 ETH | ||||
Transfer | 18018615 | 589 days ago | 2.82207682 ETH | ||||
Transfer | 18018615 | 589 days ago | 2.82207682 ETH | ||||
Transfer | 17030989 | 728 days ago | 163.51440391 ETH | ||||
Transfer | 17030989 | 728 days ago | 163.51440391 ETH | ||||
Transfer | 17013404 | 730 days ago | 4.13591068 ETH | ||||
Transfer | 17013404 | 730 days ago | 4.13591068 ETH | ||||
Transfer | 16896113 | 747 days ago | 0.43663347 ETH | ||||
Transfer | 16896113 | 747 days ago | 0.43663347 ETH | ||||
Transfer | 16877334 | 749 days ago | 14.80781278 ETH | ||||
Transfer | 16877334 | 749 days ago | 14.80781278 ETH | ||||
Transfer | 16802934 | 760 days ago | 10.27258756 ETH |
Loading...
Loading
Contract Name:
TokenManager
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-18 */ // File: contracts/interfaces/ILiquidationManager.sol pragma solidity 0.6.12; /** * @title BiFi's liquidation manager interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface ILiquidationManager { function setCircuitBreaker(bool _emergency) external returns (bool); function partialLiquidation(address payable delinquentBorrower, uint256 targetHandler, uint256 liquidateAmount, uint256 receiveHandler) external returns (uint256); function checkLiquidation(address payable userAddr) external view returns (bool); } // File: contracts/interfaces/IManagerSlotSetter.sol pragma solidity 0.6.12; /** * @title BiFi's Manager Context Setter interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IManagerSlotSetter { function ownershipTransfer(address payable _owner) external returns (bool); function setOperator(address payable adminAddr, bool flag) external returns (bool); function setOracleProxy(address oracleProxyAddr) external returns (bool); function setRewardErc20(address erc20Addr) external returns (bool); function setBreakerTable(address _target, bool _status) external returns (bool); function setCircuitBreaker(bool _emergency) external returns (bool); function handlerRegister(uint256 handlerID, address tokenHandlerAddr, uint256 flashFeeRate, uint256 discountBase) external returns (bool); function setLiquidationManager(address liquidationManagerAddr) external returns (bool); function setHandlerSupport(uint256 handlerID, bool support) external returns (bool); function setPositionStorageAddr(address _positionStorageAddr) external returns (bool); function setNFTAddr(address _nftAddr) external returns (bool); function setDiscountBase(uint256 handlerID, uint256 feeBase) external returns (bool); function setFlashloanAddr(address _flashloanAddr) external returns (bool); function sethandlerManagerAddr(address _handlerManagerAddr) external returns (bool); function setSlotSetterAddr(address _slotSetterAddr) external returns (bool); function setFlashloanFee(uint256 handlerID, uint256 flashFeeRate) external returns (bool); } // File: contracts/interfaces/IHandlerManager.sol pragma solidity 0.6.12; /** * @title BiFi's Manager Interest interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IHandlerManager { function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external returns (uint256, uint256, uint256, uint256, uint256, uint256); function interestUpdateReward() external returns (bool); function updateRewardParams(address payable userAddr) external returns (bool); function rewardClaimAll(address payable userAddr) external returns (uint256); function claimHandlerReward(uint256 handlerID, address payable userAddr) external returns (uint256); function ownerRewardTransfer(uint256 _amount) external returns (bool); } // File: contracts/interfaces/IManagerFlashloan.sol pragma solidity 0.6.12; interface IManagerFlashloan { function withdrawFlashloanFee(uint256 handlerID) external returns (bool); function flashloan( uint256 handlerID, address receiverAddress, uint256 amount, bytes calldata params ) external returns (bool); function getFee(uint256 handlerID, uint256 amount) external view returns (uint256); function getFeeTotal(uint256 handlerID) external view returns (uint256); function getFeeFromArguments(uint256 handlerID, uint256 amount, uint256 bifiAmo) external view returns (uint256); } // File: contracts/SafeMath.sol pragma solidity ^0.6.12; // from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol // Subject to the MIT license. /** * @title BiFi's safe-math Contract * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ library SafeMath { uint256 internal constant unifiedPoint = 10 ** 18; /******************** Safe Math********************/ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "a"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return _sub(a, b, "s"); } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return _mul(a, b); } function div(uint256 a, uint256 b) internal pure returns (uint256) { return _div(a, b, "d"); } function _sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } function _mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a* b; require((c / a) == b, "m"); return c; } function _div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } function unifiedDiv(uint256 a, uint256 b) internal pure returns (uint256) { return _div(_mul(a, unifiedPoint), b, "d"); } function unifiedMul(uint256 a, uint256 b) internal pure returns (uint256) { return _div(_mul(a, b), unifiedPoint, "m"); } } // File: contracts/interfaces/IManagerDataStorage.sol pragma solidity 0.6.12; /** * @title BiFi's manager data storage interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IManagerDataStorage { function getGlobalRewardPerBlock() external view returns (uint256); function setGlobalRewardPerBlock(uint256 _globalRewardPerBlock) external returns (bool); function getGlobalRewardDecrement() external view returns (uint256); function setGlobalRewardDecrement(uint256 _globalRewardDecrement) external returns (bool); function getGlobalRewardTotalAmount() external view returns (uint256); function setGlobalRewardTotalAmount(uint256 _globalRewardTotalAmount) external returns (bool); function getAlphaRate() external view returns (uint256); function setAlphaRate(uint256 _alphaRate) external returns (bool); function getAlphaLastUpdated() external view returns (uint256); function setAlphaLastUpdated(uint256 _alphaLastUpdated) external returns (bool); function getRewardParamUpdateRewardPerBlock() external view returns (uint256); function setRewardParamUpdateRewardPerBlock(uint256 _rewardParamUpdateRewardPerBlock) external returns (bool); function getRewardParamUpdated() external view returns (uint256); function setRewardParamUpdated(uint256 _rewardParamUpdated) external returns (bool); function getInterestUpdateRewardPerblock() external view returns (uint256); function setInterestUpdateRewardPerblock(uint256 _interestUpdateRewardPerblock) external returns (bool); function getInterestRewardUpdated() external view returns (uint256); function setInterestRewardUpdated(uint256 _interestRewardLastUpdated) external returns (bool); function setTokenHandler(uint256 handlerID, address handlerAddr) external returns (bool); function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address); function getTokenHandlerID(uint256 index) external view returns (uint256); function getTokenHandlerAddr(uint256 handlerID) external view returns (address); function setTokenHandlerAddr(uint256 handlerID, address handlerAddr) external returns (bool); function getTokenHandlerExist(uint256 handlerID) external view returns (bool); function setTokenHandlerExist(uint256 handlerID, bool exist) external returns (bool); function getTokenHandlerSupport(uint256 handlerID) external view returns (bool); function setTokenHandlerSupport(uint256 handlerID, bool support) external returns (bool); function setLiquidationManagerAddr(address _liquidationManagerAddr) external returns (bool); function getLiquidationManagerAddr() external view returns (address); function setManagerAddr(address _managerAddr) external returns (bool); } // File: contracts/interfaces/IOracleProxy.sol pragma solidity 0.6.12; /** * @title BiFi's oracle proxy interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IOracleProxy { function getTokenPrice(uint256 tokenID) external view returns (uint256); function getOracleFeed(uint256 tokenID) external view returns (address, uint256); function setOracleFeed(uint256 tokenID, address feedAddr, uint256 decimals, bool needPriceConvert, uint256 priceConvertID) external returns (bool); } // File: contracts/interfaces/IERC20.sol // from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external ; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external ; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/interfaces/IObserver.sol pragma solidity 0.6.12; /** * @title BiFi's Observer interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IObserver { function getAlphaBaseAsset() external view returns (uint256[] memory); function setChainGlobalRewardPerblock(uint256 _idx, uint256 globalRewardPerBlocks) external returns (bool); function updateChainMarketInfo(uint256 _idx, uint256 chainDeposit, uint256 chainBorrow) external returns (bool); } // File: contracts/interfaces/IProxy.sol pragma solidity 0.6.12; /** * @title BiFi's proxy interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IProxy { function handlerProxy(bytes memory data) external returns (bool, bytes memory); function handlerViewProxy(bytes memory data) external view returns (bool, bytes memory); function siProxy(bytes memory data) external returns (bool, bytes memory); function siViewProxy(bytes memory data) external view returns (bool, bytes memory); } // File: contracts/interfaces/IMarketHandler.sol pragma solidity 0.6.12; /** * @title BiFi's market handler interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IMarketHandler { function setCircuitBreaker(bool _emergency) external returns (bool); function setCircuitBreakWithOwner(bool _emergency) external returns (bool); function getTokenName() external view returns (string memory); function ownershipTransfer(address payable newOwner) external returns (bool); function deposit(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool); function withdraw(uint256 unifiedTokenAmount, bool allFlag) external returns (bool); function borrow(uint256 unifiedTokenAmount, bool allFlag) external returns (bool); function repay(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool); function executeFlashloan( address receiverAddress, uint256 amount ) external returns (bool); function depositFlashloanFee( uint256 amount ) external returns (bool); function convertUnifiedToUnderlying(uint256 unifiedTokenAmount) external view returns (uint256); function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 rewardHandlerID) external returns (uint256, uint256, uint256); function partialLiquidationUserReward(address payable delinquentBorrower, uint256 liquidationAmountWithReward, address payable liquidator) external returns (uint256); function getTokenHandlerLimit() external view returns (uint256, uint256); function getTokenHandlerBorrowLimit() external view returns (uint256); function getTokenHandlerMarginCallLimit() external view returns (uint256); function setTokenHandlerBorrowLimit(uint256 borrowLimit) external returns (bool); function setTokenHandlerMarginCallLimit(uint256 marginCallLimit) external returns (bool); function getTokenLiquidityAmountWithInterest(address payable userAddr) external view returns (uint256); function getUserAmountWithInterest(address payable userAddr) external view returns (uint256, uint256); function getUserAmount(address payable userAddr) external view returns (uint256, uint256); function getUserMaxBorrowAmount(address payable userAddr) external view returns (uint256); function getUserMaxWithdrawAmount(address payable userAddr) external view returns (uint256); function getUserMaxRepayAmount(address payable userAddr) external view returns (uint256); function checkFirstAction() external returns (bool); function applyInterest(address payable userAddr) external returns (uint256, uint256); function reserveDeposit(uint256 unifiedTokenAmount) external payable returns (bool); function reserveWithdraw(uint256 unifiedTokenAmount) external returns (bool); function withdrawFlashloanFee(uint256 unifiedTokenAmount) external returns (bool); function getDepositTotalAmount() external view returns (uint256); function getBorrowTotalAmount() external view returns (uint256); function getSIRandBIR() external view returns (uint256, uint256); function getERC20Addr() external view returns (address); } // File: contracts/interfaces/IServiceIncentive.sol pragma solidity 0.6.12; /** * @title BiFi's si interface * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ interface IServiceIncentive { function setCircuitBreakWithOwner(bool emergency) external returns (bool); function setCircuitBreaker(bool emergency) external returns (bool); function updateRewardPerBlockLogic(uint256 _rewardPerBlock) external returns (bool); function updateRewardLane(address payable userAddr) external returns (bool); function getBetaRateBaseTotalAmount() external view returns (uint256); function getBetaRateBaseUserAmount(address payable userAddr) external view returns (uint256); function getMarketRewardInfo() external view returns (uint256, uint256, uint256); function getUserRewardInfo(address payable userAddr) external view returns (uint256, uint256, uint256); function claimRewardAmountUser(address payable userAddr) external returns (uint256); } // File: contracts/Errors.sol pragma solidity 0.6.12; contract Modifier { string internal constant ONLY_OWNER = "O"; string internal constant ONLY_MANAGER = "M"; string internal constant CIRCUIT_BREAKER = "emergency"; } contract ManagerModifier is Modifier { string internal constant ONLY_HANDLER = "H"; string internal constant ONLY_LIQUIDATION_MANAGER = "LM"; string internal constant ONLY_BREAKER = "B"; } contract HandlerDataStorageModifier is Modifier { string internal constant ONLY_BIFI_CONTRACT = "BF"; } contract SIDataStorageModifier is Modifier { string internal constant ONLY_SI_HANDLER = "SI"; } contract HandlerErrors is Modifier { string internal constant USE_VAULE = "use value"; string internal constant USE_ARG = "use arg"; string internal constant EXCEED_LIMIT = "exceed limit"; string internal constant NO_LIQUIDATION = "no liquidation"; string internal constant NO_LIQUIDATION_REWARD = "no enough reward"; string internal constant NO_EFFECTIVE_BALANCE = "not enough balance"; string internal constant TRANSFER = "err transfer"; } contract SIErrors is Modifier { } contract InterestErrors is Modifier { } contract LiquidationManagerErrors is Modifier { string internal constant NO_DELINQUENT = "not delinquent"; } contract ManagerErrors is ManagerModifier { string internal constant REWARD_TRANSFER = "RT"; string internal constant UNSUPPORTED_TOKEN = "UT"; } contract OracleProxyErrors is Modifier { string internal constant ZERO_PRICE = "price zero"; } contract RequestProxyErrors is Modifier { } contract ManagerDataStorageErrors is ManagerModifier { string internal constant NULL_ADDRESS = "err addr null"; } // File: contracts/marketManager/ManagerSlot.sol pragma solidity 0.6.12; /** * @title BiFi's Slot contract * @notice Manager Slot Definitions & Allocations * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract ManagerSlot is ManagerErrors { using SafeMath for uint256; address public owner; mapping(address => bool) operators; mapping(address => Breaker) internal breakerTable; bool public emergency = false; IManagerDataStorage internal dataStorageInstance; IOracleProxy internal oracleProxy; /* feat: manager reward token instance*/ IERC20 internal rewardErc20Instance; IObserver public Observer; address public slotSetterAddr; address public handlerManagerAddr; address public flashloanAddr; // BiFi-X address public positionStorageAddr; address public nftAddr; uint256 public tokenHandlerLength; struct FeeRateParams { uint256 unifiedPoint; uint256 minimum; uint256 slope; uint256 discountRate; } struct HandlerFlashloan { uint256 flashFeeRate; uint256 discountBase; uint256 feeTotal; } mapping(uint256 => HandlerFlashloan) public handlerFlashloan; struct UserAssetsInfo { uint256 depositAssetSum; uint256 borrowAssetSum; uint256 marginCallLimitSum; uint256 depositAssetBorrowLimitSum; uint256 depositAsset; uint256 borrowAsset; uint256 price; uint256 callerPrice; uint256 depositAmount; uint256 borrowAmount; uint256 borrowLimit; uint256 marginCallLimit; uint256 callerBorrowLimit; uint256 userBorrowableAsset; uint256 withdrawableAsset; } struct Breaker { bool auth; bool tried; } struct ContractInfo { bool support; address addr; address tokenAddr; uint256 expectedBalance; uint256 afterBalance; IProxy tokenHandler; bytes data; IMarketHandler handlerFunction; IServiceIncentive siFunction; IOracleProxy oracleProxy; IManagerDataStorage managerDataStorage; } modifier onlyOwner { require(msg.sender == owner, ONLY_OWNER); _; } modifier onlyHandler(uint256 handlerID) { _isHandler(handlerID); _; } modifier onlyOperators { address payable sender = msg.sender; require(operators[sender] || sender == owner); _; } function _isHandler(uint256 handlerID) internal view { address msgSender = msg.sender; require((msgSender == dataStorageInstance.getTokenHandlerAddr(handlerID)) || (msgSender == owner), ONLY_HANDLER); } modifier onlyLiquidationManager { _isLiquidationManager(); _; } function _isLiquidationManager() internal view { address msgSender = msg.sender; require((msgSender == dataStorageInstance.getLiquidationManagerAddr()) || (msgSender == owner), ONLY_LIQUIDATION_MANAGER); } modifier circuitBreaker { _isCircuitBreak(); _; } function _isCircuitBreak() internal view { require((!emergency) || (msg.sender == owner), CIRCUIT_BREAKER); } modifier onlyBreaker { _isBreaker(); _; } function _isBreaker() internal view { require(breakerTable[msg.sender].auth, ONLY_BREAKER); } } // File: contracts/marketManager/TokenManager.sol // SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.6.12; /** * @title BiFi's marketManager contract * @notice Implement business logic and manage handlers * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract TokenManager is ManagerSlot { /** * @dev Constructor for marketManager * @param managerDataStorageAddr The address of the manager storage contract * @param oracleProxyAddr The address of oracle proxy contract (e.g., price feeds) * @param breaker The address of default circuit breaker * @param erc20Addr The address of reward token (ERC-20) */ constructor (address managerDataStorageAddr, address oracleProxyAddr, address _slotSetterAddr, address _handlerManagerAddr, address _flashloanAddr, address breaker, address erc20Addr) public { owner = msg.sender; dataStorageInstance = IManagerDataStorage(managerDataStorageAddr); oracleProxy = IOracleProxy(oracleProxyAddr); rewardErc20Instance = IERC20(erc20Addr); slotSetterAddr = _slotSetterAddr; handlerManagerAddr = _handlerManagerAddr; flashloanAddr = _flashloanAddr; breakerTable[owner].auth = true; breakerTable[breaker].auth = true; } /** * @dev Transfer ownership * @param _owner the address of the new owner * @return result the setter call in contextSetter contract */ function ownershipTransfer(address payable _owner) onlyOwner public returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .ownershipTransfer.selector, _owner ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setOperator(address payable adminAddr, bool flag) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setOperator.selector, adminAddr, flag ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Set the address of OracleProxy contract * @param oracleProxyAddr The address of OracleProxy contract * @return result the setter call in contextSetter contract */ function setOracleProxy(address oracleProxyAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setOracleProxy.selector, oracleProxyAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Set the address of BiFi reward token contract * @param erc20Addr The address of BiFi reward token contract * @return result the setter call in contextSetter contract */ function setRewardErc20(address erc20Addr) onlyOwner public returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setRewardErc20.selector, erc20Addr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Authorize admin user for circuitBreaker * @param _target The address of the circuitBreaker admin user. * @param _status The boolean status of circuitBreaker (on/off) * @return result the setter call in contextSetter contract */ function setBreakerTable(address _target, bool _status) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setBreakerTable.selector, _target, _status ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Set circuitBreak to freeze/unfreeze all handlers * @param _emergency The boolean status of circuitBreaker (on/off) * @return result the setter call in contextSetter contract */ function setCircuitBreaker(bool _emergency) onlyBreaker external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setCircuitBreaker.selector, _emergency ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setSlotSetterAddr(address _slotSetterAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter.setSlotSetterAddr.selector, _slotSetterAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function sethandlerManagerAddr(address _handlerManagerAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter.sethandlerManagerAddr.selector, _handlerManagerAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setFlashloanAddr(address _flashloanAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter.setFlashloanAddr.selector, _flashloanAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setPositionStorageAddr(address _positionStorageAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter.setPositionStorageAddr.selector, _positionStorageAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setNFTAddr(address _nftAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter.setNFTAddr.selector, _nftAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setFlashloanFee(uint256 handlerID, uint256 flashFeeRate) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setFlashloanFee.selector, handlerID, flashFeeRate ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } function setDiscountBase(uint256 handlerID, uint256 feeBase) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setDiscountBase.selector, handlerID, feeBase ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Get the circuitBreak status * @return The circuitBreak status */ function getCircuitBreaker() external view returns (bool) { return emergency; } /** * @dev Get information for a handler * @param handlerID Handler ID * @return (success or failure, handler address, handler name) */ function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address, string memory) { bool support; address tokenHandlerAddr; string memory tokenName; if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID); IProxy TokenHandler = IProxy(tokenHandlerAddr); bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler .getTokenName.selector ) ); tokenName = abi.decode(data, (string)); support = true; } return (support, tokenHandlerAddr, tokenName); } /** * @dev Register a handler * @param handlerID Handler ID and address * @param tokenHandlerAddr The handler address * @return result the setter call in contextSetter contract */ function handlerRegister(uint256 handlerID, address tokenHandlerAddr, uint256 flashFeeRate, uint256 discountBase) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .handlerRegister.selector, handlerID, tokenHandlerAddr, flashFeeRate, discountBase ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Set a liquidation manager contract * @param liquidationManagerAddr The address of liquidiation manager * @return result the setter call in contextSetter contract */ function setLiquidationManager(address liquidationManagerAddr) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setLiquidationManager.selector, liquidationManagerAddr ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Update the (SI) rewards for a user * @param userAddr The address of the user * @param callerID The handler ID * @return true (TODO: validate results) */ function rewardUpdateOfInAction(address payable userAddr, uint256 callerID) external returns (bool) { ContractInfo memory handlerInfo; (handlerInfo.support, handlerInfo.addr) = dataStorageInstance.getTokenHandlerInfo(callerID); if (handlerInfo.support) { IProxy TokenHandler; TokenHandler = IProxy(handlerInfo.addr); TokenHandler.siProxy( abi.encodeWithSelector( IServiceIncentive .updateRewardLane.selector, userAddr ) ); } return true; } /** * @dev Update interest of a user for a handler (internal) * @param userAddr The user address * @param callerID The handler ID * @param allFlag Flag for the full calculation mode (calculting for all handlers) * @return (uint256, uint256, uint256, uint256, uint256, uint256) */ function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external returns (uint256, uint256, uint256, uint256, uint256, uint256) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .applyInterestHandlers.selector, userAddr, callerID, allFlag ); (bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (uint256, uint256, uint256, uint256, uint256, uint256)); } /** * @dev Reward the user (msg.sender) with the reward token after calculating interest. * @return result the interestUpdateReward call in ManagerInterest contract */ function interestUpdateReward() external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .interestUpdateReward.selector ); (result, ) = handlerManagerAddr.delegatecall(callData); assert(result); } /** * @dev (Update operation) update the rewards parameters. * @param userAddr The address of operator * @return result the updateRewardParams call in ManagerInterest contract */ function updateRewardParams(address payable userAddr) onlyOperators external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .updateRewardParams.selector, userAddr ); (result, ) = handlerManagerAddr.delegatecall(callData); assert(result); } /** * @dev Claim all rewards for the user * @param userAddr The user address * @return true (TODO: validate results) */ function rewardClaimAll(address payable userAddr) external returns (uint256) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .rewardClaimAll.selector, userAddr ); (bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (uint256)); } /** * @dev Claim handler rewards for the user * @param handlerID The ID of claim reward handler * @param userAddr The user address * @return true (TODO: validate results) */ function claimHandlerReward(uint256 handlerID, address payable userAddr) external returns (uint256) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .claimHandlerReward.selector, handlerID, userAddr ); (bool result, bytes memory returnData) = handlerManagerAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (uint256)); } /** * @dev Transfer reward tokens to owner (for administration) * @param _amount The amount of the reward token * @return result (TODO: validate results) */ function ownerRewardTransfer(uint256 _amount) onlyOwner external returns (bool result) { bytes memory callData = abi.encodeWithSelector( IHandlerManager .ownerRewardTransfer.selector, _amount ); (result, ) = handlerManagerAddr.delegatecall(callData); assert(result); } /** * @dev Get the token price of the handler * @param handlerID The handler ID * @return The token price of the handler */ function getTokenHandlerPrice(uint256 handlerID) external view returns (uint256) { return _getTokenHandlerPrice(handlerID); } /** * @dev Get the margin call limit of the handler (external) * @param handlerID The handler ID * @return The margin call limit */ function getTokenHandlerMarginCallLimit(uint256 handlerID) external view returns (uint256) { return _getTokenHandlerMarginCallLimit(handlerID); } /** * @dev Get the margin call limit of the handler (internal) * @param handlerID The handler ID * @return The margin call limit */ function _getTokenHandlerMarginCallLimit(uint256 handlerID) internal view returns (uint256) { IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler .getTokenHandlerMarginCallLimit.selector ) ); return abi.decode(data, (uint256)); } /** * @dev Get the borrow limit of the handler (external) * @param handlerID The handler ID * @return The borrow limit */ function getTokenHandlerBorrowLimit(uint256 handlerID) external view returns (uint256) { return _getTokenHandlerBorrowLimit(handlerID); } /** * @dev Get the borrow limit of the handler (internal) * @param handlerID The handler ID * @return The borrow limit */ function _getTokenHandlerBorrowLimit(uint256 handlerID) internal view returns (uint256) { IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler .getTokenHandlerBorrowLimit.selector ) ); return abi.decode(data, (uint256)); } /** * @dev Get the handler status of whether the handler is supported or not. * @param handlerID The handler ID * @return Whether the handler is supported or not */ function getTokenHandlerSupport(uint256 handlerID) external view returns (bool) { return dataStorageInstance.getTokenHandlerSupport(handlerID); } /** * @dev Set the length of the handler list * @param _tokenHandlerLength The length of the handler list * @return true (TODO: validate results) */ function setTokenHandlersLength(uint256 _tokenHandlerLength) onlyOwner external returns (bool) { tokenHandlerLength = _tokenHandlerLength; return true; } /** * @dev Get the length of the handler list * @return the length of the handler list */ function getTokenHandlersLength() external view returns (uint256) { return tokenHandlerLength; } /** * @dev Get the handler ID at the index in the handler list * @param index The index of the handler list (array) * @return The handler ID */ function getTokenHandlerID(uint256 index) external view returns (uint256) { return dataStorageInstance.getTokenHandlerID(index); } /** * @dev Get the amount of token that the user can borrow more * @param userAddr The address of user * @param handlerID The handler ID * @return The amount of token that user can borrow more */ function getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) external view returns (uint256) { return _getUserExtraLiquidityAmount(userAddr, handlerID); } /** * @dev Get the deposit and borrow amount of the user with interest added * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount of the user with interest */ /* about user market Information function*/ function getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) external view returns (uint256, uint256) { return _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); } /** * @dev Get the depositTotalCredit and borrowTotalCredit * @param userAddr The address of the user * @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit) * @return borrowTotalCredit The sum of borrow amount for all handlers */ function getUserTotalIntraCreditAsset(address payable userAddr) external view returns (uint256, uint256) { return _getUserTotalIntraCreditAsset(userAddr); } /** * @dev Get the borrow and margin call limits of the user for all handlers * @param userAddr The address of the user * @return userTotalBorrowLimitAsset the sum of borrow limit for all handlers * @return userTotalMarginCallLimitAsset the sume of margin call limit for handlers */ function getUserLimitIntraAsset(address payable userAddr) external view returns (uint256, uint256) { uint256 userTotalBorrowLimitAsset; uint256 userTotalMarginCallLimitAsset; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { uint256 depositHandlerAsset; uint256 borrowHandlerAsset; (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID); uint256 marginCallLimit = _getTokenHandlerMarginCallLimit(handlerID); uint256 userBorrowLimitAsset = depositHandlerAsset.unifiedMul(borrowLimit); uint256 userMarginCallLimitAsset = depositHandlerAsset.unifiedMul(marginCallLimit); userTotalBorrowLimitAsset = userTotalBorrowLimitAsset.add(userBorrowLimitAsset); userTotalMarginCallLimitAsset = userTotalMarginCallLimitAsset.add(userMarginCallLimitAsset); } else { continue; } } return (userTotalBorrowLimitAsset, userTotalMarginCallLimitAsset); } /** * @dev Get the maximum allowed amount to borrow of the user from the given handler * @param userAddr The address of the user * @param callerID The target handler to borrow * @return extraCollateralAmount The maximum allowed amount to borrow from the handler. */ function getUserCollateralizableAmount(address payable userAddr, uint256 callerID) external view returns (uint256) { uint256 userTotalBorrowAsset; uint256 depositAssetBorrowLimitSum; uint256 depositHandlerAsset; uint256 borrowHandlerAsset; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); userTotalBorrowAsset = userTotalBorrowAsset.add(borrowHandlerAsset); depositAssetBorrowLimitSum = depositAssetBorrowLimitSum .add( depositHandlerAsset .unifiedMul( _getTokenHandlerBorrowLimit(handlerID) ) ); } } if (depositAssetBorrowLimitSum > userTotalBorrowAsset) { return depositAssetBorrowLimitSum .sub(userTotalBorrowAsset) .unifiedDiv( _getTokenHandlerBorrowLimit(callerID) ) .unifiedDiv( _getTokenHandlerPrice(callerID) ); } return 0; } /** * @dev Partial liquidation for a user * @param delinquentBorrower The address of the liquidation target * @param liquidateAmount The amount to liquidate * @param liquidator The address of the liquidator (liquidation operator) * @param liquidateHandlerID The hander ID of the liquidating asset * @param rewardHandlerID The handler ID of the reward token for the liquidator * @return (uint256, uint256, uint256) */ function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 liquidateHandlerID, uint256 rewardHandlerID) onlyLiquidationManager external returns (uint256, uint256, uint256) { address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(liquidateHandlerID); IProxy TokenHandler = IProxy(tokenHandlerAddr); bytes memory data; data = abi.encodeWithSelector( IMarketHandler .partialLiquidationUser.selector, delinquentBorrower, liquidateAmount, liquidator, rewardHandlerID ); (, data) = TokenHandler.handlerProxy(data); return abi.decode(data, (uint256, uint256, uint256)); } /** * @dev Get the maximum liquidation reward by checking sufficient reward amount for the liquidator. * @param delinquentBorrower The address of the liquidation target * @param liquidateHandlerID The hander ID of the liquidating asset * @param liquidateAmount The amount to liquidate * @param rewardHandlerID The handler ID of the reward token for the liquidator * @param rewardRatio delinquentBorrowAsset / delinquentDepositAsset * @return The maximum reward token amount for the liquidator */ function getMaxLiquidationReward(address payable delinquentBorrower, uint256 liquidateHandlerID, uint256 liquidateAmount, uint256 rewardHandlerID, uint256 rewardRatio) external view returns (uint256) { uint256 liquidatePrice = _getTokenHandlerPrice(liquidateHandlerID); uint256 rewardPrice = _getTokenHandlerPrice(rewardHandlerID); uint256 delinquentBorrowerRewardDeposit; (delinquentBorrowerRewardDeposit, ) = _getHandlerAmount(delinquentBorrower, rewardHandlerID); uint256 rewardAsset = delinquentBorrowerRewardDeposit.unifiedMul(rewardPrice).unifiedMul(rewardRatio); if (liquidateAmount.unifiedMul(liquidatePrice) > rewardAsset) { return rewardAsset.unifiedDiv(liquidatePrice); } else { return liquidateAmount; } } /** * @dev Reward the liquidator * @param delinquentBorrower The address of the liquidation target * @param rewardAmount The amount of reward token * @param liquidator The address of the liquidator (liquidation operator) * @param handlerID The handler ID of the reward token for the liquidator * @return The amount of reward token */ function partialLiquidationUserReward(address payable delinquentBorrower, uint256 rewardAmount, address payable liquidator, uint256 handlerID) onlyLiquidationManager external returns (uint256) { address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID); IProxy TokenHandler = IProxy(tokenHandlerAddr); bytes memory data; data = abi.encodeWithSelector( IMarketHandler .partialLiquidationUserReward.selector, delinquentBorrower, rewardAmount, liquidator ); (, data) = TokenHandler.handlerProxy(data); return abi.decode(data, (uint256)); } /** * @dev Execute flashloan contract with delegatecall * @param handlerID The ID of the token handler to borrow. * @param receiverAddress The address of receive callback contract * @param amount The amount of borrow through flashloan * @param params The encode metadata of user * @return Whether or not succeed */ function flashloan( uint256 handlerID, address receiverAddress, uint256 amount, bytes calldata params ) external returns (bool) { bytes memory callData = abi.encodeWithSelector( IManagerFlashloan .flashloan.selector, handlerID, receiverAddress, amount, params ); (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (bool)); } /** * @dev Call flashloan logic contract with delegatecall * @param handlerID The ID of handler with accumulated flashloan fee * @return The amount of fee accumlated to handler */ function getFeeTotal(uint256 handlerID) external returns (uint256) { bytes memory callData = abi.encodeWithSelector( IManagerFlashloan .getFeeTotal.selector, handlerID ); (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (uint256)); } /** * @dev Withdraw accumulated flashloan fee with delegatecall * @param handlerID The ID of handler with accumulated flashloan fee * @return Whether or not succeed */ function withdrawFlashloanFee( uint256 handlerID ) external onlyOwner returns (bool) { bytes memory callData = abi.encodeWithSelector( IManagerFlashloan .withdrawFlashloanFee.selector, handlerID ); (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (bool)); } /** * @dev Get flashloan fee for flashloan amount before make product(BiFi-X) * @param handlerID The ID of handler with accumulated flashloan fee * @param amount The amount of flashloan amount * @param bifiAmount The amount of Bifi amount * @return The amount of fee for flashloan amount */ function getFeeFromArguments( uint256 handlerID, uint256 amount, uint256 bifiAmount ) external returns (uint256) { bytes memory callData = abi.encodeWithSelector( IManagerFlashloan .getFeeFromArguments.selector, handlerID, amount, bifiAmount ); (bool result, bytes memory returnData) = flashloanAddr.delegatecall(callData); assert(result); return abi.decode(returnData, (uint256)); } /** * @dev Get the deposit and borrow amount of the user for the handler (internal) * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount */ function _getHandlerAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256) { IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler .getUserAmount.selector, userAddr ) ); return abi.decode(data, (uint256, uint256)); } /** * @dev Get the deposit and borrow amount with interest of the user for the handler (internal) * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount with interest */ function _getHandlerAmountWithAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256) { IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler .getUserAmountWithInterest.selector, userAddr ) ); return abi.decode(data, (uint256, uint256)); } /** * @dev Set the support stauts for the handler * @param handlerID the handler ID * @param support the support status (boolean) * @return result the setter call in contextSetter contract */ function setHandlerSupport(uint256 handlerID, bool support) onlyOwner public returns (bool result) { bytes memory callData = abi.encodeWithSelector( IManagerSlotSetter .setHandlerSupport.selector, handlerID, support ); (result, ) = slotSetterAddr.delegatecall(callData); assert(result); } /** * @dev Get owner's address of the manager contract * @return The address of owner */ function getOwner() public view returns (address) { return owner; } /** * @dev Get the deposit and borrow amount of the user with interest added * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount of the user with interest */ function _getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256) { uint256 price = _getTokenHandlerPrice(handlerID); IProxy TokenHandler = IProxy(dataStorageInstance.getTokenHandlerAddr(handlerID)); uint256 depositAmount; uint256 borrowAmount; bytes memory data; (, data) = TokenHandler.handlerViewProxy( abi.encodeWithSelector( IMarketHandler.getUserAmountWithInterest.selector, userAddr ) ); (depositAmount, borrowAmount) = abi.decode(data, (uint256, uint256)); uint256 depositAsset = depositAmount.unifiedMul(price); uint256 borrowAsset = borrowAmount.unifiedMul(price); return (depositAsset, borrowAsset); } /** * @dev Get the depositTotalCredit and borrowTotalCredit * @param userAddr The address of the user * @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit) * @return borrowTotalCredit The sum of borrow amount for all handlers */ function _getUserTotalIntraCreditAsset(address payable userAddr) internal view returns (uint256, uint256) { uint256 depositTotalCredit; uint256 borrowTotalCredit; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { uint256 depositHandlerAsset; uint256 borrowHandlerAsset; (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID); uint256 depositHandlerCredit = depositHandlerAsset.unifiedMul(borrowLimit); depositTotalCredit = depositTotalCredit.add(depositHandlerCredit); borrowTotalCredit = borrowTotalCredit.add(borrowHandlerAsset); } else { continue; } } return (depositTotalCredit, borrowTotalCredit); } /** * @dev Get the amount of token that the user can borrow more * @param userAddr The address of user * @param handlerID The handler ID * @return The amount of token that user can borrow more */ function _getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256) { uint256 depositCredit; uint256 borrowCredit; (depositCredit, borrowCredit) = _getUserTotalIntraCreditAsset(userAddr); if (depositCredit == 0) { return 0; } if (depositCredit > borrowCredit) { return depositCredit.sub(borrowCredit).unifiedDiv(_getTokenHandlerPrice(handlerID)); } else { return 0; } } function getFeePercent(uint256 handlerID) external view returns (uint256) { return handlerFlashloan[handlerID].flashFeeRate; } /** * @dev Get the token price for the handler * @param handlerID The handler id * @return The token price of the handler */ function _getTokenHandlerPrice(uint256 handlerID) internal view returns (uint256) { return (oracleProxy.getTokenPrice(handlerID)); } /** * @dev Get the address of reward token * @return The address of reward token */ function getRewardErc20() public view returns (address) { return address(rewardErc20Instance); } /** * @dev Get the reward parameters * @return (uint256,uint256,uint256) rewardPerBlock, rewardDecrement, rewardTotalAmount */ function getGlobalRewardInfo() external view returns (uint256, uint256, uint256) { IManagerDataStorage _dataStorage = dataStorageInstance; return (_dataStorage.getGlobalRewardPerBlock(), _dataStorage.getGlobalRewardDecrement(), _dataStorage.getGlobalRewardTotalAmount()); } function setObserverAddr(address observerAddr) onlyOwner external returns (bool) { Observer = IObserver( observerAddr ); } /** * @dev fallback function where handler can receive native coin */ fallback () external payable { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"managerDataStorageAddr","type":"address"},{"internalType":"address","name":"oracleProxyAddr","type":"address"},{"internalType":"address","name":"_slotSetterAddr","type":"address"},{"internalType":"address","name":"_handlerManagerAddr","type":"address"},{"internalType":"address","name":"_flashloanAddr","type":"address"},{"internalType":"address","name":"breaker","type":"address"},{"internalType":"address","name":"erc20Addr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"Observer","outputs":[{"internalType":"contract IObserver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"},{"internalType":"bool","name":"allFlag","type":"bool"}],"name":"applyInterestHandlers","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"claimHandlerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"flashloan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flashloanAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCircuitBreaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"bifiAmount","type":"uint256"}],"name":"getFeeFromArguments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getGlobalRewardInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardRatio","type":"uint256"}],"name":"getMaxLiquidationReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardErc20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenHandlerID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerMarginCallLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerSupport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenHandlersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"getUserCollateralizableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserExtraLiquidityAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserIntraHandlerAssetWithInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserLimitIntraAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserTotalIntraCreditAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"handlerFlashloan","outputs":[{"internalType":"uint256","name":"flashFeeRate","type":"uint256"},{"internalType":"uint256","name":"discountBase","type":"uint256"},{"internalType":"uint256","name":"feeTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"handlerManagerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address","name":"tokenHandlerAddr","type":"address"},{"internalType":"uint256","name":"flashFeeRate","type":"uint256"},{"internalType":"uint256","name":"discountBase","type":"uint256"}],"name":"handlerRegister","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestUpdateReward","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerRewardTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"ownershipTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"}],"name":"partialLiquidationUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"partialLiquidationUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"positionStorageAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"rewardClaimAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"rewardUpdateOfInAction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBreakerTable","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergency","type":"bool"}],"name":"setCircuitBreaker","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"feeBase","type":"uint256"}],"name":"setDiscountBase","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_flashloanAddr","type":"address"}],"name":"setFlashloanAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"uint256","name":"flashFeeRate","type":"uint256"}],"name":"setFlashloanFee","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"setHandlerSupport","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidationManagerAddr","type":"address"}],"name":"setLiquidationManager","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddr","type":"address"}],"name":"setNFTAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"observerAddr","type":"address"}],"name":"setObserverAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adminAddr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracleProxyAddr","type":"address"}],"name":"setOracleProxy","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_positionStorageAddr","type":"address"}],"name":"setPositionStorageAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setRewardErc20","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_slotSetterAddr","type":"address"}],"name":"setSlotSetterAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenHandlerLength","type":"uint256"}],"name":"setTokenHandlersLength","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_handlerManagerAddr","type":"address"}],"name":"sethandlerManagerAddr","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slotSetterAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenHandlerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"updateRewardParams","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"withdrawFlashloanFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526003805460ff1916905534801561001a57600080fd5b5060405162004c1038038062004c10833981810160405260e081101561003f57600080fd5b5080516020808301516040808501516060860151608087015160a088015160c09098015160008054336001600160a01b03199182161780835560038054610100600160a81b0319166101006001600160a01b039d8e1602179055600480548316998c1699909917909855600580548216938b1693909317909255600780548316958a1695909517909455600880548216938916939093179092556009805490921690871617905591841682526002909252818120805460ff19908116600190811790925593909416815290812080549092169092179055614ae99081906200012790396000f3fe60806040526004361061038c5760003560e01c80637b66a7da116101dc578063c6adddab11610102578063dad2829f116100a0578063e8be60741161006f578063e8be607414610e89578063f18490c714610ece578063f502ca7414610f00578063fe4d27cd14610f155761038c565b8063dad2829f14610d12578063dd8bc8d414610d86578063de96f58e14610dbf578063e521809e14610e565761038c565b8063ce19512c116100dc578063ce19512c14610bc1578063d007242e14610beb578063d3a417a214610ca6578063dac9f9db14610cd95761038c565b8063c6adddab14610b6d578063ca2ec6ea14610b97578063caa6fea414610bac5761038c565b80638da5cb5b1161017a578063a205c6fd11610149578063a205c6fd14610ad7578063a7e55d2214610b0a578063b55c9b0114610b1f578063c188214f14610b345761038c565b80638da5cb5b14610a6857806390cdd94d14610a7d57806397f2b41914610aad5780639e1c53d814610ac25761038c565b80638369b1df116101b65780638369b1df146109f657806387fa699714610a0b578063893d20e814610a205780638b91bd7314610a355761038c565b80637b66a7da146109495780637d170e261461097c5780638178d60a146109af5761038c565b806341418632116102c1578063611dacd31161025f578063740f1e181161022e578063740f1e181461089557806375ff47bf146108aa5780637905b435146108dd57806379c9ecac146109165761038c565b8063611dacd3146107c3578063618a56c2146107ed578063644fc9351461082057806369f3629a1461086b5761038c565b80634dbeb3871161029b5780634dbeb387146106d75780634f81866b14610708578063558a72971461071d57806357daa7b0146107585761038c565b806341418632146106575780634250644914610681578063461fe3a6146106ad5761038c565b806323cda5761161032e57806338f92fc71161030857806338f92fc71461058f5780633b884de6146105c25780633be8b4a5146105fd5780634107f10a1461062d5761038c565b806323cda576146104ef5780632ab0b0eb14610519578063314d59fc146105435761038c565b8063144236501161036a578063144236501461044a57806315ddcdaf1461047d5780631defc035146104a757806320e5f7a6146104da5761038c565b806311ad747b1461038e57806311f151eb146103ca57806313a8be9d14610411575b005b34801561039a57600080fd5b506103b8600480360360208110156103b157600080fd5b5035610f4b565b60408051918252519081900360200190f35b3480156103d657600080fd5b506103fd600480360360208110156103ed57600080fd5b50356001600160a01b0316610f5d565b604080519115158252519081900360200190f35b34801561041d57600080fd5b506103fd6004803603604081101561043457600080fd5b506001600160a01b0381351690602001356110fe565b34801561045657600080fd5b506103fd6004803603602081101561046d57600080fd5b50356001600160a01b0316611385565b34801561048957600080fd5b506103b8600480360360208110156104a057600080fd5b5035611470565b3480156104b357600080fd5b506103fd600480360360208110156104ca57600080fd5b50356001600160a01b03166114f3565b3480156104e657600080fd5b506103b861161b565b3480156104fb57600080fd5b506103fd6004803603602081101561051257600080fd5b5035611621565b34801561052557600080fd5b506103b86004803603602081101561053c57600080fd5b5035611672565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b031661167d565b6040805192835260208301919091528051918290030190f35b34801561059b57600080fd5b506103fd600480360360208110156105b257600080fd5b50356001600160a01b0316611692565b3480156105ce57600080fd5b506103fd600480360360408110156105e557600080fd5b506001600160a01b038135169060200135151561177d565b34801561060957600080fd5b506103fd6004803603604081101561062057600080fd5b50803590602001356118ea565b34801561063957600080fd5b506103fd6004803603602081101561065057600080fd5b50356119d5565b34801561066357600080fd5b506103b86004803603602081101561067a57600080fd5b5035611a52565b34801561068d57600080fd5b506103fd600480360360208110156106a457600080fd5b50351515611a5d565b3480156106b957600080fd5b506103b8600480360360208110156106d057600080fd5b5035611adb565b3480156106e357600080fd5b506106ec611ae6565b604080516001600160a01b039092168252519081900360200190f35b34801561071457600080fd5b506106ec611af5565b34801561072957600080fd5b506103fd6004803603604081101561074057600080fd5b506001600160a01b0381351690602001351515611b04565b34801561076457600080fd5b506107a5600480360360a081101561077b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611bf7565b60408051938452602084019290925282820152519081900360600190f35b3480156107cf57600080fd5b506103fd600480360360208110156107e657600080fd5b5035611ead565b3480156107f957600080fd5b506103fd6004803603602081101561081057600080fd5b50356001600160a01b031661202e565b34801561082c57600080fd5b506103b8600480360360a081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612119565b34801561087757600080fd5b506107a56004803603602081101561088e57600080fd5b5035612192565b3480156108a157600080fd5b506106ec6121b3565b3480156108b657600080fd5b506103fd600480360360208110156108cd57600080fd5b50356001600160a01b03166121c2565b3480156108e957600080fd5b506103b86004803603604081101561090057600080fd5b506001600160a01b0381351690602001356122ad565b34801561092257600080fd5b506103fd6004803603602081101561093957600080fd5b50356001600160a01b03166123d7565b34801561095557600080fd5b506103fd6004803603602081101561096c57600080fd5b50356001600160a01b03166124c2565b34801561098857600080fd5b506105766004803603602081101561099f57600080fd5b50356001600160a01b031661255a565b3480156109bb57600080fd5b506103b8600480360360808110156109d257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612671565b348015610a0257600080fd5b506103b861290c565b348015610a1757600080fd5b506106ec612912565b348015610a2c57600080fd5b506106ec612921565b348015610a4157600080fd5b506103b860048036036020811015610a5857600080fd5b50356001600160a01b0316612930565b348015610a7457600080fd5b506106ec6129ad565b348015610a8957600080fd5b506103fd60048036036040811015610aa057600080fd5b50803590602001356129bc565b348015610ab957600080fd5b506106ec612aa7565b348015610ace57600080fd5b506106ec612ab6565b348015610ae357600080fd5b506103fd60048036036020811015610afa57600080fd5b50356001600160a01b0316612ac5565b348015610b1657600080fd5b506103fd612bb0565b348015610b2b57600080fd5b506106ec612bb9565b348015610b4057600080fd5b506103b860048036036040811015610b5757600080fd5b506001600160a01b038135169060200135612bc8565b348015610b7957600080fd5b506103fd60048036036020811015610b9057600080fd5b5035612bdb565b348015610ba357600080fd5b506107a5612cbf565b348015610bb857600080fd5b506103fd612e27565b348015610bcd57600080fd5b506103b860048036036020811015610be457600080fd5b5035612e30565b348015610bf757600080fd5b50610c1560048036036020811015610c0e57600080fd5b5035612ea9565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c69578181015183820152602001610c51565b50505050905090810190601f168015610c965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610cb257600080fd5b506103fd60048036036020811015610cc957600080fd5b50356001600160a01b0316613265565b348015610ce557600080fd5b506103b860048036036040811015610cfc57600080fd5b50803590602001356001600160a01b0316613350565b348015610d1e57600080fd5b50610d5360048036036060811015610d3557600080fd5b506001600160a01b0381351690602081013590604001351515613467565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610d9257600080fd5b5061057660048036036040811015610da957600080fd5b506001600160a01b0381351690602001356135c3565b348015610dcb57600080fd5b506103fd60048036036080811015610de257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b811115610e1857600080fd5b820183602082011115610e2a57600080fd5b803590602001918460018302840111600160201b83111715610e4b57600080fd5b5090925090506135db565b348015610e6257600080fd5b506103fd60048036036020811015610e7957600080fd5b50356001600160a01b0316613751565b348015610e9557600080fd5b506103fd60048036036080811015610eac57600080fd5b508035906001600160a01b03602082013516906040810135906060013561383c565b348015610eda57600080fd5b506103fd60048036036040811015610ef157600080fd5b508035906020013515156139b5565b348015610f0c57600080fd5b506103fd613aa4565b348015610f2157600080fd5b506103b860048036036060811015610f3857600080fd5b5080359060208101359060400135613b7f565b6000908152600d602052604090205490565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461100d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fd2578181015183820152602001610fba565b50505050905090810190601f168015610fff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166311f151eb60e01b1781526007549351835193949092169284929182918083835b602083106110865780518252601f199092019160209182019101611067565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b505080925050816110f857fe5b50919050565b6000611108614a58565b60035460408051636803921760e11b81526004810186905281516101009093046001600160a01b03169263d007242e92602480840193919291829003018186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d604081101561117f57600080fd5b5080516020918201516001600160a01b031691830191909152158015825261137957602080820151604080516001600160a01b038881166024808401919091528351808403820181526044938401855280870180516001600160e01b031663c8474ce560e01b17815294516321daf55f60e11b81526004810197885281519281019290925280519596928716956343b5eabe959194849301919080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156112c057600080fd5b815160208301805160405192949293830192919084600160201b8211156112e657600080fd5b9083019060208201858111156112fb57600080fd5b8251600160201b81118282018810171561131457600080fd5b82525081516020918201929091019080838360005b83811015611341578181015183820152602001611329565b50505050905090810190601f16801561136e5780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146113f85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316630144236560e41b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600354604080516315ddcdaf60e01b815260048101849052905160009261010090046001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b1580156114c157600080fd5b505afa1580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b505192915050565b3360008181526001602052604081205490919060ff168061152157506000546001600160a01b038281169116145b61152a57600080fd5b604080516001600160a01b0380861660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631defc03560e01b1781526008549351835193949092169284929182918083835b602083106115a25780518252601f199092019160209182019101611583565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b5050809350508261161457fe5b5050919050565b600c5481565b600354604080516311e6d2bb60e11b815260048101849052905160009261010090046001600160a01b0316916323cda576916024808301926020929190829003018186803b1580156114c157600080fd5b600061137f82613c9a565b60008061168983613ce7565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117055760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166338f92fc760e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117f05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b0316631dc426f360e11b1781526007549351835193949092169284929182918083835b602083106118715780518252601f199092019160209182019101611852565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146118d1576040519150601f19603f3d011682016040523d82523d6000602084013e6118d6565b606091505b505080925050816118e357fe5b5092915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461195d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b0316633be8b4a560e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611a485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050600c55600190565b600061137f82613dd6565b6000611a67614043565b6040805183151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316634250644960e01b1781526007549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600061137f826140c0565b600a546001600160a01b031681565b6007546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611b775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b031663558a729760e01b178152600754935183519394909216928492918291808383602083106118715780518252601f199092019160209182019101611852565b6000806000611c046141ce565b60035460408051631b677ffb60e11b815260048101889052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611d35578181015183820152602001611d1d565b50505050905090810190601f168015611d625780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611dbe57600080fd5b815160208301805160405192949293830192919084600160201b821115611de457600080fd5b908301906020820185811115611df957600080fd5b8251600160201b811182820188101715611e1257600080fd5b82525081516020918201929091019080838360005b83811015611e3f578181015183820152602001611e27565b50505050905090810190601f168015611e6c5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020830191506060811015611e8c57600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611f205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663611dacd360e01b1781526009549251825192936000936060936001600160a01b0390921692869290918291908083835b60208310611f9d5780518252601f199092019160209182019101611f7e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611ffd576040519150601f19603f3d011682016040523d82523d6000602084013e612002565b606091505b50915091508161200e57fe5b80806020019051602081101561202357600080fd5b505195945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146120a15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166330c52b6160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60008061212586613c9a565b9050600061213285613c9a565b9050600061214089876142d4565b5090506000612159866121538486614562565b90614562565b9050806121668986614562565b1115612181576121768185614599565b945050505050612189565b879450505050505b95945050505050565b600d6020526000908152604090208054600182015460029092015490919083565b600b546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146122355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166375ff47bf60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b6000806000806000805b600c5481101561238e57600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d602081101561234457600080fd5b5051156123865761235588826145d0565b90935091506123648583614890565b945061238361237c612375836140c0565b8590614562565b8590614890565b93505b6001016122b7565b50838311156123ca576123bf6123a387613c9a565b6123b96123af896140c0565b6123b987896148ce565b90614599565b94505050505061137f565b5060009695505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461244a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631e727b2b60e21b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146125355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50600680546001600160a01b0319166001600160a01b03939093169290921790915590565b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125c657600080fd5b505afa1580156125da573d6000803e3d6000fd5b505050506040513d60208110156125f057600080fd5b50511561265e5760008061260488846145d0565b90925090506000612614846140c0565b9050600061262185613dd6565b9050600061262f8584614562565b9050600061263d8684614562565b90506126498983614890565b98506126558882614890565b97505050505050505b600101612563565b509092509050915091565b600061267b6141ce565b60035460408051631b677ffb60e11b815260048101859052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b838110156127a8578181015183820152602001612790565b50505050905090810190601f1680156127d55780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561283157600080fd5b815160208301805160405192949293830192919084600160201b82111561285757600080fd5b90830190602082018581111561286c57600080fd5b8251600160201b81118282018810171561288557600080fd5b82525081516020918201929091019080838360005b838110156128b257818101518382015260200161289a565b50505050905090810190601f1680156128df5780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156128fe57600080fd5b505198975050505050505050565b600c5490565b6009546001600160a01b031681565b6000546001600160a01b031690565b604080516001600160a01b0380841660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638b91bd7360e01b17815260085493518351600095869460609491169286929091829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b6000546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612a2f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b03166390cdd94d60e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b6005546001600160a01b031690565b6008546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612b385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663a205c6fd60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60035460ff1690565b6006546001600160a01b031681565b6000612bd483836148f4565b9392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612c4e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663c6adddab60e01b1781526008549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600080600080600360019054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b158015612d8257600080fd5b505afa158015612d96573d6000803e3d6000fd5b505050506040513d6020811015612dac57600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b158015612dee57600080fd5b505afa158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b50519195509350915050909192565b60035460ff1681565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316633386544b60e21b1781526009549251825160009485936060936001600160a01b0390921692869291829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b60008060606000806060600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f0c57600080fd5b505afa158015612f20573d6000803e3d6000fd5b505050506040513d6020811015612f3657600080fd5b50511561325857600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b8381101561304d578181015183820152602001613035565b50505050905090810190601f16801561307a5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156130d457600080fd5b815160208301805160405192949293830192919084600160201b8211156130fa57600080fd5b90830190602082018581111561310f57600080fd5b8251600160201b81118282018810171561312857600080fd5b82525081516020918201929091019080838360005b8381101561315557818101518382015260200161313d565b50505050905090810190601f1680156131825780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156131a157600080fd5b8101908080516040519392919084600160201b8211156131c057600080fd5b9083019060208201858111156131d557600080fd5b8251600160201b8111828201881017156131ee57600080fd5b82525081516020918201929091019080838360005b8381101561321b578181015183820152602001613203565b50505050905090810190601f1680156132485780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146132d85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166369d20bd160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60408051602481018490526001600160a01b0380841660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663dac9f9db60e01b1781526008549351835160009586946060949116928692909182918083835b602083106133d55780518252601f1990920191602091820191016133b6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613435576040519150601f19603f3d011682016040523d82523d6000602084013e61343a565b606091505b50915091508161344657fe5b80806020019051602081101561345b57600080fd5b50519695505050505050565b604080516001600160a01b0380861660248301526044820185905283151560648084019190915283518084039091018152608490920183526020820180516001600160e01b031663dad2829f60e01b17815260085493518351600095869586958695869586959394869460609491909116928692918291908083835b602083106135025780518252601f1990920191602091820191016134e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613562576040519150601f19603f3d011682016040523d82523d6000602084013e613567565b606091505b50915091508161357357fe5b8080602001905160c081101561358857600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b5099509750909550935050505093975093979195509350565b6000806135d084846145d0565b915091509250929050565b6000606063de96f58e60e01b878787878760405160240180868152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600083820181905260408051601f909301601f1990811690950183810390950183529384526020820180516001600160e01b03166001600160e01b0319909d169c909c178c5260095493518251929d50909b60609b506001600160a01b0390941699508c9850965086955091935090915081905083835b602083106136bc5780518252601f19909201916020918201910161369d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461371c576040519150601f19603f3d011682016040523d82523d6000602084013e613721565b606091505b50915091508161372d57fe5b80806020019051602081101561374257600080fd5b50519998505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146137c45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316637290c04f60e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146138af5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602481018790526001600160a01b0380871660448301526064820186905260848083018690528351808403909101815260a490920183526020820180516001600160e01b0316633a2f981d60e21b1781526007549351835193949092169284929182918083835b6020831061393a5780518252601f19909201916020918201910161391b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b505080925050816139ac57fe5b50949350505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314613a285760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516024810185905283151560448083019190915282518083039091018152606490910182526020810180516001600160e01b031663f18490c760e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b60408051600481526024810182526020810180516001600160e01b0316633d40b29d60e21b178152600854925182516000946001600160a01b0316928492918291908083835b60208310613b095780518252601f199092019160209182019101613aea565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613b69576040519150601f19603f3d011682016040523d82523d6000602084013e613b6e565b606091505b50508092505081613b7b57fe5b5090565b604080516024810185905260448101849052606480820184905282518083039091018152608490910182526020810180516001600160e01b031663fe4d27cd60e01b1781526009549251825160009485936060936001600160a01b039092169286929182918083835b60208310613c075780518252601f199092019160209182019101613be8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613c67576040519150601f19603f3d011682016040523d82523d6000602084013e613c6c565b606091505b509150915081613c7857fe5b808060200190516020811015613c8d57600080fd5b5051979650505050505050565b600480546040805163c457fb3760e01b8152928301849052516000926001600160a01b039092169163c457fb37916024808301926020929190829003018186803b1580156114c157600080fd5b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d5357600080fd5b505afa158015613d67573d6000803e3d6000fd5b505050506040513d6020811015613d7d57600080fd5b505115613dce57600080613d9188846145d0565b90925090506000613da1846140c0565b90506000613daf8483614562565b9050613dbb8782614890565b9650613dc78684614890565b9550505050505b600101613cf0565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e3257600080fd5b505afa158015613e46573d6000803e3d6000fd5b505050506040513d6020811015613e5c57600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b83811015613ee5578181015183820152602001613ecd565b50505050905090810190601f168015613f125780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613f6c57600080fd5b815160208301805160405192949293830192919084600160201b821115613f9257600080fd5b908301906020820185811115613fa757600080fd5b8251600160201b811182820188101715613fc057600080fd5b82525081516020918201929091019080838360005b83811015613fed578181015183820152602001613fd5565b50505050905090810190601f16801561401a5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020808401925081101561403957600080fd5b5051949350505050565b3360009081526002602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166140bd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561411c57600080fd5b505afa158015614130573d6000803e3d6000fd5b505050506040513d602081101561414657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d1289493839260449091019190808383600083811015613ee5578181015183820152602001613ecd565b60035460408051632836093360e21b81529051339261010090046001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561421757600080fd5b505afa15801561422b573d6000803e3d6000fd5b505050506040513d602081101561424157600080fd5b50516001600160a01b038281169116148061426957506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906142d05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050565b6000806000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561433257600080fd5b505afa158015614346573d6000803e3d6000fd5b505050506040513d602081101561435c57600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b838110156143f55781810151838201526020016143dd565b50505050905090810190601f1680156144225780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561443f57600080fd5b505afa158015614453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561447c57600080fd5b815160208301805160405192949293830192919084600160201b8211156144a257600080fd5b9083019060208201858111156144b757600080fd5b8251600160201b8111828201881017156144d057600080fd5b82525081516020918201929091019080838360005b838110156144fd5781810151838201526020016144e5565b50505050905090810190601f16801561452a5780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561454c57600080fd5b5080516020909101519097909650945050505050565b6000612bd46145718484614949565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b81525061499c565b6000612bd46145b084670de0b6b3a7640000614949565b83604051806040016040528060018152602001601960fa1b81525061499c565b60008060006145de84613c9a565b90506000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561463b57600080fd5b505afa15801561464f573d6000803e3d6000fd5b505050506040513d602081101561466557600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b838110156146ff5781810151838201526020016146e7565b50505050905090810190601f16801561472c5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561474957600080fd5b505afa15801561475d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561478657600080fd5b815160208301805160405192949293830192919084600160201b8211156147ac57600080fd5b9083019060208201858111156147c157600080fd5b8251600160201b8111828201881017156147da57600080fd5b82525081516020918201929091019080838360005b838110156148075781810151838201526020016147ef565b50505050905090810190601f1680156148345780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561485657600080fd5b508051602090910151909350915060006148708487614562565b9050600061487e8488614562565b919b919a509098505050505050505050565b600082820183811015612bd4576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b6000612bd48383604051806040016040528060018152602001607360f81b8152506149fe565b600080600061490285613ce7565b9092509050816149175760009250505061137f565b8082111561493e5761493561492b85613c9a565b6123b984846148ce565b9250505061137f565b60009250505061137f565b6000826149585750600061137f565b8282028284828161496557fe5b0414612bd4576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b600081836149eb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b508284816149f557fe5b04949350505050565b60008184841115614a505760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b505050900390565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082015260e08101829052610100810182905261012081018290526101408101919091529056fea26469706673582212209c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c664736f6c634300060c003300000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a45300000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
Deployed Bytecode
0x60806040526004361061038c5760003560e01c80637b66a7da116101dc578063c6adddab11610102578063dad2829f116100a0578063e8be60741161006f578063e8be607414610e89578063f18490c714610ece578063f502ca7414610f00578063fe4d27cd14610f155761038c565b8063dad2829f14610d12578063dd8bc8d414610d86578063de96f58e14610dbf578063e521809e14610e565761038c565b8063ce19512c116100dc578063ce19512c14610bc1578063d007242e14610beb578063d3a417a214610ca6578063dac9f9db14610cd95761038c565b8063c6adddab14610b6d578063ca2ec6ea14610b97578063caa6fea414610bac5761038c565b80638da5cb5b1161017a578063a205c6fd11610149578063a205c6fd14610ad7578063a7e55d2214610b0a578063b55c9b0114610b1f578063c188214f14610b345761038c565b80638da5cb5b14610a6857806390cdd94d14610a7d57806397f2b41914610aad5780639e1c53d814610ac25761038c565b80638369b1df116101b65780638369b1df146109f657806387fa699714610a0b578063893d20e814610a205780638b91bd7314610a355761038c565b80637b66a7da146109495780637d170e261461097c5780638178d60a146109af5761038c565b806341418632116102c1578063611dacd31161025f578063740f1e181161022e578063740f1e181461089557806375ff47bf146108aa5780637905b435146108dd57806379c9ecac146109165761038c565b8063611dacd3146107c3578063618a56c2146107ed578063644fc9351461082057806369f3629a1461086b5761038c565b80634dbeb3871161029b5780634dbeb387146106d75780634f81866b14610708578063558a72971461071d57806357daa7b0146107585761038c565b806341418632146106575780634250644914610681578063461fe3a6146106ad5761038c565b806323cda5761161032e57806338f92fc71161030857806338f92fc71461058f5780633b884de6146105c25780633be8b4a5146105fd5780634107f10a1461062d5761038c565b806323cda576146104ef5780632ab0b0eb14610519578063314d59fc146105435761038c565b8063144236501161036a578063144236501461044a57806315ddcdaf1461047d5780631defc035146104a757806320e5f7a6146104da5761038c565b806311ad747b1461038e57806311f151eb146103ca57806313a8be9d14610411575b005b34801561039a57600080fd5b506103b8600480360360208110156103b157600080fd5b5035610f4b565b60408051918252519081900360200190f35b3480156103d657600080fd5b506103fd600480360360208110156103ed57600080fd5b50356001600160a01b0316610f5d565b604080519115158252519081900360200190f35b34801561041d57600080fd5b506103fd6004803603604081101561043457600080fd5b506001600160a01b0381351690602001356110fe565b34801561045657600080fd5b506103fd6004803603602081101561046d57600080fd5b50356001600160a01b0316611385565b34801561048957600080fd5b506103b8600480360360208110156104a057600080fd5b5035611470565b3480156104b357600080fd5b506103fd600480360360208110156104ca57600080fd5b50356001600160a01b03166114f3565b3480156104e657600080fd5b506103b861161b565b3480156104fb57600080fd5b506103fd6004803603602081101561051257600080fd5b5035611621565b34801561052557600080fd5b506103b86004803603602081101561053c57600080fd5b5035611672565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b031661167d565b6040805192835260208301919091528051918290030190f35b34801561059b57600080fd5b506103fd600480360360208110156105b257600080fd5b50356001600160a01b0316611692565b3480156105ce57600080fd5b506103fd600480360360408110156105e557600080fd5b506001600160a01b038135169060200135151561177d565b34801561060957600080fd5b506103fd6004803603604081101561062057600080fd5b50803590602001356118ea565b34801561063957600080fd5b506103fd6004803603602081101561065057600080fd5b50356119d5565b34801561066357600080fd5b506103b86004803603602081101561067a57600080fd5b5035611a52565b34801561068d57600080fd5b506103fd600480360360208110156106a457600080fd5b50351515611a5d565b3480156106b957600080fd5b506103b8600480360360208110156106d057600080fd5b5035611adb565b3480156106e357600080fd5b506106ec611ae6565b604080516001600160a01b039092168252519081900360200190f35b34801561071457600080fd5b506106ec611af5565b34801561072957600080fd5b506103fd6004803603604081101561074057600080fd5b506001600160a01b0381351690602001351515611b04565b34801561076457600080fd5b506107a5600480360360a081101561077b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611bf7565b60408051938452602084019290925282820152519081900360600190f35b3480156107cf57600080fd5b506103fd600480360360208110156107e657600080fd5b5035611ead565b3480156107f957600080fd5b506103fd6004803603602081101561081057600080fd5b50356001600160a01b031661202e565b34801561082c57600080fd5b506103b8600480360360a081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612119565b34801561087757600080fd5b506107a56004803603602081101561088e57600080fd5b5035612192565b3480156108a157600080fd5b506106ec6121b3565b3480156108b657600080fd5b506103fd600480360360208110156108cd57600080fd5b50356001600160a01b03166121c2565b3480156108e957600080fd5b506103b86004803603604081101561090057600080fd5b506001600160a01b0381351690602001356122ad565b34801561092257600080fd5b506103fd6004803603602081101561093957600080fd5b50356001600160a01b03166123d7565b34801561095557600080fd5b506103fd6004803603602081101561096c57600080fd5b50356001600160a01b03166124c2565b34801561098857600080fd5b506105766004803603602081101561099f57600080fd5b50356001600160a01b031661255a565b3480156109bb57600080fd5b506103b8600480360360808110156109d257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612671565b348015610a0257600080fd5b506103b861290c565b348015610a1757600080fd5b506106ec612912565b348015610a2c57600080fd5b506106ec612921565b348015610a4157600080fd5b506103b860048036036020811015610a5857600080fd5b50356001600160a01b0316612930565b348015610a7457600080fd5b506106ec6129ad565b348015610a8957600080fd5b506103fd60048036036040811015610aa057600080fd5b50803590602001356129bc565b348015610ab957600080fd5b506106ec612aa7565b348015610ace57600080fd5b506106ec612ab6565b348015610ae357600080fd5b506103fd60048036036020811015610afa57600080fd5b50356001600160a01b0316612ac5565b348015610b1657600080fd5b506103fd612bb0565b348015610b2b57600080fd5b506106ec612bb9565b348015610b4057600080fd5b506103b860048036036040811015610b5757600080fd5b506001600160a01b038135169060200135612bc8565b348015610b7957600080fd5b506103fd60048036036020811015610b9057600080fd5b5035612bdb565b348015610ba357600080fd5b506107a5612cbf565b348015610bb857600080fd5b506103fd612e27565b348015610bcd57600080fd5b506103b860048036036020811015610be457600080fd5b5035612e30565b348015610bf757600080fd5b50610c1560048036036020811015610c0e57600080fd5b5035612ea9565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c69578181015183820152602001610c51565b50505050905090810190601f168015610c965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610cb257600080fd5b506103fd60048036036020811015610cc957600080fd5b50356001600160a01b0316613265565b348015610ce557600080fd5b506103b860048036036040811015610cfc57600080fd5b50803590602001356001600160a01b0316613350565b348015610d1e57600080fd5b50610d5360048036036060811015610d3557600080fd5b506001600160a01b0381351690602081013590604001351515613467565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610d9257600080fd5b5061057660048036036040811015610da957600080fd5b506001600160a01b0381351690602001356135c3565b348015610dcb57600080fd5b506103fd60048036036080811015610de257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b811115610e1857600080fd5b820183602082011115610e2a57600080fd5b803590602001918460018302840111600160201b83111715610e4b57600080fd5b5090925090506135db565b348015610e6257600080fd5b506103fd60048036036020811015610e7957600080fd5b50356001600160a01b0316613751565b348015610e9557600080fd5b506103fd60048036036080811015610eac57600080fd5b508035906001600160a01b03602082013516906040810135906060013561383c565b348015610eda57600080fd5b506103fd60048036036040811015610ef157600080fd5b508035906020013515156139b5565b348015610f0c57600080fd5b506103fd613aa4565b348015610f2157600080fd5b506103b860048036036060811015610f3857600080fd5b5080359060208101359060400135613b7f565b6000908152600d602052604090205490565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461100d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fd2578181015183820152602001610fba565b50505050905090810190601f168015610fff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166311f151eb60e01b1781526007549351835193949092169284929182918083835b602083106110865780518252601f199092019160209182019101611067565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b505080925050816110f857fe5b50919050565b6000611108614a58565b60035460408051636803921760e11b81526004810186905281516101009093046001600160a01b03169263d007242e92602480840193919291829003018186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d604081101561117f57600080fd5b5080516020918201516001600160a01b031691830191909152158015825261137957602080820151604080516001600160a01b038881166024808401919091528351808403820181526044938401855280870180516001600160e01b031663c8474ce560e01b17815294516321daf55f60e11b81526004810197885281519281019290925280519596928716956343b5eabe959194849301919080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156112c057600080fd5b815160208301805160405192949293830192919084600160201b8211156112e657600080fd5b9083019060208201858111156112fb57600080fd5b8251600160201b81118282018810171561131457600080fd5b82525081516020918201929091019080838360005b83811015611341578181015183820152602001611329565b50505050905090810190601f16801561136e5780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146113f85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316630144236560e41b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600354604080516315ddcdaf60e01b815260048101849052905160009261010090046001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b1580156114c157600080fd5b505afa1580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b505192915050565b3360008181526001602052604081205490919060ff168061152157506000546001600160a01b038281169116145b61152a57600080fd5b604080516001600160a01b0380861660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631defc03560e01b1781526008549351835193949092169284929182918083835b602083106115a25780518252601f199092019160209182019101611583565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b5050809350508261161457fe5b5050919050565b600c5481565b600354604080516311e6d2bb60e11b815260048101849052905160009261010090046001600160a01b0316916323cda576916024808301926020929190829003018186803b1580156114c157600080fd5b600061137f82613c9a565b60008061168983613ce7565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117055760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166338f92fc760e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117f05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b0316631dc426f360e11b1781526007549351835193949092169284929182918083835b602083106118715780518252601f199092019160209182019101611852565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146118d1576040519150601f19603f3d011682016040523d82523d6000602084013e6118d6565b606091505b505080925050816118e357fe5b5092915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461195d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b0316633be8b4a560e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611a485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050600c55600190565b600061137f82613dd6565b6000611a67614043565b6040805183151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316634250644960e01b1781526007549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600061137f826140c0565b600a546001600160a01b031681565b6007546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611b775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b031663558a729760e01b178152600754935183519394909216928492918291808383602083106118715780518252601f199092019160209182019101611852565b6000806000611c046141ce565b60035460408051631b677ffb60e11b815260048101889052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611d35578181015183820152602001611d1d565b50505050905090810190601f168015611d625780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611dbe57600080fd5b815160208301805160405192949293830192919084600160201b821115611de457600080fd5b908301906020820185811115611df957600080fd5b8251600160201b811182820188101715611e1257600080fd5b82525081516020918201929091019080838360005b83811015611e3f578181015183820152602001611e27565b50505050905090810190601f168015611e6c5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020830191506060811015611e8c57600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611f205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663611dacd360e01b1781526009549251825192936000936060936001600160a01b0390921692869290918291908083835b60208310611f9d5780518252601f199092019160209182019101611f7e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611ffd576040519150601f19603f3d011682016040523d82523d6000602084013e612002565b606091505b50915091508161200e57fe5b80806020019051602081101561202357600080fd5b505195945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146120a15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166330c52b6160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60008061212586613c9a565b9050600061213285613c9a565b9050600061214089876142d4565b5090506000612159866121538486614562565b90614562565b9050806121668986614562565b1115612181576121768185614599565b945050505050612189565b879450505050505b95945050505050565b600d6020526000908152604090208054600182015460029092015490919083565b600b546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146122355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166375ff47bf60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b6000806000806000805b600c5481101561238e57600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d602081101561234457600080fd5b5051156123865761235588826145d0565b90935091506123648583614890565b945061238361237c612375836140c0565b8590614562565b8590614890565b93505b6001016122b7565b50838311156123ca576123bf6123a387613c9a565b6123b96123af896140c0565b6123b987896148ce565b90614599565b94505050505061137f565b5060009695505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461244a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631e727b2b60e21b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146125355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50600680546001600160a01b0319166001600160a01b03939093169290921790915590565b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125c657600080fd5b505afa1580156125da573d6000803e3d6000fd5b505050506040513d60208110156125f057600080fd5b50511561265e5760008061260488846145d0565b90925090506000612614846140c0565b9050600061262185613dd6565b9050600061262f8584614562565b9050600061263d8684614562565b90506126498983614890565b98506126558882614890565b97505050505050505b600101612563565b509092509050915091565b600061267b6141ce565b60035460408051631b677ffb60e11b815260048101859052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b838110156127a8578181015183820152602001612790565b50505050905090810190601f1680156127d55780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561283157600080fd5b815160208301805160405192949293830192919084600160201b82111561285757600080fd5b90830190602082018581111561286c57600080fd5b8251600160201b81118282018810171561288557600080fd5b82525081516020918201929091019080838360005b838110156128b257818101518382015260200161289a565b50505050905090810190601f1680156128df5780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156128fe57600080fd5b505198975050505050505050565b600c5490565b6009546001600160a01b031681565b6000546001600160a01b031690565b604080516001600160a01b0380841660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638b91bd7360e01b17815260085493518351600095869460609491169286929091829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b6000546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612a2f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b03166390cdd94d60e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b6005546001600160a01b031690565b6008546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612b385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663a205c6fd60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60035460ff1690565b6006546001600160a01b031681565b6000612bd483836148f4565b9392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612c4e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663c6adddab60e01b1781526008549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600080600080600360019054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b158015612d8257600080fd5b505afa158015612d96573d6000803e3d6000fd5b505050506040513d6020811015612dac57600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b158015612dee57600080fd5b505afa158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b50519195509350915050909192565b60035460ff1681565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316633386544b60e21b1781526009549251825160009485936060936001600160a01b0390921692869291829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b60008060606000806060600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f0c57600080fd5b505afa158015612f20573d6000803e3d6000fd5b505050506040513d6020811015612f3657600080fd5b50511561325857600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b8381101561304d578181015183820152602001613035565b50505050905090810190601f16801561307a5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156130d457600080fd5b815160208301805160405192949293830192919084600160201b8211156130fa57600080fd5b90830190602082018581111561310f57600080fd5b8251600160201b81118282018810171561312857600080fd5b82525081516020918201929091019080838360005b8381101561315557818101518382015260200161313d565b50505050905090810190601f1680156131825780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156131a157600080fd5b8101908080516040519392919084600160201b8211156131c057600080fd5b9083019060208201858111156131d557600080fd5b8251600160201b8111828201881017156131ee57600080fd5b82525081516020918201929091019080838360005b8381101561321b578181015183820152602001613203565b50505050905090810190601f1680156132485780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146132d85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166369d20bd160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60408051602481018490526001600160a01b0380841660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663dac9f9db60e01b1781526008549351835160009586946060949116928692909182918083835b602083106133d55780518252601f1990920191602091820191016133b6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613435576040519150601f19603f3d011682016040523d82523d6000602084013e61343a565b606091505b50915091508161344657fe5b80806020019051602081101561345b57600080fd5b50519695505050505050565b604080516001600160a01b0380861660248301526044820185905283151560648084019190915283518084039091018152608490920183526020820180516001600160e01b031663dad2829f60e01b17815260085493518351600095869586958695869586959394869460609491909116928692918291908083835b602083106135025780518252601f1990920191602091820191016134e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613562576040519150601f19603f3d011682016040523d82523d6000602084013e613567565b606091505b50915091508161357357fe5b8080602001905160c081101561358857600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b5099509750909550935050505093975093979195509350565b6000806135d084846145d0565b915091509250929050565b6000606063de96f58e60e01b878787878760405160240180868152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600083820181905260408051601f909301601f1990811690950183810390950183529384526020820180516001600160e01b03166001600160e01b0319909d169c909c178c5260095493518251929d50909b60609b506001600160a01b0390941699508c9850965086955091935090915081905083835b602083106136bc5780518252601f19909201916020918201910161369d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461371c576040519150601f19603f3d011682016040523d82523d6000602084013e613721565b606091505b50915091508161372d57fe5b80806020019051602081101561374257600080fd5b50519998505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146137c45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316637290c04f60e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146138af5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602481018790526001600160a01b0380871660448301526064820186905260848083018690528351808403909101815260a490920183526020820180516001600160e01b0316633a2f981d60e21b1781526007549351835193949092169284929182918083835b6020831061393a5780518252601f19909201916020918201910161391b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b505080925050816139ac57fe5b50949350505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314613a285760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516024810185905283151560448083019190915282518083039091018152606490910182526020810180516001600160e01b031663f18490c760e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b60408051600481526024810182526020810180516001600160e01b0316633d40b29d60e21b178152600854925182516000946001600160a01b0316928492918291908083835b60208310613b095780518252601f199092019160209182019101613aea565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613b69576040519150601f19603f3d011682016040523d82523d6000602084013e613b6e565b606091505b50508092505081613b7b57fe5b5090565b604080516024810185905260448101849052606480820184905282518083039091018152608490910182526020810180516001600160e01b031663fe4d27cd60e01b1781526009549251825160009485936060936001600160a01b039092169286929182918083835b60208310613c075780518252601f199092019160209182019101613be8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613c67576040519150601f19603f3d011682016040523d82523d6000602084013e613c6c565b606091505b509150915081613c7857fe5b808060200190516020811015613c8d57600080fd5b5051979650505050505050565b600480546040805163c457fb3760e01b8152928301849052516000926001600160a01b039092169163c457fb37916024808301926020929190829003018186803b1580156114c157600080fd5b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d5357600080fd5b505afa158015613d67573d6000803e3d6000fd5b505050506040513d6020811015613d7d57600080fd5b505115613dce57600080613d9188846145d0565b90925090506000613da1846140c0565b90506000613daf8483614562565b9050613dbb8782614890565b9650613dc78684614890565b9550505050505b600101613cf0565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e3257600080fd5b505afa158015613e46573d6000803e3d6000fd5b505050506040513d6020811015613e5c57600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b83811015613ee5578181015183820152602001613ecd565b50505050905090810190601f168015613f125780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613f6c57600080fd5b815160208301805160405192949293830192919084600160201b821115613f9257600080fd5b908301906020820185811115613fa757600080fd5b8251600160201b811182820188101715613fc057600080fd5b82525081516020918201929091019080838360005b83811015613fed578181015183820152602001613fd5565b50505050905090810190601f16801561401a5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020808401925081101561403957600080fd5b5051949350505050565b3360009081526002602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166140bd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561411c57600080fd5b505afa158015614130573d6000803e3d6000fd5b505050506040513d602081101561414657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d1289493839260449091019190808383600083811015613ee5578181015183820152602001613ecd565b60035460408051632836093360e21b81529051339261010090046001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561421757600080fd5b505afa15801561422b573d6000803e3d6000fd5b505050506040513d602081101561424157600080fd5b50516001600160a01b038281169116148061426957506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906142d05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050565b6000806000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561433257600080fd5b505afa158015614346573d6000803e3d6000fd5b505050506040513d602081101561435c57600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b838110156143f55781810151838201526020016143dd565b50505050905090810190601f1680156144225780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561443f57600080fd5b505afa158015614453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561447c57600080fd5b815160208301805160405192949293830192919084600160201b8211156144a257600080fd5b9083019060208201858111156144b757600080fd5b8251600160201b8111828201881017156144d057600080fd5b82525081516020918201929091019080838360005b838110156144fd5781810151838201526020016144e5565b50505050905090810190601f16801561452a5780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561454c57600080fd5b5080516020909101519097909650945050505050565b6000612bd46145718484614949565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b81525061499c565b6000612bd46145b084670de0b6b3a7640000614949565b83604051806040016040528060018152602001601960fa1b81525061499c565b60008060006145de84613c9a565b90506000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561463b57600080fd5b505afa15801561464f573d6000803e3d6000fd5b505050506040513d602081101561466557600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b838110156146ff5781810151838201526020016146e7565b50505050905090810190601f16801561472c5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561474957600080fd5b505afa15801561475d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561478657600080fd5b815160208301805160405192949293830192919084600160201b8211156147ac57600080fd5b9083019060208201858111156147c157600080fd5b8251600160201b8111828201881017156147da57600080fd5b82525081516020918201929091019080838360005b838110156148075781810151838201526020016147ef565b50505050905090810190601f1680156148345780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561485657600080fd5b508051602090910151909350915060006148708487614562565b9050600061487e8488614562565b919b919a509098505050505050505050565b600082820183811015612bd4576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b6000612bd48383604051806040016040528060018152602001607360f81b8152506149fe565b600080600061490285613ce7565b9092509050816149175760009250505061137f565b8082111561493e5761493561492b85613c9a565b6123b984846148ce565b9250505061137f565b60009250505061137f565b6000826149585750600061137f565b8282028284828161496557fe5b0414612bd4576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b600081836149eb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b508284816149f557fe5b04949350505050565b60008184841115614a505760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b505050900390565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082015260e08101829052610100810182905261012081018290526101408101919091529056fea26469706673582212209c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a45300000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
-----Decoded View---------------
Arg [0] : managerDataStorageAddr (address): 0x34E45203669aADd0d6ac342538AA7b62C9128f4a
Arg [1] : oracleProxyAddr (address): 0x6bA1DDd63A5680B7C666b74a50be28B24D507BeB
Arg [2] : _slotSetterAddr (address): 0xCD9632707EC422759bE2A5b348f8178ff280A453
Arg [3] : _handlerManagerAddr (address): 0x54B932B5512D984AC6c02ebe4f32aD032C41b1b5
Arg [4] : _flashloanAddr (address): 0xE2F26b242107F4C6eE48039555d7211D018AcE37
Arg [5] : breaker (address): 0xd297c9A45AC9851003448C52c2B2b72c11688465
Arg [6] : erc20Addr (address): 0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a
Arg [1] : 0000000000000000000000006ba1ddd63a5680b7c666b74a50be28b24d507beb
Arg [2] : 000000000000000000000000cd9632707ec422759be2a5b348f8178ff280a453
Arg [3] : 00000000000000000000000054b932b5512d984ac6c02ebe4f32ad032c41b1b5
Arg [4] : 000000000000000000000000e2f26b242107f4c6ee48039555d7211d018ace37
Arg [5] : 000000000000000000000000d297c9a45ac9851003448c52c2b2b72c11688465
Arg [6] : 0000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
Deployed Bytecode Sourcemap
19951:31760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50423:132;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50423:132:0;;:::i;:::-;;;;;;;;;;;;;;;;23748:310;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23748:310:0;-1:-1:-1;;;;;23748:310:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28318:507;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28318:507:0;;;;;;;;:::i;21865:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21865:309:0;-1:-1:-1;;;;;21865:309:0;;:::i;35139:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35139:137:0;;:::i;30288:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30288:318:0;-1:-1:-1;;;;;30288:318:0;;:::i;17333:33::-;;;;;;;;;;;;;:::i;34295:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34295:152:0;;:::i;32333:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32333:132:0;;:::i;36444:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36444:163:0;-1:-1:-1;;;;;36444:163:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27800:337;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27800:337:0;-1:-1:-1;;;;;27800:337:0;;:::i;22920:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22920:318:0;;;;;;;;;;:::i;25678:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25678:335:0;;;;;;;:::i;34611:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34611:163:0;;:::i;32612:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32612:152:0;;:::i;23441:302::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23441:302:0;;;;:::i;33444:144::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33444:144:0;;:::i;17266:34::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17266:34:0;;;;;;;;;;;;;;17148:29;;;;;;;;;;;;;:::i;21362:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21362:314:0;;;;;;;;;;:::i;39827:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39827:701:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44371:388;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44371:388:0;;:::i;24394:306::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24394:306:0;-1:-1:-1;;;;;24394:306:0;;:::i;41051:764::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41051:764:0;;;;;;;;;;;;;;;;;;;;;;;:::i;17621:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17621:60:0;;:::i;17305:22::-;;;;;;;;;;;;;:::i;22369:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22369:295:0;-1:-1:-1;;;;;22369:295:0;;:::i;38323:1064::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38323:1064:0;;;;;;;;:::i;25040:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25040:282:0;-1:-1:-1;;;;;25040:282:0;;:::i;51462:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51462:127:0;-1:-1:-1;;;;;51462:127:0;;:::i;36907:1127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36907:1127:0;-1:-1:-1;;;;;36907:1127:0;;:::i;42170:605::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42170:605:0;;;;;;;;;;;;;;;;;;;;:::i;34877:103::-;;;;;;;;;;;;;:::i;17218:28::-;;;;;;;;;;;;;:::i;47519:74::-;;;;;;;;;;;;;:::i;30741:373::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30741:373:0;-1:-1:-1;;;;;30741:373:0;;:::i;16790:20::-;;;;;;;;;;;;;:::i;25327:346::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25327:346:0;;;;;;;:::i;50931:103::-;;;;;;;;;;;;;:::i;17181:33::-;;;;;;;;;;;;;:::i;24705:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24705:330:0;-1:-1:-1;;;;;24705:330:0;;:::i;26102:86::-;;;;;;;;;;;;;:::i;17117:25::-;;;;;;;;;;;;;:::i;35489:182::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35489:182:0;;;;;;;;:::i;31884:308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31884:308:0;;:::i;51174:283::-;;;;;;;;;;;;;:::i;16907:29::-;;;;;;;;;;;;;:::i;43825:351::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43825:351:0;;:::i;26339:659::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26339:659:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;26339:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21052:305;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21052:305:0;-1:-1:-1;;;;;21052:305:0;;:::i;31305:407::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31305:407:0;;;;;;-1:-1:-1;;;;;31305:407:0;;:::i;29124:523::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29124:523:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35952:209;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35952:209:0;;;;;;;;:::i;43133:487::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43133:487:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43133:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43133:487:0;;;;;;;;;;-1:-1:-1;43133:487:0;;-1:-1:-1;43133:487:0;-1:-1:-1;43133:487:0;:::i;24063:326::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24063:326:0;-1:-1:-1;;;;;24063:326:0;;:::i;27195:416::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27195:416:0;;;-1:-1:-1;;;;;27195:416:0;;;;;;;;;;;;;;;:::i;47095:322::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47095:322:0;;;;;;;;;:::i;29828:266::-;;;;;;;;;;;;;:::i;45089:465::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45089:465:0;;;;;;;;;;;;:::i;50423:132::-;50488:7;50510:27;;;:16;:27;;;;;:40;;50423:132::o;23748:310::-;23828:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23871:105:0::1;::::0;;-1:-1:-1;;;;;23871:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23871:105:0::1;-1:-1:-1::0;;;23871:105:0::1;::::0;;23997:14:::1;::::0;:37;;;;23871:105;;23997:14;;::::1;::::0;23871:105;;23997:37;;;;;23871:105;23997:37:::1;;;;;;::::0;;;;-1:-1:-1;;23997:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23984:50;;;;;24046:6;24039:14;;;;18585:1;23748:310:::0;;;:::o;28318:507::-;28412:4;28425:31;;:::i;:::-;28503:19;;:49;;;-1:-1:-1;;;28503:49:0;;;;;;;;;;:19;;;;-1:-1:-1;;;;;28503:19:0;;:39;;:49;;;;;;;;;;;;;:19;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28503:49:0;;;;;;;-1:-1:-1;;;;;28461:91:0;28483:16;;;28461:91;;;;;;;;;28557:246;;28638:16;;;;;28688:103;;;-1:-1:-1;;;;;28688:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28688:103:0;-1:-1:-1;;;28688:103:0;;;28661:136;;-1:-1:-1;;;28661:136:0;;;;;;;;;;;;;;;;;;;28638:16;;28661:20;;;;;;28688:103;;28661:136;;;;28688:103;28661:136;;28688:103;28591:19;28661:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28661:136:0;;;;;;-1:-1:-1;28661:136:0;;;;;;;;;;-1:-1:-1;28661:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28557:246;;28816:4;28809:11;;;28318:507;;;;;:::o;21865:309::-;21942:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21986:105:0::1;::::0;;-1:-1:-1;;;;;21986:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21986:105:0::1;-1:-1:-1::0;;;21986:105:0::1;::::0;;22111:14:::1;::::0;:37;;;;21986:105;;22111:14;;::::1;::::0;21986:105;;22111:37;;;;;21986:105;22111:37:::1;;;;;::::0;;;;-1:-1:-1;;22111:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;35139:137:::0;35227:19;;:44;;;-1:-1:-1;;;35227:44:0;;;;;;;;;;-1:-1:-1;;35227:19:0;;;-1:-1:-1;;;;;35227:19:0;;:37;;:44;;;;;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35227:44:0;;35139:137;-1:-1:-1;;35139:137:0:o;30288:318::-;18731:10;30374:11;18754:17;;;:9;:17;;;;;;30374:11;;18731:10;18754:17;;;:36;;-1:-1:-1;18785:5:0;;-1:-1:-1;;;;;18775:15:0;;;18785:5;;18775:15;18754:36;18746:45;;;;;;30416:103:::1;::::0;;-1:-1:-1;;;;;30416:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;30416:103:0::1;-1:-1:-1::0;;;30416:103:0::1;::::0;;30539:18:::1;::::0;:41;;;;30416:103;;30539:18;;::::1;::::0;30416:103;;30539:41;;;;;30416:103;30539:41:::1;;;;;;::::0;;;;-1:-1:-1;;30539:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30526:54;;;;;30594:6;30587:14;;;;18796:1;30288:318:::0;;;;:::o;17333:33::-;;;;:::o;34295:152::-;34389:19;;:53;;;-1:-1:-1;;;34389:53:0;;;;;;;;;;-1:-1:-1;;34389:19:0;;;-1:-1:-1;;;;;34389:19:0;;:42;;:53;;;;;;;;;;;;;;:19;:53;;;;;;;;;;32333:132;32405:7;32428:32;32450:9;32428:21;:32::i;36444:163::-;36531:7;36540;36563:39;36593:8;36563:29;:39::i;:::-;36556:46;;;;36444:163;;;:::o;27800:337::-;27891:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27935:119:0::1;::::0;;-1:-1:-1;;;;;27935:119:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;27935:119:0::1;-1:-1:-1::0;;;27935:119:0::1;::::0;;28074:14:::1;::::0;:37;;;;27935:119;;28074:14;;::::1;::::0;27935:119;;28074:37;;;;;27935:119;28074:37:::1;;;;;::::0;;;;-1:-1:-1;;28074:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;22920:318:::0;23004:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23048:107:0::1;::::0;;-1:-1:-1;;;;;23048:107:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23048:107:0::1;-1:-1:-1::0;;;23048:107:0::1;::::0;;23175:14:::1;::::0;:37;;;;23048:107;;23175:14;;::::1;::::0;23048:107;;23175:37;;;;;23048:107;23175:37:::1;;;;;;::::0;;;;-1:-1:-1;;23175:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23162:50;;;;;23226:6;23219:14;;;;18585:1;22920:318:::0;;;;:::o;25678:335::-;25767:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25810:121:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25810:121:0::1;-1:-1:-1::0;;;25810:121:0::1;::::0;;25952:14:::1;::::0;:37;;;;25810:121;;-1:-1:-1;;;;;25952:14:0::1;::::0;25810:121;;25952:37;;;;25810:121;25952:37:::1;;;;;::::0;;;;-1:-1:-1;;25952:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;34611:163:::0;34700:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34713:18:0::1;:40:::0;34765:4:::1;::::0;34611:163::o;32612:152::-;32694:7;32717:42;32749:9;32717:31;:42::i;23441:302::-;23515:11;19523:12;:10;:12::i;:::-;23557:103:::1;::::0;;;::::1;;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23557:103:0::1;-1:-1:-1::0;;;23557:103:0::1;::::0;;23680:14:::1;::::0;:37;;;;23557:103;;-1:-1:-1;;;;;23680:14:0::1;::::0;23557:103;;23680:37;;;;23557:103;23680:37:::1;;;;;::::0;;;;-1:-1:-1;;23680:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;33444:144:::0;33522:7;33545:38;33573:9;33545:27;:38::i;17266:34::-;;;-1:-1:-1;;;;;17266:34:0;;:::o;17148:29::-;;;-1:-1:-1;;;;;17148:29:0;;:::o;21362:314::-;21449:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21491:102:0::1;::::0;;-1:-1:-1;;;;;21491:102:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21491:102:0::1;-1:-1:-1::0;;;21491:102:0::1;::::0;;21613:14:::1;::::0;:37;;;;21491:102;;21613:14;;::::1;::::0;21491:102;;21613:37;;;;;21491:102;21613:37:::1;;;;;::::0;;;;-1:-1:-1;;21613:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;39827:701:::0;40042:7;40051;40060;19059:23;:21;:23::i;:::-;40103:19:::1;::::0;:59:::1;::::0;;-1:-1:-1;;;40103:59:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;40103:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;40103:19:0::1;::::0;:39:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;:19;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40103:59:0;40249:168:::1;::::0;;-1:-1:-1;;;;;40249:168:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;40103:59:::1;40249:168:::0;;::::1;::::0;;-1:-1:-1;;;;;40249:168:0::1;-1:-1:-1::0;;;40249:168:0::1;::::0;;40433:31;;-1:-1:-1;;;;;;40433:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;40103:59;;-1:-1:-1;40103:59:0;;40249:168;;40433:25;;::::1;::::0;::::1;::::0;40249:168;;40433:31;;;;;;;;40249:168;40167:19:::1;40433:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40433:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;40433:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;40433:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;40433:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;40433:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40433:31:0::1;::::0;-1:-1:-1;;40478:45:0;;40422:42;;-1:-1:-1;;40478:45:0::1;::::0;::::1;::::0;-1:-1:-1;40478:45:0::1;::::0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;40478:45:0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;40478:45:0;-1:-1:-1;39827:701:0;-1:-1:-1;;;;;;;;;39827:701:0:o;44371:388::-;44462:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44500:104:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;44500:104:0::1;-1:-1:-1::0;;;44500:104:0::1;::::0;;44652:13:::1;::::0;:36;;;;44500:104;;-1:-1:-1;;44476:21:0::1;::::0;-1:-1:-1;;;;;44652:13:0;;::::1;::::0;44500:104;;44652:36;;;;44500:104;44652:36;;44500:104;44652:36:::1;;;;;;::::0;;;;-1:-1:-1;;44652:36:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44611:77;;;;44700:6;44693:14;;;;44732:10;44721:30;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44721:30:0;;44371:388;-1:-1:-1;;;;;44371:388:0:o;24394:306::-;24472:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24515:103:0::1;::::0;;-1:-1:-1;;;;;24515:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24515:103:0::1;-1:-1:-1::0;;;24515:103:0::1;::::0;;24639:14:::1;::::0;:37;;;;24515:103;;24639:14;;::::1;::::0;24515:103;;24639:37;;;;;24515:103;24639:37:::1;;;;;::::0;;;;-1:-1:-1;;24639:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;41051:764:::0;41242:7;41258:22;41283:41;41305:18;41283:21;:41::i;:::-;41258:66;;41329:19;41351:38;41373:15;41351:21;:38::i;:::-;41329:60;;41394:39;41476:54;41494:18;41514:15;41476:17;:54::i;:::-;-1:-1:-1;41438:92:0;-1:-1:-1;41535:19:0;41557:79;41624:11;41557:55;41438:92;41600:11;41557:42;:55::i;:::-;:66;;:79::i;:::-;41535:101;-1:-1:-1;41535:101:0;41645:42;:15;41672:14;41645:26;:42::i;:::-;:56;41641:168;;;41719:38;:11;41742:14;41719:22;:38::i;:::-;41712:45;;;;;;;;41641:168;41788:15;41781:22;;;;;;41051:764;;;;;;;;:::o;17621:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17305:22::-;;;-1:-1:-1;;;;;17305:22:0;;:::o;22369:295::-;22438:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22482:99:0::1;::::0;;-1:-1:-1;;;;;22482:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22482:99:0::1;-1:-1:-1::0;;;22482:99:0::1;::::0;;22601:14:::1;::::0;:37;;;;22482:99;;22601:14;;::::1;::::0;22482:99;;22601:37;;;;;22482:99;22601:37:::1;;;;;::::0;;;;-1:-1:-1;;22601:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;38323:1064:::0;38429:7;38445:28;38478:34;38517:27;38549:26;38585:17;38580:536;38616:18;;38604:9;:30;38580:536;;;38662:19;;;;;;;;;-1:-1:-1;;;;;38662:19:0;-1:-1:-1;;;;;38662:42:0;;38705:9;38662:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38662:53:0;38658:453;;;38774:58;38812:8;38822:9;38774:37;:58::i;:::-;38730:102;;-1:-1:-1;38730:102:0;-1:-1:-1;38862:44:0;:20;38730:102;38862:24;:44::i;:::-;38839:67;;38942:162;39002:87;39049:38;39077:9;39049:27;:38::i;:::-;39002:19;;:45;:87::i;:::-;38942:26;;:44;:162::i;:::-;38913:191;;38658:453;38636:11;;38580:536;;;;39155:20;39126:26;:49;39122:248;;;39193:171;39331:31;39353:8;39331:21;:31::i;:::-;39193:118;39272:37;39300:8;39272:27;:37::i;:::-;39193:59;:26;39231:20;39193:37;:59::i;:::-;:77;;:118::i;:171::-;39186:178;;;;;;;;39122:248;-1:-1:-1;39381:1:0;;38323:1064;-1:-1:-1;;;;;;38323:1064:0:o;25040:282::-;25106:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25149:91:0::1;::::0;;-1:-1:-1;;;;;25149:91:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25149:91:0::1;-1:-1:-1::0;;;25149:91:0::1;::::0;;25261:14:::1;::::0;:37;;;;25149:91;;25261:14;;::::1;::::0;25149:91;;25261:37;;;;;25149:91;25261:37:::1;;;;;::::0;;;;-1:-1:-1;;25261:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51462:127:::0;51537:4;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51548:8:0::1;:36:::0;;-1:-1:-1;;;;;;51548:36:0::1;-1:-1:-1::0;;;;;51548:36:0;;;::::1;::::0;;;::::1;::::0;;;;51462:127::o;36907:1127::-;36988:7;36997;37013:33;37051:37;37100:17;37095:863;37131:18;;37119:9;:30;37095:863;;;37177:19;;;;;;;;;-1:-1:-1;;;;;37177:19:0;-1:-1:-1;;;;;37177:42:0;;37220:9;37177:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37177:53:0;37173:778;;;37243:27;37277:26;37354:58;37392:8;37402:9;37354:37;:58::i;:::-;37310:102;;-1:-1:-1;37310:102:0;-1:-1:-1;37419:19:0;37441:38;37469:9;37441:27;:38::i;:::-;37419:60;;37486:23;37512:42;37544:9;37512:31;:42::i;:::-;37486:68;-1:-1:-1;37561:28:0;37592:43;:19;37623:11;37592:30;:43::i;:::-;37561:74;-1:-1:-1;37642:32:0;37677:47;:19;37708:15;37677:30;:47::i;:::-;37642:82;-1:-1:-1;37759:51:0;:25;37789:20;37759:29;:51::i;:::-;37731:79;-1:-1:-1;37849:59:0;:29;37883:24;37849:33;:59::i;:::-;37817:91;;37173:778;;;;;;;37151:11;;37095:863;;;-1:-1:-1;37972:25:0;;-1:-1:-1;37999:29:0;-1:-1:-1;36907:1127:0;;;:::o;42170:605::-;42354:7;19059:23;:21;:23::i;:::-;42397:19:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;42397:50:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;42397:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;42397:19:0::1;::::0;:39:::1;::::0;:50;;;;;::::1;::::0;;;;;;;;:19;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42397:50:0;42532:150:::1;::::0;;-1:-1:-1;;;;;42532:150:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;42397:50:::1;42532:150:::0;;::::1;::::0;;-1:-1:-1;;;;;42532:150:0::1;-1:-1:-1::0;;;42532:150:0::1;::::0;;42698:31;;-1:-1:-1;;;;;;42698:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;42397:50;;-1:-1:-1;42397:50:0;;42532:150;;42698:25;;::::1;::::0;::::1;::::0;42532:150;;42698:31;;;;;;;;42532:150;42452:19:::1;42698:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;42698:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;42698:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;42698:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;42698:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;42698:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42698:31:0::1;::::0;-1:-1:-1;;42743:27:0;;42687:42;;-1:-1:-1;;42743:27:0::1;::::0;;::::1;::::0;-1:-1:-1;42743:27:0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;42743:27:0;;42170:605;-1:-1:-1;;;;;;;;42170:605:0:o;34877:103::-;34957:18;;34877:103;:::o;17218:28::-;;;-1:-1:-1;;;;;17218:28:0;;:::o;47519:74::-;47560:7;47583:5;-1:-1:-1;;;;;47583:5:0;47519:74;:::o;30741:373::-;30851:99;;;-1:-1:-1;;;;;30851:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30851:99:0;-1:-1:-1;;;30851:99:0;;;30998:18;;:41;;;;30809:7;;;;30827:21;;30998:18;;;30851:99;;30998:41;;;;;;30851:99;30998:41;;;;;;;;;-1:-1:-1;;30998:41:0;;;;;;;;;;;;16790:20;;;-1:-1:-1;;;;;16790:20:0;;:::o;25327:346::-;25421:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25464:127:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25464:127:0::1;-1:-1:-1::0;;;25464:127:0::1;::::0;;25612:14:::1;::::0;:37;;;;25464:127;;-1:-1:-1;;;;;25612:14:0::1;::::0;25464:127;;25612:37;;;;25464:127;25612:37:::1;;;;;::::0;;;;-1:-1:-1;;25612:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;50931:103:::0;51009:19;;-1:-1:-1;;;;;51009:19:0;50931:103;:::o;17181:33::-;;;-1:-1:-1;;;;;17181:33:0;;:::o;24705:330::-;24795:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24838:115:0::1;::::0;;-1:-1:-1;;;;;24838:115:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24838:115:0::1;-1:-1:-1::0;;;24838:115:0::1;::::0;;24974:14:::1;::::0;:37;;;;24838:115;;24974:14;;::::1;::::0;24838:115;;24974:37;;;;;24838:115;24974:37:::1;;;;;::::0;;;;-1:-1:-1;;24974:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;26102:86:::0;26174:9;;;;26102:86;:::o;17117:25::-;;;-1:-1:-1;;;;;17117:25:0;;:::o;35489:182::-;35594:7;35617:49;35646:8;35656:9;35617:28;:49::i;:::-;35610:56;35489:182;-1:-1:-1;;;35489:182:0:o;31884:308::-;31958:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32002:103:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;32002:103:0::1;-1:-1:-1::0;;;32002:103:0::1;::::0;;32125:18:::1;::::0;:41;;;;32002:103;;-1:-1:-1;;;;;32125:18:0::1;::::0;32002:103;;32125:41;;;;32002:103;32125:41:::1;;;;;::::0;;;;-1:-1:-1;;32125:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51174:283:::0;51228:7;51237;51246;51262:32;51297:19;;;;;;;;;-1:-1:-1;;;;;51297:19:0;51262:54;;51329:12;-1:-1:-1;;;;;51329:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51329:38:0;51369:39;;;-1:-1:-1;;;51369:39:0;;;;-1:-1:-1;;;;;51369:37:0;;;;;:39;;;;;51329:38;;51369:39;;;;;;;:37;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51369:39:0;51410:41;;;-1:-1:-1;;;51410:41:0;;;;-1:-1:-1;;;;;51410:39:0;;;;;:41;;;;;51369:39;;51410:41;;;;;;;:39;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51410:41:0;51321:131;;-1:-1:-1;51321:131:0;-1:-1:-1;51410:41:0;-1:-1:-1;;51174:283:0;;;:::o;16907:29::-;;;;;;:::o;43825:351::-;43923:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43923:95:0;-1:-1:-1;;;43923:95:0;;;44066:13;;:36;;;;43883:7;;;;43899:21;;-1:-1:-1;;;;;44066:13:0;;;;43923:95;;44066:36;;;;;43923:95;44066:36;;;;;;;;;-1:-1:-1;;44066:36:0;;;;;;;;;;;;26339:659;26410:4;26416:7;26425:13;26447:12;26464:24;26493:23;26525:19;;;;;;;;;-1:-1:-1;;;;;26525:19:0;-1:-1:-1;;;;;26525:42:0;;26568:9;26525:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26525:53:0;26521:421;;;26608:19;;;;;;;;;-1:-1:-1;;;;;26608:19:0;-1:-1:-1;;;;;26608:39:0;;26648:9;26608:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26608:50:0;26786:80;;;;;;;;;;;;;26608:50;26786:80;;;;;-1:-1:-1;;;;;26786:80:0;-1:-1:-1;;;26786:80:0;;;26750:122;;-1:-1:-1;;;26750:122:0;;;;;;;;;;;;;;;;;;;26608:50;;-1:-1:-1;26608:50:0;;26716:17;;-1:-1:-1;;;;;26750:29:0;;;;;26786:80;;26750:122;;;;;;;;26786:80;26750:122;;26786:80;26664:19;26750:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26750:122:0;;;;;;-1:-1:-1;26750:122:0;;;;;;;;;;-1:-1:-1;26750:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26750:122:0;;-1:-1:-1;;26890:26:0;;26739:133;;-1:-1:-1;;26890:26:0;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26890:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26890:26:0;;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;-1:-1:-1;26890:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26878:38;;26932:4;26922:14;;26521:421;;;26956:7;;26965:16;;-1:-1:-1;26956:7:0;;-1:-1:-1;26339:659:0;-1:-1:-1;;26339:659:0:o;21052:305::-;21129:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21173:99:0::1;::::0;;-1:-1:-1;;;;;21173:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21173:99:0::1;-1:-1:-1::0;;;21173:99:0::1;::::0;;21294:14:::1;::::0;:37;;;;21173:99;;21294:14;;::::1;::::0;21173:99;;21294:37;;;;;21173:99;21294:37:::1;;;;;::::0;;;;-1:-1:-1;;21294:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;31305:407:::0;31434:114;;;;;;;;;-1:-1:-1;;;;;31434:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31434:114:0;-1:-1:-1;;;31434:114:0;;;31596:18;;:41;;;;31396:7;;;;31410:21;;31596:18;;;31434:114;;31596:41;;;;;;31434:114;31596:41;;;;;;;;;;-1:-1:-1;;31596:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31555:82;;;;31651:6;31644:14;;;;31685:10;31674:33;;;;;;;;;;;;;;;-1:-1:-1;31674:33:0;;31305:407;-1:-1:-1;;;;;;31305:407:0:o;29124:523::-;29316:121;;;-1:-1:-1;;;;;29316:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29316:121:0;-1:-1:-1;;;29316:121:0;;;29485:18;;:41;;;;29231:7;;;;;;;;;;;;29316:121;;29231:7;;29292:21;;29485:18;;;;;29316:121;;29485:41;;;29316:121;29485:41;;29316:121;29485:41;;;;;;;;;;-1:-1:-1;;29485:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29444:82;;;;29540:6;29533:14;;;;29574:10;29563:78;;;;;;;;;;;;;;;-1:-1:-1;29563:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29563:78:0;;-1:-1:-1;29563:78:0;-1:-1:-1;29563:78:0;-1:-1:-1;29563:78:0;;-1:-1:-1;29563:78:0;-1:-1:-1;;;;29124:523:0;;;;;;;;;;:::o;35952:209::-;36066:7;36075;36098:58;36136:8;36146:9;36098:37;:58::i;:::-;36091:65;;;;35952:209;;;;;:::o;43133:487::-;43288:4;43303:21;43356:42;;;43405:9;43416:15;43433:6;43441;;43327:126;;;;;;;;;;;-1:-1:-1;;;;;43327:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43327:126:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43327:126:0;-1:-1:-1;;;;;;43327:126:0;;;;;;;;;43505:13;;:36;;;;43327:126;;-1:-1:-1;43327:126:0;;43478:23;;-1:-1:-1;;;;;;43505:13:0;;;;-1:-1:-1;43327:126:0;;-1:-1:-1;43505:36:0;-1:-1:-1;43505:36:0;;-1:-1:-1;43327:126:0;;-1:-1:-1;43505:36:0;;-1:-1:-1;43505:36:0;;-1:-1:-1;43505:36:0;43327:126;43505:36;;;;;;;;;;-1:-1:-1;;43505:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43464:77;;;;43557:6;43550:14;;;;43593:10;43582:30;;;;;;;;;;;;;;;-1:-1:-1;43582:30:0;;43133:487;-1:-1:-1;;;;;;;;;43133:487:0:o;24063:326::-;24151:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24194:113:0::1;::::0;;-1:-1:-1;;;;;24194:113:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24194:113:0::1;-1:-1:-1::0;;;24194:113:0::1;::::0;;24328:14:::1;::::0;:37;;;;24194:113;;24328:14;;::::1;::::0;24194:113;;24328:37;;;;;24194:113;24328:37:::1;;;;;::::0;;;;-1:-1:-1;;24328:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;27195:416:::0;27337:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27379:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;27379:150:0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;27379:150:0::1;-1:-1:-1::0;;;27379:150:0::1;::::0;;27550:14:::1;::::0;:37;;;;27379:150;;27550:14;;::::1;::::0;27379:150;;27550:37;;;;;27379:150;27550:37:::1;;;;;;::::0;;;;-1:-1:-1;;27550:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27537:50;;;;;27599:6;27592:14;;;;18585:1;27195:416:::0;;;;;;:::o;47095:322::-;47181:11;18562:5;;18569:10;;;;;;;;;18562:5;18569:10;;-1:-1:-1;;;18569:10:0;;;;;-1:-1:-1;;;;;18562:5:0;18548:10;:19;18540:40;;;;-1:-1:-1;;;18540:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47223:111:0::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;47223:111:0::1;-1:-1:-1::0;;;47223:111:0::1;::::0;;47354:14:::1;::::0;:37;;;;47223:111;;-1:-1:-1;;;;;47354:14:0::1;::::0;47223:111;;47354:37;;;;47223:111;47354:37:::1;;;;;::::0;;;;-1:-1:-1;;47354:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;29828:266:::0;29920:86;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29920:86:0;-1:-1:-1;;;29920:86:0;;;30026:18;;:41;;;;29878:11;;-1:-1:-1;;;;;30026:18:0;;29920:86;;30026:41;;;29920:86;30026:41;;29920:86;30026:41;;;;;;;;;;-1:-1:-1;;30026:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30013:54;;;;;30082:6;30075:14;;;;29828:266;;:::o;45089:465::-;45261:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45261:123:0;-1:-1:-1;;;45261:123:0;;;45436:13;;:36;;;;45219:7;;;;45237:21;;-1:-1:-1;;;;;45436:13:0;;;;45261:123;;45436:36;;;;;45261:123;45436:36;;;;;;;;;;-1:-1:-1;;45436:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45395:77;;;;45488:6;45481:14;;;;45524:10;45513:33;;;;;;;;;;;;;;;-1:-1:-1;45513:33:0;;45089:465;-1:-1:-1;;;;;;;45089:465:0:o;50695:139::-;50792:11;;;:36;;;-1:-1:-1;;;50792:36:0;;;;;;;;;50768:7;;-1:-1:-1;;;;;50792:11:0;;;;:25;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;48849:886;48937:7;48946;48962:26;48993:25;49028:17;49023:655;49059:18;;49047:9;:30;49023:655;;;49105:19;;;;;;;;;-1:-1:-1;;;;;49105:19:0;-1:-1:-1;;;;;49105:42:0;;49148:9;49105:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49105:53:0;49101:570;;;49171:27;49205:26;49282:58;49320:8;49330:9;49282:37;:58::i;:::-;49238:102;;-1:-1:-1;49238:102:0;-1:-1:-1;49347:19:0;49369:38;49397:9;49369:27;:38::i;:::-;49347:60;-1:-1:-1;49414:28:0;49445:43;:19;49347:60;49445:30;:43::i;:::-;49414:74;-1:-1:-1;49516:44:0;:18;49414:74;49516:22;:44::i;:::-;49495:65;-1:-1:-1;49587:41:0;:17;49609:18;49587:21;:41::i;:::-;49567:61;;49101:570;;;;;49079:11;;49023:655;;32911:396;32994:7;33010:19;33039;;;;;;;;;-1:-1:-1;;;;;33039:19:0;-1:-1:-1;;;;;33039:39:0;;33079:9;33039:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33039:50:0;33163:95;;;;;;;;;;;;;33039:50;33163:95;;;;;-1:-1:-1;;;;;33163:95:0;-1:-1:-1;;;33163:95:0;;;33128:135;;-1:-1:-1;;;33128:135:0;;;;;;;;;;;;;;;;;;;33039:50;;-1:-1:-1;33095:17:0;;-1:-1:-1;;;;;33128:29:0;;;;;33163:95;33128:135;;;;;;;33163:95;33128:135;;33163:95;;33128:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33128:135:0;;;;;;-1:-1:-1;33128:135:0;;;;;;;;;;-1:-1:-1;33128:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33128:135:0;;-1:-1:-1;;33275:27:0;;33117:146;;-1:-1:-1;;33275:27:0;;;;;-1:-1:-1;33275:27:0;;;;;;;;;-1:-1:-1;33275:27:0;;32911:396;-1:-1:-1;;;;32911:396:0:o;19551:98::-;19613:10;19600:24;;;;:12;:24;;;;;;;;;:29;19631:12;;;;;;;;19600:29;19631:12;;-1:-1:-1;;;19631:12:0;;;;;;;19600:29;;19592:52;;;;-1:-1:-1;;;19592:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19551:98::o;33725:390::-;33804:7;33820:19;33849;;;;;;;;;-1:-1:-1;;;;;33849:19:0;-1:-1:-1;;;;;33849:39:0;;33889:9;33849:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33849:50:0;33975:91;;;;;;;;;;;;;33849:50;33975:91;;;;;-1:-1:-1;;;;;33975:91:0;-1:-1:-1;;;33975:91:0;;;33940:131;;-1:-1:-1;;;33940:131:0;;;;;;;;;;;;;;;;;;;33849:50;;-1:-1:-1;33907:17:0;;-1:-1:-1;;;;;33940:29:0;;;;;33975:91;33940:131;;;;;;;33975:91;33940:131;;33975:91;;33940:131;;;;;;;;;;;;;;;;;;19098:213;19207:19;;:47;;;-1:-1:-1;;;19207:47:0;;;;19170:10;;19207:19;;;-1:-1:-1;;;;;19207:19:0;;:45;;:47;;;;;;;;;;;;;;:19;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19207:47:0;-1:-1:-1;;;;;19194:60:0;;;;;;;19193:86;;-1:-1:-1;19273:5:0;;-1:-1:-1;;;;;19260:18:0;;;19273:5;;19260:18;19193:86;19281:24;;;;;;;;;;;;;-1:-1:-1;;;19281:24:0;;;19185:121;;;;;-1:-1:-1;;;19185:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19098:213;:::o;45770:424::-;45865:7;45874;45890:19;45919;;;;;;;;;-1:-1:-1;;;;;45919:19:0;-1:-1:-1;;;;;45919:39:0;;45959:9;45919:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45919:50:0;46043:93;;;-1:-1:-1;;;;;46043:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;45919:50;46043:93;;;;;-1:-1:-1;;;;;46043:93:0;-1:-1:-1;;;46043:93:0;;;46008:133;;-1:-1:-1;;;46008:133:0;;;;;;;;;;;;;;;;;;;45919:50;;-1:-1:-1;45975:17:0;;46008:29;;;;;;46043:93;;46008:133;;;;;;;;46043:93;-1:-1:-1;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46008:133:0;;;;;;-1:-1:-1;46008:133:0;;;;;;;;;;-1:-1:-1;46008:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45997:144;;;;;;46164:4;46153:36;;;;;;;;;;;;;;;-1:-1:-1;46153:36:0;;;;;;;;;;;-1:-1:-1;45770:424:0;-1:-1:-1;;;;;45770:424:0:o;5159:128::-;5224:7;5247:35;5252:10;5257:1;5260;5252:4;:10::i;:::-;4004:8;5247:35;;;;;;;;;;;;;-1:-1:-1;;;5247:35:0;;;:4;:35::i;5026:128::-;5091:7;5114:35;5119:21;5124:1;4004:8;5119:4;:21::i;:::-;5142:1;5114:35;;;;;;;;;;;;;-1:-1:-1;;;5114:35:0;;;:4;:35::i;47828:738::-;47943:7;47952;47968:13;47984:32;48006:9;47984:21;:32::i;:::-;47968:48;;48021:19;48050;;;;;;;;;-1:-1:-1;;;;;48050:19:0;-1:-1:-1;;;;;48050:39:0;;48090:9;48050:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48050:50:0;48227:99;;;-1:-1:-1;;;;;48227:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;48050:50;48227:99;;;;;-1:-1:-1;;;;;48227:99:0;-1:-1:-1;;;48227:99:0;;;48192:139;;-1:-1:-1;;;48192:139:0;;;;;;;;;;;;;;;;;;;48050:50;;-1:-1:-1;48106:21:0;;;;48159:17;;48192:29;;;;;;:139;;;;;48227:99;48192:139;;48227:99;48106:21;48192:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48192:139:0;;;;;;-1:-1:-1;48192:139:0;;;;;;;;;;-1:-1:-1;48192:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48181:150;;;;;;48379:4;48368:36;;;;;;;;;;;;;;;-1:-1:-1;48368:36:0;;;;;;;;;-1:-1:-1;48368:36:0;-1:-1:-1;48411:20:0;48434:31;48368:36;48459:5;48434:24;:31::i;:::-;48411:54;-1:-1:-1;48470:19:0;48492:30;:12;48516:5;48492:23;:30::i;:::-;48535:12;;;;-1:-1:-1;47828:738:0;;-1:-1:-1;;;;;;;;;47828:738:0:o;4071:134::-;4129:7;4157:5;;;4175:6;;;;4167:20;;;;;-1:-1:-1;;;4167:20:0;;;;;;;;;;;;-1:-1:-1;;;4167:20:0;;;;;;;;;;;;;;4210:101;4268:7;4291:15;4296:1;4299;4291:15;;;;;;;;;;;;;-1:-1:-1;;;4291:15:0;;;:4;:15::i;49950:468::-;50056:7;50070:21;50096:20;50153:39;50183:8;50153:29;:39::i;:::-;50121:71;;-1:-1:-1;50121:71:0;-1:-1:-1;50201:18:0;50197:47;;50237:1;50230:8;;;;;;50197:47;50270:12;50254:13;:28;50250:164;;;50300:76;50343:32;50365:9;50343:21;:32::i;:::-;50300:31;:13;50318:12;50300:17;:31::i;:76::-;50293:83;;;;;;50250:164;50407:1;50400:8;;;;;;4682:181;4741:7;4761:6;4757:35;;-1:-1:-1;4785:1:0;4778:8;;4757:35;4810:4;;;4813:1;4810;:4;:1;4828:5;;;;;4827:12;4819:26;;;;;-1:-1:-1;;;4819:26:0;;;;;;;;;;;;-1:-1:-1;;;4819:26:0;;;;;;;;;;;;;;4868:153;4955:7;4986:12;4979:5;4971:28;;;;-1:-1:-1;;;4971:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5015:1;5011;:5;;;;;;;4868:153;-1:-1:-1;;;;4868:153:0:o;4523:154::-;4610:7;4642:12;4634:6;;;;4626:29;;;;-1:-1:-1;;;4626:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4667:5:0;;;4523:154::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://9c27d725402a01cdac29142126c54e32700ba307fb85f2df74cabc8b0ee048c6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.