Contract 0x8010F9E14C8286B9312e624370fdDC07fee2Fc75

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8aa69dc82168b6617503bcd2e4e958cb68de247b84f32688313dc387294baf21Reward Claim All130819632021-11-30 17:24:381 hr 16 mins ago0x02ef9f32855be2ae5e548b2adcd32a9149c45fdf IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003176955
0x57e97c88410b1ca654d453364acdc52c68daad42bbc0ae5ba0f745ef385a7adbReward Claim All130799482021-11-30 15:38:263 hrs 2 mins ago0x9319f8c6e7512d635238376f0bbb7a051b16e35d IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00318028
0x536f24cd68a5d898f3a858c79d6dc31875974e38a7853746b47f54862de8d9d4Reward Claim All130767952021-11-30 12:50:015 hrs 51 mins ago0x0103c440765039fd90c4d41db564b21f9bc0c82a IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00333263
0x71ea369e074ff682db8c4ebd749ff224f255b417818e60a643122212329e4539Reward Claim All130666532021-11-30 3:44:2414 hrs 56 mins ago0xa36f7429f69dde0e0d95043dce1c78084068c6f5 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003082255
0x4c295ff6f783a7d9a31f1ec0d79baf7e0665b1173d579d558798fe08a88bd819Reward Claim All130659192021-11-30 3:04:2415 hrs 36 mins ago0x5e5824ec80615fc698c50a1d459fa21e105b55f3 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003187605
0x7e9053dbde4aee4d0795b21624b38fca4b112c5cc2c09f38f826f4ae7bc0c5beReward Claim All130554642021-11-29 17:38:361 day 1 hr ago0xcbbcf45a1aeddaf93ed0c8a558fcb8f021225610 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003711936
0x1c6d12acccc96a1355a753ef24c54aa0a3327cf177e28c52a30082ae164f9540Reward Claim All130536322021-11-29 15:58:201 day 2 hrs ago0xda63d54d5981574832406ee4cde504c56cee6b5f IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003384055
0x20855c5e498b33be59c127247ac469920f7c2c71a18f17422e7690d99e1c2c29Reward Claim All130439702021-11-29 6:51:341 day 11 hrs ago0x5e5824ec80615fc698c50a1d459fa21e105b55f3 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003133605
0x00f9f766e954057bd91d445fd294e4f3e347b291d7c4cb03c8e82da1ecc27c88Reward Claim All130416942021-11-29 4:47:491 day 13 hrs ago0x897c67ca1f74b8a284c9f6c91a86f9238974662b IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.004978356
0xa33d9ba1737abf24956cdcc78ab2a1262aa0f6f5881842b918decef706257351Reward Claim All130338722021-11-28 21:42:371 day 20 hrs ago0x27afb6dfcefa4cec0f7cdb66b8478e941bad0322 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00400173
0xe62742021c542f15fa14f980bd312e3b1d8569b34b41230bb52ef3b28913eaceReward Claim All130307712021-11-28 18:55:591 day 23 hrs ago0xd186214e1b12414a2bdd499960a3e39fb8626714 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003876055
0xe60b6844b1f0ab1d0fe69449dba549ed6e9ff8bbdfac69b3f52707ef2d34bbb7Reward Claim All130283482021-11-28 16:44:552 days 1 hr ago0x4f6f32e1692566d335e7498a1ff9a1c1af43106b IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00420573
0x0874847c3bb540ffb682d8ecbadd6de12d682546ea637abdda0970399fe03b9fReward Claim All130222862021-11-28 11:14:102 days 7 hrs ago0xcbbcf45a1aeddaf93ed0c8a558fcb8f021225610 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003845526
0x27b8de3b9bf115a70e36850ee98445c95826ac169bdfee3a559b4d7fff6ef7aeReward Claim All130184002021-11-28 7:50:492 days 10 hrs ago0x1700e8d97162ba9ec7d869972a54726a1564fc87 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00312622
0xf0863ef40d81d000fa602ba6c34319d07d7bbeda021f16d6bc987024b834a439Reward Claim All130132812021-11-28 3:15:472 days 15 hrs ago0x5e5824ec80615fc698c50a1d459fa21e105b55f3 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003133605
0xe76128cea2c8b3043b96c1d70a1c0f70525a1a0b4e7f0839920bf6599f391bd6Reward Claim All130096812021-11-27 23:59:512 days 18 hrs ago0x5333d770505c47d57e0a02642fae17cf6a82ccfc IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003237605
0xd5ed7c8ec6b81ac38a921de78c02adff13b6df8384273b32c0d8d9c3654ebd45Reward Claim All129926162021-11-27 8:48:473 days 9 hrs ago0x0285c10aa06ac166f2576ab2d3473fc42cefb933 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00324403
0x1a386a40ad90284fd47bd4bdc6d4fed25c57249171eab6df54199591200d2478Reward Claim All129894892021-11-27 6:01:293 days 12 hrs ago0x5e5824ec80615fc698c50a1d459fa21e105b55f3 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003133605
0x22b67a4ec9cf090089b94a37d539b1311cb99fa3f6278f91778532c277dbc740Reward Claim All129771692021-11-26 18:55:273 days 23 hrs ago0xdb10d21f28a34fd04e4425eac777483798f7e217 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003176955
0xbe9c437ce04538aab01b64f71a43d4daa1ee8fbbcc36e9c58827e8e5fd88b83aReward Claim All129737732021-11-26 15:53:144 days 2 hrs ago0xcbbcf45a1aeddaf93ed0c8a558fcb8f021225610 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003147505
0xe5fa81274001f332916f449314385fe923294445d59a438541e653a45a1191f0Reward Claim All129723042021-11-26 14:31:584 days 4 hrs ago0xaf955a0be88302a2a7fcd40eac11b4988b7da761 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00324403
0xfdfb92525178935fb9ff69e539954a3213349eaff86177a2477633da917cae83Reward Claim All129703762021-11-26 12:45:244 days 5 hrs ago0x12cfc607505804e4f88eb169bdb0a46b251c09c9 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00325218
0xc1cf1f33f456e43de407b937e5e593e08c50065e778714f654d5286edf4ea5d6Reward Claim All129697742021-11-26 12:13:054 days 6 hrs ago0x2b0133e25e94906bb82bb6f14e900ed03ff281a8 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003096605
0x6e31ea6dad2c2007fd2516835fc7ed6940d71096493af6c9f738ad784b38c2ffReward Claim All129652402021-11-26 8:01:064 days 10 hrs ago0x0f5a92f9a705b9f715aef7a0d367a52281bd26fc IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.003255055
0x383bc975060ecaaef3fd4ff2a20a5256ebd4eb801bb845621e1b274f188ee43cReward Claim All129651312021-11-26 7:54:544 days 10 hrs ago0x0285c10aa06ac166f2576ab2d3473fc42cefb933 IN  0x8010f9e14c8286b9312e624370fddc07fee2fc750 BNB0.00308203
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd32c723c27d28a2e3c721761f26f7d30f9ac7225af3b3d6b8b50aad34381dac3129658622021-11-26 8:37:054 days 10 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c18108.450099790643221647 BNB
0xd32c723c27d28a2e3c721761f26f7d30f9ac7225af3b3d6b8b50aad34381dac3129658622021-11-26 8:37:054 days 10 hrs ago 0xfa3ce6184611c2ae7871b9fac8379e0e598760c3 0x8010f9e14c8286b9312e624370fddc07fee2fc75108.450099790643221647 BNB
0xb0ce213cb4aefeaefb4c3ec80b297cf8a8d9f0c098c4041b873fb4237bded124129577802021-11-26 0:33:204 days 18 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c181.210993065423191908 BNB
0xb0ce213cb4aefeaefb4c3ec80b297cf8a8d9f0c098c4041b873fb4237bded124129577802021-11-26 0:33:204 days 18 hrs ago 0x990c7d72c1382fd19f626084086482508dbffab3 0x8010f9e14c8286b9312e624370fddc07fee2fc751.210993065423191908 BNB
0xec118663dbc45325c95bb00bc1284db9c8dc9988bd2728ca6f12e6bfbc0cbef5128847782021-11-23 7:58:517 days 10 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c181.198074813696 BNB
0xec118663dbc45325c95bb00bc1284db9c8dc9988bd2728ca6f12e6bfbc0cbef5128847782021-11-23 7:58:517 days 10 hrs ago 0x990c7d72c1382fd19f626084086482508dbffab3 0x8010f9e14c8286b9312e624370fddc07fee2fc751.198074813696 BNB
0x16e153e9a5f800677f133ea5a00f9817df1c2bdc7efd67e58d87f174d0654122127205272021-11-17 10:08:1913 days 8 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c18113.300274543653047705 BNB
0x16e153e9a5f800677f133ea5a00f9817df1c2bdc7efd67e58d87f174d0654122127205272021-11-17 10:08:1913 days 8 hrs ago 0xe9c668f59664e42e4b1d106131878b1e33fb5ac2 0x8010f9e14c8286b9312e624370fddc07fee2fc75113.300274543653047705 BNB
0x8604760a9de283775e0e312446f20b82cb49676483d38637f707dc75e2183f1e125318742021-11-10 14:00:2720 days 4 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c1869.539749639125625617 BNB
0x8604760a9de283775e0e312446f20b82cb49676483d38637f707dc75e2183f1e125318742021-11-10 14:00:2720 days 4 hrs ago 0x0944d66a2547e315941813b83b55d2d5ba084d6c 0x8010f9e14c8286b9312e624370fddc07fee2fc7569.539749639125625617 BNB
0xfbb9af9634690d5bf5b817c1a70012e09c9a8bbac6fac215d148d0ae7589ebd7124625082021-11-08 2:57:3222 days 15 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c1810.324980716867413456 BNB
0xfbb9af9634690d5bf5b817c1a70012e09c9a8bbac6fac215d148d0ae7589ebd7124625082021-11-08 2:57:3222 days 15 hrs ago 0x886389d1d0ffe7848e7de7276c608fc8fc16dd11 0x8010f9e14c8286b9312e624370fddc07fee2fc7510.324980716867413456 BNB
0xccb465d301c96f45dad91014c014de84cc4fc9b1d4082e3d0c9f15cdf04aeb14124586022021-11-07 23:41:5022 days 18 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c1812.582033327773423278 BNB
0xccb465d301c96f45dad91014c014de84cc4fc9b1d4082e3d0c9f15cdf04aeb14124586022021-11-07 23:41:5022 days 18 hrs ago 0x88ca2f65b35e8dd8f1fba8dd6299af7bd83aaac3 0x8010f9e14c8286b9312e624370fddc07fee2fc7512.582033327773423278 BNB
0xa245910a3799854e5fbe1a25e7b007d30d62a696e73709a719cf59f8ff44f3cc123247562021-11-03 5:35:3727 days 13 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c183.025140877182217044 BNB
0xa245910a3799854e5fbe1a25e7b007d30d62a696e73709a719cf59f8ff44f3cc123247562021-11-03 5:35:3727 days 13 hrs ago 0x117a4153507538a1a13f8178cacfd00fc80f4695 0x8010f9e14c8286b9312e624370fddc07fee2fc753.025140877182217044 BNB
0x694cf6a9ebce6b42030b5d2754d76c680ce7f74d96e8bbdc3a4065bb929ccd09123246822021-11-03 5:31:5527 days 13 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c182.99518703424 BNB
0x694cf6a9ebce6b42030b5d2754d76c680ce7f74d96e8bbdc3a4065bb929ccd09123246822021-11-03 5:31:5527 days 13 hrs ago 0x117a4153507538a1a13f8178cacfd00fc80f4695 0x8010f9e14c8286b9312e624370fddc07fee2fc752.99518703424 BNB
0xe88cc3f05891372858a8e9ad09b8af667adf73cf126a8a7eded8567f094b8319121878572021-10-29 8:50:5132 days 9 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c180.09075416977070039 BNB
0xe88cc3f05891372858a8e9ad09b8af667adf73cf126a8a7eded8567f094b8319121878572021-10-29 8:50:5132 days 9 hrs ago 0x9bec1ead2c7191fff89d400ec41b7d2727b69e44 0x8010f9e14c8286b9312e624370fddc07fee2fc750.09075416977070039 BNB
0x4d5c3ebcfae1a0541085a0aa30c35bbbfc7d99529b453084969fa4d16c7aa7eb121878492021-10-29 8:50:2732 days 9 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c180.0898556110272 BNB
0x4d5c3ebcfae1a0541085a0aa30c35bbbfc7d99529b453084969fa4d16c7aa7eb121878492021-10-29 8:50:2732 days 9 hrs ago 0x9bec1ead2c7191fff89d400ec41b7d2727b69e44 0x8010f9e14c8286b9312e624370fddc07fee2fc750.0898556110272 BNB
0x441c6fcc00c33e34aefd1dc0bb4c4e9e2d54348dced68ebc7e3ead1e243d0fda118280902021-10-16 17:14:3545 days 1 hr ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c181.631503117221000474 BNB
0x441c6fcc00c33e34aefd1dc0bb4c4e9e2d54348dced68ebc7e3ead1e243d0fda118280902021-10-16 17:14:3545 days 1 hr ago 0x7df293d8c1e5ad7e73a0be7bcce688903b7d6b41 0x8010f9e14c8286b9312e624370fddc07fee2fc751.631503117221000474 BNB
0x0e1c965d1401e1c1998b5073421f16c1f25aaf7e88c1b8f78524897c5160a8e4117247302021-10-13 2:23:3948 days 16 hrs ago 0x8010f9e14c8286b9312e624370fddc07fee2fc75 0x170b6aa872166ec2f8515c2b855c34b6c7563c1817.97112220544 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenManager

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-07-08
*/

// 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 _slotSetterAddr The address of managerSlotSetter contract
  * @param _handlerManagerAddr The address of handlerManager contract
  * @param _flashloanAddr The address of managerFlashloan contract
	* @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

Contract ABI

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

60806040526003805460ff1916905534801561001a57600080fd5b5060405162004c1038038062004c10833981810160405260e081101561003f57600080fd5b5080516020808301516040808501516060860151608087015160a088015160c09098015160008054336001600160a01b03199182161780835560038054610100600160a81b0319166101006001600160a01b039d8e1602179055600480548316998c1699909917909855600580548216938b1693909317909255600780548316958a1695909517909455600880548216938916939093179092556009805490921690871617905591841682526002909252818120805460ff19908116600190811790925593909416815290812080549092169092179055614ae99081906200012790396000f3fe60806040526004361061038c5760003560e01c80637b66a7da116101dc578063c6adddab11610102578063dad2829f116100a0578063e8be60741161006f578063e8be607414610e89578063f18490c714610ece578063f502ca7414610f00578063fe4d27cd14610f155761038c565b8063dad2829f14610d12578063dd8bc8d414610d86578063de96f58e14610dbf578063e521809e14610e565761038c565b8063ce19512c116100dc578063ce19512c14610bc1578063d007242e14610beb578063d3a417a214610ca6578063dac9f9db14610cd95761038c565b8063c6adddab14610b6d578063ca2ec6ea14610b97578063caa6fea414610bac5761038c565b80638da5cb5b1161017a578063a205c6fd11610149578063a205c6fd14610ad7578063a7e55d2214610b0a578063b55c9b0114610b1f578063c188214f14610b345761038c565b80638da5cb5b14610a6857806390cdd94d14610a7d57806397f2b41914610aad5780639e1c53d814610ac25761038c565b80638369b1df116101b65780638369b1df146109f657806387fa699714610a0b578063893d20e814610a205780638b91bd7314610a355761038c565b80637b66a7da146109495780637d170e261461097c5780638178d60a146109af5761038c565b806341418632116102c1578063611dacd31161025f578063740f1e181161022e578063740f1e181461089557806375ff47bf146108aa5780637905b435146108dd57806379c9ecac146109165761038c565b8063611dacd3146107c3578063618a56c2146107ed578063644fc9351461082057806369f3629a1461086b5761038c565b80634dbeb3871161029b5780634dbeb387146106d75780634f81866b14610708578063558a72971461071d57806357daa7b0146107585761038c565b806341418632146106575780634250644914610681578063461fe3a6146106ad5761038c565b806323cda5761161032e57806338f92fc71161030857806338f92fc71461058f5780633b884de6146105c25780633be8b4a5146105fd5780634107f10a1461062d5761038c565b806323cda576146104ef5780632ab0b0eb14610519578063314d59fc146105435761038c565b8063144236501161036a578063144236501461044a57806315ddcdaf1461047d5780631defc035146104a757806320e5f7a6146104da5761038c565b806311ad747b1461038e57806311f151eb146103ca57806313a8be9d14610411575b005b34801561039a57600080fd5b506103b8600480360360208110156103b157600080fd5b5035610f4b565b60408051918252519081900360200190f35b3480156103d657600080fd5b506103fd600480360360208110156103ed57600080fd5b50356001600160a01b0316610f5d565b604080519115158252519081900360200190f35b34801561041d57600080fd5b506103fd6004803603604081101561043457600080fd5b506001600160a01b0381351690602001356110fe565b34801561045657600080fd5b506103fd6004803603602081101561046d57600080fd5b50356001600160a01b0316611385565b34801561048957600080fd5b506103b8600480360360208110156104a057600080fd5b5035611470565b3480156104b357600080fd5b506103fd600480360360208110156104ca57600080fd5b50356001600160a01b03166114f3565b3480156104e657600080fd5b506103b861161b565b3480156104fb57600080fd5b506103fd6004803603602081101561051257600080fd5b5035611621565b34801561052557600080fd5b506103b86004803603602081101561053c57600080fd5b5035611672565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b031661167d565b6040805192835260208301919091528051918290030190f35b34801561059b57600080fd5b506103fd600480360360208110156105b257600080fd5b50356001600160a01b0316611692565b3480156105ce57600080fd5b506103fd600480360360408110156105e557600080fd5b506001600160a01b038135169060200135151561177d565b34801561060957600080fd5b506103fd6004803603604081101561062057600080fd5b50803590602001356118ea565b34801561063957600080fd5b506103fd6004803603602081101561065057600080fd5b50356119d5565b34801561066357600080fd5b506103b86004803603602081101561067a57600080fd5b5035611a52565b34801561068d57600080fd5b506103fd600480360360208110156106a457600080fd5b50351515611a5d565b3480156106b957600080fd5b506103b8600480360360208110156106d057600080fd5b5035611adb565b3480156106e357600080fd5b506106ec611ae6565b604080516001600160a01b039092168252519081900360200190f35b34801561071457600080fd5b506106ec611af5565b34801561072957600080fd5b506103fd6004803603604081101561074057600080fd5b506001600160a01b0381351690602001351515611b04565b34801561076457600080fd5b506107a5600480360360a081101561077b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611bf7565b60408051938452602084019290925282820152519081900360600190f35b3480156107cf57600080fd5b506103fd600480360360208110156107e657600080fd5b5035611ead565b3480156107f957600080fd5b506103fd6004803603602081101561081057600080fd5b50356001600160a01b031661202e565b34801561082c57600080fd5b506103b8600480360360a081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612119565b34801561087757600080fd5b506107a56004803603602081101561088e57600080fd5b5035612192565b3480156108a157600080fd5b506106ec6121b3565b3480156108b657600080fd5b506103fd600480360360208110156108cd57600080fd5b50356001600160a01b03166121c2565b3480156108e957600080fd5b506103b86004803603604081101561090057600080fd5b506001600160a01b0381351690602001356122ad565b34801561092257600080fd5b506103fd6004803603602081101561093957600080fd5b50356001600160a01b03166123d7565b34801561095557600080fd5b506103fd6004803603602081101561096c57600080fd5b50356001600160a01b03166124c2565b34801561098857600080fd5b506105766004803603602081101561099f57600080fd5b50356001600160a01b031661255a565b3480156109bb57600080fd5b506103b8600480360360808110156109d257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612671565b348015610a0257600080fd5b506103b861290c565b348015610a1757600080fd5b506106ec612912565b348015610a2c57600080fd5b506106ec612921565b348015610a4157600080fd5b506103b860048036036020811015610a5857600080fd5b50356001600160a01b0316612930565b348015610a7457600080fd5b506106ec6129ad565b348015610a8957600080fd5b506103fd60048036036040811015610aa057600080fd5b50803590602001356129bc565b348015610ab957600080fd5b506106ec612aa7565b348015610ace57600080fd5b506106ec612ab6565b348015610ae357600080fd5b506103fd60048036036020811015610afa57600080fd5b50356001600160a01b0316612ac5565b348015610b1657600080fd5b506103fd612bb0565b348015610b2b57600080fd5b506106ec612bb9565b348015610b4057600080fd5b506103b860048036036040811015610b5757600080fd5b506001600160a01b038135169060200135612bc8565b348015610b7957600080fd5b506103fd60048036036020811015610b9057600080fd5b5035612bdb565b348015610ba357600080fd5b506107a5612cbf565b348015610bb857600080fd5b506103fd612e27565b348015610bcd57600080fd5b506103b860048036036020811015610be457600080fd5b5035612e30565b348015610bf757600080fd5b50610c1560048036036020811015610c0e57600080fd5b5035612ea9565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610c69578181015183820152602001610c51565b50505050905090810190601f168015610c965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610cb257600080fd5b506103fd60048036036020811015610cc957600080fd5b50356001600160a01b0316613265565b348015610ce557600080fd5b506103b860048036036040811015610cfc57600080fd5b50803590602001356001600160a01b0316613350565b348015610d1e57600080fd5b50610d5360048036036060811015610d3557600080fd5b506001600160a01b0381351690602081013590604001351515613467565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610d9257600080fd5b5061057660048036036040811015610da957600080fd5b506001600160a01b0381351690602001356135c3565b348015610dcb57600080fd5b506103fd60048036036080811015610de257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b811115610e1857600080fd5b820183602082011115610e2a57600080fd5b803590602001918460018302840111600160201b83111715610e4b57600080fd5b5090925090506135db565b348015610e6257600080fd5b506103fd60048036036020811015610e7957600080fd5b50356001600160a01b0316613751565b348015610e9557600080fd5b506103fd60048036036080811015610eac57600080fd5b508035906001600160a01b03602082013516906040810135906060013561383c565b348015610eda57600080fd5b506103fd60048036036040811015610ef157600080fd5b508035906020013515156139b5565b348015610f0c57600080fd5b506103fd613aa4565b348015610f2157600080fd5b506103b860048036036060811015610f3857600080fd5b5080359060208101359060400135613b7f565b6000908152600d602052604090205490565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461100d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fd2578181015183820152602001610fba565b50505050905090810190601f168015610fff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166311f151eb60e01b1781526007549351835193949092169284929182918083835b602083106110865780518252601f199092019160209182019101611067565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b505080925050816110f857fe5b50919050565b6000611108614a58565b60035460408051636803921760e11b81526004810186905281516101009093046001600160a01b03169263d007242e92602480840193919291829003018186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d604081101561117f57600080fd5b5080516020918201516001600160a01b031691830191909152158015825261137957602080820151604080516001600160a01b038881166024808401919091528351808403820181526044938401855280870180516001600160e01b031663c8474ce560e01b17815294516321daf55f60e11b81526004810197885281519281019290925280519596928716956343b5eabe959194849301919080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156112c057600080fd5b815160208301805160405192949293830192919084600160201b8211156112e657600080fd5b9083019060208201858111156112fb57600080fd5b8251600160201b81118282018810171561131457600080fd5b82525081516020918201929091019080838360005b83811015611341578181015183820152602001611329565b50505050905090810190601f16801561136e5780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146113f85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316630144236560e41b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600354604080516315ddcdaf60e01b815260048101849052905160009261010090046001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b1580156114c157600080fd5b505afa1580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b505192915050565b3360008181526001602052604081205490919060ff168061152157506000546001600160a01b038281169116145b61152a57600080fd5b604080516001600160a01b0380861660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631defc03560e01b1781526008549351835193949092169284929182918083835b602083106115a25780518252601f199092019160209182019101611583565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611602576040519150601f19603f3d011682016040523d82523d6000602084013e611607565b606091505b5050809350508261161457fe5b5050919050565b600c5481565b600354604080516311e6d2bb60e11b815260048101849052905160009261010090046001600160a01b0316916323cda576916024808301926020929190829003018186803b1580156114c157600080fd5b600061137f82613c9a565b60008061168983613ce7565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117055760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166338f92fc760e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146117f05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b0316631dc426f360e11b1781526007549351835193949092169284929182918083835b602083106118715780518252601f199092019160209182019101611852565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146118d1576040519150601f19603f3d011682016040523d82523d6000602084013e6118d6565b606091505b505080925050816118e357fe5b5092915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461195d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b0316633be8b4a560e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611a485760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050600c55600190565b600061137f82613dd6565b6000611a67614043565b6040805183151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316634250644960e01b1781526007549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600061137f826140c0565b600a546001600160a01b031681565b6007546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611b775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b03808616602483015284151560448084019190915283518084039091018152606490920183526020820180516001600160e01b031663558a729760e01b178152600754935183519394909216928492918291808383602083106118715780518252601f199092019160209182019101611852565b6000806000611c046141ce565b60035460408051631b677ffb60e11b815260048101889052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611d35578181015183820152602001611d1d565b50505050905090810190601f168015611d625780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611d8157600080fd5b505af1158015611d95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611dbe57600080fd5b815160208301805160405192949293830192919084600160201b821115611de457600080fd5b908301906020820185811115611df957600080fd5b8251600160201b811182820188101715611e1257600080fd5b82525081516020918201929091019080838360005b83811015611e3f578181015183820152602001611e27565b50505050905090810190601f168015611e6c5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020830191506060811015611e8c57600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314611f205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663611dacd360e01b1781526009549251825192936000936060936001600160a01b0390921692869290918291908083835b60208310611f9d5780518252601f199092019160209182019101611f7e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114611ffd576040519150601f19603f3d011682016040523d82523d6000602084013e612002565b606091505b50915091508161200e57fe5b80806020019051602081101561202357600080fd5b505195945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146120a15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166330c52b6160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60008061212586613c9a565b9050600061213285613c9a565b9050600061214089876142d4565b5090506000612159866121538486614562565b90614562565b9050806121668986614562565b1115612181576121768185614599565b945050505050612189565b879450505050505b95945050505050565b600d6020526000908152604090208054600182015460029092015490919083565b600b546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146122355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166375ff47bf60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b6000806000806000805b600c5481101561238e57600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d602081101561234457600080fd5b5051156123865761235588826145d0565b90935091506123648583614890565b945061238361237c612375836140c0565b8590614562565b8590614890565b93505b6001016122b7565b50838311156123ca576123bf6123a387613c9a565b6123b96123af896140c0565b6123b987896148ce565b90614599565b94505050505061137f565b5060009695505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461244a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631e727b2b60e21b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146125355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50600680546001600160a01b0319166001600160a01b03939093169290921790915590565b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125c657600080fd5b505afa1580156125da573d6000803e3d6000fd5b505050506040513d60208110156125f057600080fd5b50511561265e5760008061260488846145d0565b90925090506000612614846140c0565b9050600061262185613dd6565b9050600061262f8584614562565b9050600061263d8684614562565b90506126498983614890565b98506126558882614890565b97505050505050505b600101612563565b509092509050915091565b600061267b6141ce565b60035460408051631b677ffb60e11b815260048101859052905160009261010090046001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156126cc57600080fd5b505afa1580156126e0573d6000803e3d6000fd5b505050506040513d60208110156126f657600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b838110156127a8578181015183820152602001612790565b50505050905090810190601f1680156127d55780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561283157600080fd5b815160208301805160405192949293830192919084600160201b82111561285757600080fd5b90830190602082018581111561286c57600080fd5b8251600160201b81118282018810171561288557600080fd5b82525081516020918201929091019080838360005b838110156128b257818101518382015260200161289a565b50505050905090810190601f1680156128df5780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156128fe57600080fd5b505198975050505050505050565b600c5490565b6009546001600160a01b031681565b6000546001600160a01b031690565b604080516001600160a01b0380841660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638b91bd7360e01b17815260085493518351600095869460609491169286929091829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b6000546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612a2f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b506040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b03166390cdd94d60e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b6005546001600160a01b031690565b6008546001600160a01b031681565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612b385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663a205c6fd60e01b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60035460ff1690565b6006546001600160a01b031681565b6000612bd483836148f4565b9392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314612c4e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663c6adddab60e01b1781526008549251825192936001600160a01b03169284928291808383602083106110865780518252601f199092019160209182019101611067565b600080600080600360019054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d1657600080fd5b505afa158015612d2a573d6000803e3d6000fd5b505050506040513d6020811015612d4057600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b158015612d8257600080fd5b505afa158015612d96573d6000803e3d6000fd5b505050506040513d6020811015612dac57600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b158015612dee57600080fd5b505afa158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b50519195509350915050909192565b60035460ff1681565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316633386544b60e21b1781526009549251825160009485936060936001600160a01b0390921692869291829180838360208310611f9d5780518252601f199092019160209182019101611f7e565b60008060606000806060600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f0c57600080fd5b505afa158015612f20573d6000803e3d6000fd5b505050506040513d6020811015612f3657600080fd5b50511561325857600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b8381101561304d578181015183820152602001613035565b50505050905090810190601f16801561307a5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156130d457600080fd5b815160208301805160405192949293830192919084600160201b8211156130fa57600080fd5b90830190602082018581111561310f57600080fd5b8251600160201b81118282018810171561312857600080fd5b82525081516020918201929091019080838360005b8381101561315557818101518382015260200161313d565b50505050905090810190601f1680156131825780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156131a157600080fd5b8101908080516040519392919084600160201b8211156131c057600080fd5b9083019060208201858111156131d557600080fd5b8251600160201b8111828201881017156131ee57600080fd5b82525081516020918201929091019080838360005b8381101561321b578181015183820152602001613203565b50505050905090810190601f1680156132485780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146132d85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166369d20bd160e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b60408051602481018490526001600160a01b0380841660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663dac9f9db60e01b1781526008549351835160009586946060949116928692909182918083835b602083106133d55780518252601f1990920191602091820191016133b6565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613435576040519150601f19603f3d011682016040523d82523d6000602084013e61343a565b606091505b50915091508161344657fe5b80806020019051602081101561345b57600080fd5b50519695505050505050565b604080516001600160a01b0380861660248301526044820185905283151560648084019190915283518084039091018152608490920183526020820180516001600160e01b031663dad2829f60e01b17815260085493518351600095869586958695869586959394869460609491909116928692918291908083835b602083106135025780518252601f1990920191602091820191016134e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613562576040519150601f19603f3d011682016040523d82523d6000602084013e613567565b606091505b50915091508161357357fe5b8080602001905160c081101561358857600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b5099509750909550935050505093975093979195509350565b6000806135d084846145d0565b915091509250929050565b6000606063de96f58e60e01b878787878760405160240180868152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600083820181905260408051601f909301601f1990811690950183810390950183529384526020820180516001600160e01b03166001600160e01b0319909d169c909c178c5260095493518251929d50909b60609b506001600160a01b0390941699508c9850965086955091935090915081905083835b602083106136bc5780518252601f19909201916020918201910161369d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461371c576040519150601f19603f3d011682016040523d82523d6000602084013e613721565b606091505b50915091508161372d57fe5b80806020019051602081101561374257600080fd5b50519998505050505050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146137c45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516001600160a01b0380851660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316637290c04f60e11b178152600754935183519394909216928492918291808383602083106110865780518252601f199092019160209182019101611067565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146138af5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5060408051602481018790526001600160a01b0380871660448301526064820186905260848083018690528351808403909101815260a490920183526020820180516001600160e01b0316633a2f981d60e21b1781526007549351835193949092169284929182918083835b6020831061393a5780518252601f19909201916020918201910161391b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b505080925050816139ac57fe5b50949350505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314613a285760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50604080516024810185905283151560448083019190915282518083039091018152606490910182526020810180516001600160e01b031663f18490c760e01b1781526007549251825192936001600160a01b03169284928291808383602083106118715780518252601f199092019160209182019101611852565b60408051600481526024810182526020810180516001600160e01b0316633d40b29d60e21b178152600854925182516000946001600160a01b0316928492918291908083835b60208310613b095780518252601f199092019160209182019101613aea565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613b69576040519150601f19603f3d011682016040523d82523d6000602084013e613b6e565b606091505b50508092505081613b7b57fe5b5090565b604080516024810185905260448101849052606480820184905282518083039091018152608490910182526020810180516001600160e01b031663fe4d27cd60e01b1781526009549251825160009485936060936001600160a01b039092169286929182918083835b60208310613c075780518252601f199092019160209182019101613be8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114613c67576040519150601f19603f3d011682016040523d82523d6000602084013e613c6c565b606091505b509150915081613c7857fe5b808060200190516020811015613c8d57600080fd5b5051979650505050505050565b600480546040805163c457fb3760e01b8152928301849052516000926001600160a01b039092169163c457fb37916024808301926020929190829003018186803b1580156114c157600080fd5b60008060008060005b600c5481101561266657600360019054906101000a90046001600160a01b03166001600160a01b03166323cda576826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d5357600080fd5b505afa158015613d67573d6000803e3d6000fd5b505050506040513d6020811015613d7d57600080fd5b505115613dce57600080613d9188846145d0565b90925090506000613da1846140c0565b90506000613daf8483614562565b9050613dbb8782614890565b9650613dc78684614890565b9550505050505b600101613cf0565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e3257600080fd5b505afa158015613e46573d6000803e3d6000fd5b505050506040513d6020811015613e5c57600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b83811015613ee5578181015183820152602001613ecd565b50505050905090810190601f168015613f125780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613f6c57600080fd5b815160208301805160405192949293830192919084600160201b821115613f9257600080fd5b908301906020820185811115613fa757600080fd5b8251600160201b811182820188101715613fc057600080fd5b82525081516020918201929091019080838360005b83811015613fed578181015183820152602001613fd5565b50505050905090810190601f16801561401a5780820380516001836020036101000a031916815260200191505b5060405250508151919350506020808401925081101561403957600080fd5b5051949350505050565b3360009081526002602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166140bd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b50565b600080600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561411c57600080fd5b505afa158015614130573d6000803e3d6000fd5b505050506040513d602081101561414657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d1289493839260449091019190808383600083811015613ee5578181015183820152602001613ecd565b60035460408051632836093360e21b81529051339261010090046001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561421757600080fd5b505afa15801561422b573d6000803e3d6000fd5b505050506040513d602081101561424157600080fd5b50516001600160a01b038281169116148061426957506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906142d05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b5050565b6000806000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561433257600080fd5b505afa158015614346573d6000803e3d6000fd5b505050506040513d602081101561435c57600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b838110156143f55781810151838201526020016143dd565b50505050905090810190601f1680156144225780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561443f57600080fd5b505afa158015614453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561447c57600080fd5b815160208301805160405192949293830192919084600160201b8211156144a257600080fd5b9083019060208201858111156144b757600080fd5b8251600160201b8111828201881017156144d057600080fd5b82525081516020918201929091019080838360005b838110156144fd5781810151838201526020016144e5565b50505050905090810190601f16801561452a5780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561454c57600080fd5b5080516020909101519097909650945050505050565b6000612bd46145718484614949565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b81525061499c565b6000612bd46145b084670de0b6b3a7640000614949565b83604051806040016040528060018152602001601960fa1b81525061499c565b60008060006145de84613c9a565b90506000600360019054906101000a90046001600160a01b03166001600160a01b03166336cefff6866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561463b57600080fd5b505afa15801561464f573d6000803e3d6000fd5b505050506040513d602081101561466557600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b838110156146ff5781810151838201526020016146e7565b50505050905090810190601f16801561472c5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561474957600080fd5b505afa15801561475d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561478657600080fd5b815160208301805160405192949293830192919084600160201b8211156147ac57600080fd5b9083019060208201858111156147c157600080fd5b8251600160201b8111828201881017156147da57600080fd5b82525081516020918201929091019080838360005b838110156148075781810151838201526020016147ef565b50505050905090810190601f1680156148345780820380516001836020036101000a031916815260200191505b5060405250505090508091505080806020019051604081101561485657600080fd5b508051602090910151909350915060006148708487614562565b9050600061487e8488614562565b919b919a509098505050505050505050565b600082820183811015612bd4576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b6000612bd48383604051806040016040528060018152602001607360f81b8152506149fe565b600080600061490285613ce7565b9092509050816149175760009250505061137f565b8082111561493e5761493561492b85613c9a565b6123b984846148ce565b9250505061137f565b60009250505061137f565b6000826149585750600061137f565b8282028284828161496557fe5b0414612bd4576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b600081836149eb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b508284816149f557fe5b04949350505050565b60008184841115614a505760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fd2578181015183820152602001610fba565b505050900390565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082015260e08101829052610100810182905261012081018290526101408101919091529056fea2646970667358221220cf985dddebef7b1ded8b71ff43e0df43880fc6f1d293faea507acc7a687eb14f64736f6c634300060c00330000000000000000000000000a95a3b05da318983741360abe29dcda63dbb4d3000000000000000000000000dd80fb1c16a1eb446be94655e5f762c19c7fa89e0000000000000000000000008c0b650f149a0817be2e0767a636122994ac49ad00000000000000000000000072e419713551410297b407bf1b61a0dcc1cf5d0a0000000000000000000000008cc8a0d4759d94ecd1e5a0ae2866b3cbe65c4493000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000a95a3b05da318983741360abe29dcda63dbb4d3000000000000000000000000dd80fb1c16a1eb446be94655e5f762c19c7fa89e0000000000000000000000008c0b650f149a0817be2e0767a636122994ac49ad00000000000000000000000072e419713551410297b407bf1b61a0dcc1cf5d0a0000000000000000000000008cc8a0d4759d94ecd1e5a0ae2866b3cbe65c4493000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : managerDataStorageAddr (address): 0x0a95a3b05da318983741360abe29dcda63dbb4d3
Arg [1] : oracleProxyAddr (address): 0xdd80fb1c16a1eb446be94655e5f762c19c7fa89e
Arg [2] : _slotSetterAddr (address): 0x8c0b650f149a0817be2e0767a636122994ac49ad
Arg [3] : _handlerManagerAddr (address): 0x72e419713551410297b407bf1b61a0dcc1cf5d0a
Arg [4] : _flashloanAddr (address): 0x8cc8a0d4759d94ecd1e5a0ae2866b3cbe65c4493
Arg [5] : breaker (address): 0xd297c9a45ac9851003448c52c2b2b72c11688465
Arg [6] : erc20Addr (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000a95a3b05da318983741360abe29dcda63dbb4d3
Arg [1] : 000000000000000000000000dd80fb1c16a1eb446be94655e5f762c19c7fa89e
Arg [2] : 0000000000000000000000008c0b650f149a0817be2e0767a636122994ac49ad
Arg [3] : 00000000000000000000000072e419713551410297b407bf1b61a0dcc1cf5d0a
Arg [4] : 0000000000000000000000008cc8a0d4759d94ecd1e5a0ae2866b3cbe65c4493
Arg [5] : 000000000000000000000000d297c9a45ac9851003448c52c2b2b72c11688465
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

19957:31969:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50638:132;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50638:132:0;;:::i;:::-;;;;;;;;;;;;;;;;23963:310;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23963:310:0;-1:-1:-1;;;;;23963:310:0;;:::i;:::-;;;;;;;;;;;;;;;;;;28533:507;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28533:507:0;;;;;;;;:::i;22080:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22080:309:0;-1:-1:-1;;;;;22080:309:0;;:::i;35354:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35354:137:0;;:::i;30503:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30503:318:0;-1:-1:-1;;;;;30503:318:0;;:::i;17339:33::-;;;;;;;;;;;;;:::i;34510:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34510:152:0;;:::i;32548:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32548:132:0;;:::i;36659:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36659:163:0;-1:-1:-1;;;;;36659:163:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28015:337;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28015:337:0;-1:-1:-1;;;;;28015:337:0;;:::i;23135:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23135:318:0;;;;;;;;;;:::i;25893:335::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25893:335:0;;;;;;;:::i;34826:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34826:163:0;;:::i;32827:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32827:152:0;;:::i;23656:302::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23656:302:0;;;;:::i;33659:144::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33659:144:0;;:::i;17272:34::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17272:34:0;;;;;;;;;;;;;;17154:29;;;;;;;;;;;;;:::i;21577:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21577:314:0;;;;;;;;;;:::i;40042:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40042:701:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44586:388;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44586:388:0;;:::i;24609:306::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24609:306:0;-1:-1:-1;;;;;24609:306:0;;:::i;41266:764::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41266:764:0;;;;;;;;;;;;;;;;;;;;;;;:::i;17627:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17627:60:0;;:::i;17311:22::-;;;;;;;;;;;;;:::i;22584:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22584:295:0;-1:-1:-1;;;;;22584:295:0;;:::i;38538:1064::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38538:1064:0;;;;;;;;:::i;25255:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25255:282:0;-1:-1:-1;;;;;25255:282:0;;:::i;51677:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51677:127:0;-1:-1:-1;;;;;51677:127:0;;:::i;37122:1127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37122:1127:0;-1:-1:-1;;;;;37122:1127:0;;:::i;42385:605::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42385:605:0;;;;;;;;;;;;;;;;;;;;:::i;35092:103::-;;;;;;;;;;;;;:::i;17224:28::-;;;;;;;;;;;;;:::i;47734:74::-;;;;;;;;;;;;;:::i;30956:373::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30956:373:0;-1:-1:-1;;;;;30956:373:0;;:::i;16796:20::-;;;;;;;;;;;;;:::i;25542:346::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25542:346:0;;;;;;;:::i;51146:103::-;;;;;;;;;;;;;:::i;17187:33::-;;;;;;;;;;;;;:::i;24920:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24920:330:0;-1:-1:-1;;;;;24920:330:0;;:::i;26317:86::-;;;;;;;;;;;;;:::i;17123:25::-;;;;;;;;;;;;;:::i;35704:182::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35704:182:0;;;;;;;;:::i;32099:308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32099:308:0;;:::i;51389:283::-;;;;;;;;;;;;;:::i;16913:29::-;;;;;;;;;;;;;:::i;44040:351::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44040:351:0;;:::i;26554:659::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26554:659:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;26554:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21267:305;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21267:305:0;-1:-1:-1;;;;;21267:305:0;;:::i;31520:407::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31520:407:0;;;;;;-1:-1:-1;;;;;31520:407:0;;:::i;29339:523::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29339:523:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36167:209;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36167:209:0;;;;;;;;:::i;43348:487::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43348:487:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43348:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43348:487:0;;;;;;;;;;-1:-1:-1;43348:487:0;;-1:-1:-1;43348:487:0;-1:-1:-1;43348:487:0;:::i;24278:326::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24278:326:0;-1:-1:-1;;;;;24278:326:0;;:::i;27410:416::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27410:416:0;;;-1:-1:-1;;;;;27410:416:0;;;;;;;;;;;;;;;:::i;47310:322::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47310:322:0;;;;;;;;;:::i;30043:266::-;;;;;;;;;;;;;:::i;45304:465::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45304:465:0;;;;;;;;;;;;:::i;50638:132::-;50703:7;50725:27;;;:16;:27;;;;;:40;;50638:132::o;23963:310::-;24043:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24086:105:0::1;::::0;;-1:-1:-1;;;;;24086:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24086:105:0::1;-1:-1:-1::0;;;24086:105:0::1;::::0;;24212:14:::1;::::0;:37;;;;24086:105;;24212:14;;::::1;::::0;24086:105;;24212:37;;;;;24086:105;24212:37:::1;;;;;;::::0;;;;-1:-1:-1;;24212:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24199:50;;;;;24261:6;24254:14;;;;18591:1;23963:310:::0;;;:::o;28533:507::-;28627:4;28640:31;;:::i;:::-;28718:19;;:49;;;-1:-1:-1;;;28718:49:0;;;;;;;;;;:19;;;;-1:-1:-1;;;;;28718:19:0;;:39;;:49;;;;;;;;;;;;;:19;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28718:49:0;;;;;;;-1:-1:-1;;;;;28676:91:0;28698:16;;;28676:91;;;;;;;;;28772:246;;28853:16;;;;;28903:103;;;-1:-1:-1;;;;;28903:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28903:103:0;-1:-1:-1;;;28903:103:0;;;28876:136;;-1:-1:-1;;;28876:136:0;;;;;;;;;;;;;;;;;;;28853:16;;28876:20;;;;;;28903:103;;28876:136;;;;28903:103;28876:136;;28903:103;28806:19;28876:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28876:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28876:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28876:136:0;;;;;;-1:-1:-1;28876:136:0;;;;;;;;;;-1:-1:-1;28876:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28772:246;;29031:4;29024:11;;;28533:507;;;;;:::o;22080:309::-;22157:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22201:105:0::1;::::0;;-1:-1:-1;;;;;22201:105:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22201:105:0::1;-1:-1:-1::0;;;22201:105:0::1;::::0;;22326:14:::1;::::0;:37;;;;22201:105;;22326:14;;::::1;::::0;22201:105;;22326:37;;;;;22201:105;22326:37:::1;;;;;::::0;;;;-1:-1:-1;;22326:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;35354:137:::0;35442:19;;:44;;;-1:-1:-1;;;35442:44:0;;;;;;;;;;-1:-1:-1;;35442:19:0;;;-1:-1:-1;;;;;35442:19:0;;:37;;:44;;;;;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35442:44:0;;35354:137;-1:-1:-1;;35354:137:0:o;30503:318::-;18737:10;30589:11;18760:17;;;:9;:17;;;;;;30589:11;;18737:10;18760:17;;;:36;;-1:-1:-1;18791:5:0;;-1:-1:-1;;;;;18781:15:0;;;18791:5;;18781:15;18760:36;18752:45;;;;;;30631:103:::1;::::0;;-1:-1:-1;;;;;30631:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;30631:103:0::1;-1:-1:-1::0;;;30631:103:0::1;::::0;;30754:18:::1;::::0;:41;;;;30631:103;;30754:18;;::::1;::::0;30631:103;;30754:41;;;;;30631:103;30754:41:::1;;;;;;::::0;;;;-1:-1:-1;;30754:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30741:54;;;;;30809:6;30802:14;;;;18802:1;30503:318:::0;;;;:::o;17339:33::-;;;;:::o;34510:152::-;34604:19;;:53;;;-1:-1:-1;;;34604:53:0;;;;;;;;;;-1:-1:-1;;34604:19:0;;;-1:-1:-1;;;;;34604:19:0;;:42;;:53;;;;;;;;;;;;;;:19;:53;;;;;;;;;;32548:132;32620:7;32643:32;32665:9;32643:21;:32::i;36659:163::-;36746:7;36755;36778:39;36808:8;36778:29;:39::i;:::-;36771:46;;;;36659:163;;;:::o;28015:337::-;28106:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28150:119:0::1;::::0;;-1:-1:-1;;;;;28150:119:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28150:119:0::1;-1:-1:-1::0;;;28150:119:0::1;::::0;;28289:14:::1;::::0;:37;;;;28150:119;;28289:14;;::::1;::::0;28150:119;;28289:37;;;;;28150:119;28289:37:::1;;;;;::::0;;;;-1:-1:-1;;28289:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;23135:318:::0;23219:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23263:107:0::1;::::0;;-1:-1:-1;;;;;23263:107:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23263:107:0::1;-1:-1:-1::0;;;23263:107:0::1;::::0;;23390:14:::1;::::0;:37;;;;23263:107;;23390:14;;::::1;::::0;23263:107;;23390:37;;;;;23263:107;23390:37:::1;;;;;;::::0;;;;-1:-1:-1;;23390:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23377:50;;;;;23441:6;23434:14;;;;18591:1;23135:318:::0;;;;:::o;25893:335::-;25982:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26025:121:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;26025:121:0::1;-1:-1:-1::0;;;26025:121:0::1;::::0;;26167:14:::1;::::0;:37;;;;26025:121;;-1:-1:-1;;;;;26167:14:0::1;::::0;26025:121;;26167:37;;;;26025:121;26167:37:::1;;;;;::::0;;;;-1:-1:-1;;26167:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;34826:163:::0;34915:4;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34928:18:0::1;:40:::0;34980:4:::1;::::0;34826:163::o;32827:152::-;32909:7;32932:42;32964:9;32932:31;:42::i;23656:302::-;23730:11;19529:12;:10;:12::i;:::-;23772:103:::1;::::0;;;::::1;;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23772:103:0::1;-1:-1:-1::0;;;23772:103:0::1;::::0;;23895:14:::1;::::0;:37;;;;23772:103;;-1:-1:-1;;;;;23895:14:0::1;::::0;23772:103;;23895:37;;;;23772:103;23895:37:::1;;;;;::::0;;;;-1:-1:-1;;23895:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;33659:144:::0;33737:7;33760:38;33788:9;33760:27;:38::i;17272:34::-;;;-1:-1:-1;;;;;17272:34:0;;:::o;17154:29::-;;;-1:-1:-1;;;;;17154:29:0;;:::o;21577:314::-;21664:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21706:102:0::1;::::0;;-1:-1:-1;;;;;21706:102:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21706:102:0::1;-1:-1:-1::0;;;21706:102:0::1;::::0;;21828:14:::1;::::0;:37;;;;21706:102;;21828:14;;::::1;::::0;21706:102;;21828:37;;;;;21706:102;21828:37:::1;;;;;::::0;;;;-1:-1:-1;;21828:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;40042:701:::0;40257:7;40266;40275;19065:23;:21;:23::i;:::-;40318:19:::1;::::0;:59:::1;::::0;;-1:-1:-1;;;40318:59:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;40318:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;40318: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;40318:59:0;40464:168:::1;::::0;;-1:-1:-1;;;;;40464:168:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;40318:59:::1;40464:168:::0;;::::1;::::0;;-1:-1:-1;;;;;40464:168:0::1;-1:-1:-1::0;;;40464:168:0::1;::::0;;40648:31;;-1:-1:-1;;;;;;40648:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;40318:59;;-1:-1:-1;40318:59:0;;40464:168;;40648:25;;::::1;::::0;::::1;::::0;40464:168;;40648:31;;;;;;;;40464:168;40382:19:::1;40648:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40648:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;40648:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;40648:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;40648:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;40648:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40648:31:0::1;::::0;-1:-1:-1;;40693:45:0;;40637:42;;-1:-1:-1;;40693:45:0::1;::::0;::::1;::::0;-1:-1:-1;40693:45:0::1;::::0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;40693:45:0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;40693:45:0;-1:-1:-1;40042:701:0;-1:-1:-1;;;;;;;;;40042:701:0:o;44586:388::-;44677:4;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44715:104:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;44715:104:0::1;-1:-1:-1::0;;;44715:104:0::1;::::0;;44867:13:::1;::::0;:36;;;;44715:104;;-1:-1:-1;;44691:21:0::1;::::0;-1:-1:-1;;;;;44867:13:0;;::::1;::::0;44715:104;;44867:36;;;;44715:104;44867:36;;44715:104;44867:36:::1;;;;;;::::0;;;;-1:-1:-1;;44867:36:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44826:77;;;;44915:6;44908:14;;;;44947:10;44936:30;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44936:30:0;;44586:388;-1:-1:-1;;;;;44586:388:0:o;24609:306::-;24687:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24730:103:0::1;::::0;;-1:-1:-1;;;;;24730:103:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24730:103:0::1;-1:-1:-1::0;;;24730:103:0::1;::::0;;24854:14:::1;::::0;:37;;;;24730:103;;24854:14;;::::1;::::0;24730:103;;24854:37;;;;;24730:103;24854:37:::1;;;;;::::0;;;;-1:-1:-1;;24854:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;41266:764:::0;41457:7;41473:22;41498:41;41520:18;41498:21;:41::i;:::-;41473:66;;41544:19;41566:38;41588:15;41566:21;:38::i;:::-;41544:60;;41609:39;41691:54;41709:18;41729:15;41691:17;:54::i;:::-;-1:-1:-1;41653:92:0;-1:-1:-1;41750:19:0;41772:79;41839:11;41772:55;41653:92;41815:11;41772:42;:55::i;:::-;:66;;:79::i;:::-;41750:101;-1:-1:-1;41750:101:0;41860:42;:15;41887:14;41860:26;:42::i;:::-;:56;41856:168;;;41934:38;:11;41957:14;41934:22;:38::i;:::-;41927:45;;;;;;;;41856:168;42003:15;41996:22;;;;;;41266:764;;;;;;;;:::o;17627:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17311:22::-;;;-1:-1:-1;;;;;17311:22:0;;:::o;22584:295::-;22653:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22697:99:0::1;::::0;;-1:-1:-1;;;;;22697:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22697:99:0::1;-1:-1:-1::0;;;22697:99:0::1;::::0;;22816:14:::1;::::0;:37;;;;22697:99;;22816:14;;::::1;::::0;22697:99;;22816:37;;;;;22697:99;22816:37:::1;;;;;::::0;;;;-1:-1:-1;;22816:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;38538:1064:::0;38644:7;38660:28;38693:34;38732:27;38764:26;38800:17;38795:536;38831:18;;38819:9;:30;38795:536;;;38877:19;;;;;;;;;-1:-1:-1;;;;;38877:19:0;-1:-1:-1;;;;;38877:42:0;;38920:9;38877:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38877:53:0;38873:453;;;38989:58;39027:8;39037:9;38989:37;:58::i;:::-;38945:102;;-1:-1:-1;38945:102:0;-1:-1:-1;39077:44:0;:20;38945:102;39077:24;:44::i;:::-;39054:67;;39157:162;39217:87;39264:38;39292:9;39264:27;:38::i;:::-;39217:19;;:45;:87::i;:::-;39157:26;;:44;:162::i;:::-;39128:191;;38873:453;38851:11;;38795:536;;;;39370:20;39341:26;:49;39337:248;;;39408:171;39546:31;39568:8;39546:21;:31::i;:::-;39408:118;39487:37;39515:8;39487:27;:37::i;:::-;39408:59;:26;39446:20;39408:37;:59::i;:::-;:77;;:118::i;:171::-;39401:178;;;;;;;;39337:248;-1:-1:-1;39596:1:0;;38538:1064;-1:-1:-1;;;;;;38538:1064:0:o;25255:282::-;25321:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25364:91:0::1;::::0;;-1:-1:-1;;;;;25364:91:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25364:91:0::1;-1:-1:-1::0;;;25364:91:0::1;::::0;;25476:14:::1;::::0;:37;;;;25364:91;;25476:14;;::::1;::::0;25364:91;;25476:37;;;;;25364:91;25476:37:::1;;;;;::::0;;;;-1:-1:-1;;25476:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51677:127:::0;51752:4;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51763:8:0::1;:36:::0;;-1:-1:-1;;;;;;51763:36:0::1;-1:-1:-1::0;;;;;51763:36:0;;;::::1;::::0;;;::::1;::::0;;;;51677:127::o;37122:1127::-;37203:7;37212;37228:33;37266:37;37315:17;37310:863;37346:18;;37334:9;:30;37310:863;;;37392:19;;;;;;;;;-1:-1:-1;;;;;37392:19:0;-1:-1:-1;;;;;37392:42:0;;37435:9;37392:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37392:53:0;37388:778;;;37458:27;37492:26;37569:58;37607:8;37617:9;37569:37;:58::i;:::-;37525:102;;-1:-1:-1;37525:102:0;-1:-1:-1;37634:19:0;37656:38;37684:9;37656:27;:38::i;:::-;37634:60;;37701:23;37727:42;37759:9;37727:31;:42::i;:::-;37701:68;-1:-1:-1;37776:28:0;37807:43;:19;37838:11;37807:30;:43::i;:::-;37776:74;-1:-1:-1;37857:32:0;37892:47;:19;37923:15;37892:30;:47::i;:::-;37857:82;-1:-1:-1;37974:51:0;:25;38004:20;37974:29;:51::i;:::-;37946:79;-1:-1:-1;38064:59:0;:29;38098:24;38064:33;:59::i;:::-;38032:91;;37388:778;;;;;;;37366:11;;37310:863;;;-1:-1:-1;38187:25:0;;-1:-1:-1;38214:29:0;-1:-1:-1;37122:1127:0;;;:::o;42385:605::-;42569:7;19065:23;:21;:23::i;:::-;42612:19:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;42612:50:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;42612:19:0::1;::::0;::::1;-1:-1:-1::0;;;;;42612: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;42612:50:0;42747:150:::1;::::0;;-1:-1:-1;;;;;42747:150:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;42612:50:::1;42747:150:::0;;::::1;::::0;;-1:-1:-1;;;;;42747:150:0::1;-1:-1:-1::0;;;42747:150:0::1;::::0;;42913:31;;-1:-1:-1;;;;;;42913:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;42612:50;;-1:-1:-1;42612:50:0;;42747:150;;42913:25;;::::1;::::0;::::1;::::0;42747:150;;42913:31;;;;;;;;42747:150;42667:19:::1;42913:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;42913:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;42913:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;42913:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;42913:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;42913:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;42913:31:0::1;::::0;-1:-1:-1;;42958:27:0;;42902:42;;-1:-1:-1;;42958:27:0::1;::::0;;::::1;::::0;-1:-1:-1;42958:27:0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;42958:27:0;;42385:605;-1:-1:-1;;;;;;;;42385:605:0:o;35092:103::-;35172:18;;35092:103;:::o;17224:28::-;;;-1:-1:-1;;;;;17224:28:0;;:::o;47734:74::-;47775:7;47798:5;-1:-1:-1;;;;;47798:5:0;47734:74;:::o;30956:373::-;31066:99;;;-1:-1:-1;;;;;31066:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31066:99:0;-1:-1:-1;;;31066:99:0;;;31213:18;;:41;;;;31024:7;;;;31042:21;;31213:18;;;31066:99;;31213:41;;;;;;31066:99;31213:41;;;;;;;;;-1:-1:-1;;31213:41:0;;;;;;;;;;;;16796:20;;;-1:-1:-1;;;;;16796:20:0;;:::o;25542:346::-;25636:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25679:127:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25679:127:0::1;-1:-1:-1::0;;;25679:127:0::1;::::0;;25827:14:::1;::::0;:37;;;;25679:127;;-1:-1:-1;;;;;25827:14:0::1;::::0;25679:127;;25827:37;;;;25679:127;25827:37:::1;;;;;::::0;;;;-1:-1:-1;;25827:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51146:103:::0;51224:19;;-1:-1:-1;;;;;51224:19:0;51146:103;:::o;17187:33::-;;;-1:-1:-1;;;;;17187:33:0;;:::o;24920:330::-;25010:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25053:115:0::1;::::0;;-1:-1:-1;;;;;25053:115:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25053:115:0::1;-1:-1:-1::0;;;25053:115:0::1;::::0;;25189:14:::1;::::0;:37;;;;25053:115;;25189:14;;::::1;::::0;25053:115;;25189:37;;;;;25053:115;25189:37:::1;;;;;::::0;;;;-1:-1:-1;;25189:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;26317:86:::0;26389:9;;;;26317:86;:::o;17123:25::-;;;-1:-1:-1;;;;;17123:25:0;;:::o;35704:182::-;35809:7;35832:49;35861:8;35871:9;35832:28;:49::i;:::-;35825:56;35704:182;-1:-1:-1;;;35704:182:0:o;32099:308::-;32173:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32217:103:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;32217:103:0::1;-1:-1:-1::0;;;32217:103:0::1;::::0;;32340:18:::1;::::0;:41;;;;32217:103;;-1:-1:-1;;;;;32340:18:0::1;::::0;32217:103;;32340:41;;;;32217:103;32340:41:::1;;;;;::::0;;;;-1:-1:-1;;32340:41:0;;;;::::1;::::0;;::::1;::::0;::::1;;;51389:283:::0;51443:7;51452;51461;51477:32;51512:19;;;;;;;;;-1:-1:-1;;;;;51512:19:0;51477:54;;51544:12;-1:-1:-1;;;;;51544:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51544:38:0;51584:39;;;-1:-1:-1;;;51584:39:0;;;;-1:-1:-1;;;;;51584:37:0;;;;;:39;;;;;51544:38;;51584:39;;;;;;;:37;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51584:39:0;51625:41;;;-1:-1:-1;;;51625:41:0;;;;-1:-1:-1;;;;;51625:39:0;;;;;:41;;;;;51584:39;;51625:41;;;;;;;:39;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51625:41:0;51536:131;;-1:-1:-1;51536:131:0;-1:-1:-1;51625:41:0;-1:-1:-1;;51389:283:0;;;:::o;16913:29::-;;;;;;:::o;44040:351::-;44138:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44138:95:0;-1:-1:-1;;;44138:95:0;;;44281:13;;:36;;;;44098:7;;;;44114:21;;-1:-1:-1;;;;;44281:13:0;;;;44138:95;;44281:36;;;;;44138:95;44281:36;;;;;;;;;-1:-1:-1;;44281:36:0;;;;;;;;;;;;26554:659;26625:4;26631:7;26640:13;26662:12;26679:24;26708:23;26740:19;;;;;;;;;-1:-1:-1;;;;;26740:19:0;-1:-1:-1;;;;;26740:42:0;;26783:9;26740:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26740:53:0;26736:421;;;26823:19;;;;;;;;;-1:-1:-1;;;;;26823:19:0;-1:-1:-1;;;;;26823:39:0;;26863:9;26823:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26823:50:0;27001:80;;;;;;;;;;;;;26823:50;27001:80;;;;;-1:-1:-1;;;;;27001:80:0;-1:-1:-1;;;27001:80:0;;;26965:122;;-1:-1:-1;;;26965:122:0;;;;;;;;;;;;;;;;;;;26823:50;;-1:-1:-1;26823:50:0;;26931:17;;-1:-1:-1;;;;;26965:29:0;;;;;27001:80;;26965:122;;;;;;;;27001:80;26965:122;;27001:80;26879:19;26965:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26965:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26965:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26965:122:0;;;;;;-1:-1:-1;26965:122:0;;;;;;;;;;-1:-1:-1;26965:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26965:122:0;;-1:-1:-1;;27105:26:0;;26954:133;;-1:-1:-1;;27105:26:0;;;;;-1:-1:-1;27105:26:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27105:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27105:26:0;;;;;;-1:-1:-1;27105:26:0;;;;;;;;;;-1:-1:-1;27105:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27093:38;;27147:4;27137:14;;26736:421;;;27171:7;;27180:16;;-1:-1:-1;27171:7:0;;-1:-1:-1;26554:659:0;-1:-1:-1;;26554:659:0:o;21267:305::-;21344:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21388:99:0::1;::::0;;-1:-1:-1;;;;;21388:99:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;21388:99:0::1;-1:-1:-1::0;;;21388:99:0::1;::::0;;21509:14:::1;::::0;:37;;;;21388:99;;21509:14;;::::1;::::0;21388:99;;21509:37;;;;;21388:99;21509:37:::1;;;;;::::0;;;;-1:-1:-1;;21509:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;31520:407:::0;31649:114;;;;;;;;;-1:-1:-1;;;;;31649:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31649:114:0;-1:-1:-1;;;31649:114:0;;;31811:18;;:41;;;;31611:7;;;;31625:21;;31811:18;;;31649:114;;31811:41;;;;;;31649:114;31811:41;;;;;;;;;;-1:-1:-1;;31811:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31770:82;;;;31866:6;31859:14;;;;31900:10;31889:33;;;;;;;;;;;;;;;-1:-1:-1;31889:33:0;;31520:407;-1:-1:-1;;;;;;31520:407:0:o;29339:523::-;29531:121;;;-1:-1:-1;;;;;29531:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29531:121:0;-1:-1:-1;;;29531:121:0;;;29700:18;;:41;;;;29446:7;;;;;;;;;;;;29531:121;;29446:7;;29507:21;;29700:18;;;;;29531:121;;29700:41;;;29531:121;29700:41;;29531:121;29700:41;;;;;;;;;;-1:-1:-1;;29700:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29659:82;;;;29755:6;29748:14;;;;29789:10;29778:78;;;;;;;;;;;;;;;-1:-1:-1;29778:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29778:78:0;;-1:-1:-1;29778:78:0;-1:-1:-1;29778:78:0;-1:-1:-1;29778:78:0;;-1:-1:-1;29778:78:0;-1:-1:-1;;;;29339:523:0;;;;;;;;;;:::o;36167:209::-;36281:7;36290;36313:58;36351:8;36361:9;36313:37;:58::i;:::-;36306:65;;;;36167:209;;;;;:::o;43348:487::-;43503:4;43518:21;43571:42;;;43620:9;43631:15;43648:6;43656;;43542:126;;;;;;;;;;;-1:-1:-1;;;;;43542:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43542:126:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43542:126:0;-1:-1:-1;;;;;;43542:126:0;;;;;;;;;43720:13;;:36;;;;43542:126;;-1:-1:-1;43542:126:0;;43693:23;;-1:-1:-1;;;;;;43720:13:0;;;;-1:-1:-1;43542:126:0;;-1:-1:-1;43720:36:0;-1:-1:-1;43720:36:0;;-1:-1:-1;43542:126:0;;-1:-1:-1;43720:36:0;;-1:-1:-1;43720:36:0;;-1:-1:-1;43720:36:0;43542:126;43720:36;;;;;;;;;;-1:-1:-1;;43720:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43679:77;;;;43772:6;43765:14;;;;43808:10;43797:30;;;;;;;;;;;;;;;-1:-1:-1;43797:30:0;;43348:487;-1:-1:-1;;;;;;;;;43348:487:0:o;24278:326::-;24366:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24409:113:0::1;::::0;;-1:-1:-1;;;;;24409:113:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24409:113:0::1;-1:-1:-1::0;;;24409:113:0::1;::::0;;24543:14:::1;::::0;:37;;;;24409:113;;24543:14;;::::1;::::0;24409:113;;24543:37;;;;;24409:113;24543:37:::1;;;;;::::0;;;;-1:-1:-1;;24543:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;27410:416:::0;27552:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27594:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;27594:150:0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;27594:150:0::1;-1:-1:-1::0;;;27594:150:0::1;::::0;;27765:14:::1;::::0;:37;;;;27594:150;;27765:14;;::::1;::::0;27594:150;;27765:37;;;;;27594:150;27765:37:::1;;;;;;::::0;;;;-1:-1:-1;;27765:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27752:50;;;;;27814:6;27807:14;;;;18591:1;27410:416:::0;;;;;;:::o;47310:322::-;47396:11;18568:5;;18575:10;;;;;;;;;18568:5;18575:10;;-1:-1:-1;;;18575:10:0;;;;;-1:-1:-1;;;;;18568:5:0;18554:10;:19;18546:40;;;;-1:-1:-1;;;18546:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47438:111:0::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;47438:111:0::1;-1:-1:-1::0;;;47438:111:0::1;::::0;;47569:14:::1;::::0;:37;;;;47438:111;;-1:-1:-1;;;;;47569:14:0::1;::::0;47438:111;;47569:37;;;;47438:111;47569:37:::1;;;;;::::0;;;;-1:-1:-1;;47569:37:0;;;;::::1;::::0;;::::1;::::0;::::1;;;30043:266:::0;30135:86;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30135:86:0;-1:-1:-1;;;30135:86:0;;;30241:18;;:41;;;;30093:11;;-1:-1:-1;;;;;30241:18:0;;30135:86;;30241:41;;;30135:86;30241:41;;30135:86;30241:41;;;;;;;;;;-1:-1:-1;;30241:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30228:54;;;;;30297:6;30290:14;;;;30043:266;;:::o;45304:465::-;45476:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45476:123:0;-1:-1:-1;;;45476:123:0;;;45651:13;;:36;;;;45434:7;;;;45452:21;;-1:-1:-1;;;;;45651:13:0;;;;45476:123;;45651:36;;;;;45476:123;45651:36;;;;;;;;;;-1:-1:-1;;45651:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45610:77;;;;45703:6;45696:14;;;;45739:10;45728:33;;;;;;;;;;;;;;;-1:-1:-1;45728:33:0;;45304:465;-1:-1:-1;;;;;;;45304:465:0:o;50910:139::-;51007:11;;;:36;;;-1:-1:-1;;;51007:36:0;;;;;;;;;50983:7;;-1:-1:-1;;;;;51007:11:0;;;;:25;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;49064:886;49152:7;49161;49177:26;49208:25;49243:17;49238:655;49274:18;;49262:9;:30;49238:655;;;49320:19;;;;;;;;;-1:-1:-1;;;;;49320:19:0;-1:-1:-1;;;;;49320:42:0;;49363:9;49320:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49320:53:0;49316:570;;;49386:27;49420:26;49497:58;49535:8;49545:9;49497:37;:58::i;:::-;49453:102;;-1:-1:-1;49453:102:0;-1:-1:-1;49562:19:0;49584:38;49612:9;49584:27;:38::i;:::-;49562:60;-1:-1:-1;49629:28:0;49660:43;:19;49562:60;49660:30;:43::i;:::-;49629:74;-1:-1:-1;49731:44:0;:18;49629:74;49731:22;:44::i;:::-;49710:65;-1:-1:-1;49802:41:0;:17;49824:18;49802:21;:41::i;:::-;49782:61;;49316:570;;;;;49294:11;;49238:655;;33126:396;33209:7;33225:19;33254;;;;;;;;;-1:-1:-1;;;;;33254:19:0;-1:-1:-1;;;;;33254:39:0;;33294:9;33254:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33254:50:0;33378:95;;;;;;;;;;;;;33254:50;33378:95;;;;;-1:-1:-1;;;;;33378:95:0;-1:-1:-1;;;33378:95:0;;;33343:135;;-1:-1:-1;;;33343:135:0;;;;;;;;;;;;;;;;;;;33254:50;;-1:-1:-1;33310:17:0;;-1:-1:-1;;;;;33343:29:0;;;;;33378:95;33343:135;;;;;;;33378:95;33343:135;;33378:95;;33343:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33343:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33343:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33343:135:0;;;;;;-1:-1:-1;33343:135:0;;;;;;;;;;-1:-1:-1;33343:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33343:135:0;;-1:-1:-1;;33490:27:0;;33332:146;;-1:-1:-1;;33490:27:0;;;;;-1:-1:-1;33490:27:0;;;;;;;;;-1:-1:-1;33490:27:0;;33126:396;-1:-1:-1;;;;33126:396:0:o;19557:98::-;19619:10;19606:24;;;;:12;:24;;;;;;;;;:29;19637:12;;;;;;;;19606:29;19637:12;;-1:-1:-1;;;19637:12:0;;;;;;;19606:29;;19598:52;;;;-1:-1:-1;;;19598:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19557:98::o;33940:390::-;34019:7;34035:19;34064;;;;;;;;;-1:-1:-1;;;;;34064:19:0;-1:-1:-1;;;;;34064:39:0;;34104:9;34064:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34064:50:0;34190:91;;;;;;;;;;;;;34064:50;34190:91;;;;;-1:-1:-1;;;;;34190:91:0;-1:-1:-1;;;34190:91:0;;;34155:131;;-1:-1:-1;;;34155:131:0;;;;;;;;;;;;;;;;;;;34064:50;;-1:-1:-1;34122:17:0;;-1:-1:-1;;;;;34155:29:0;;;;;34190:91;34155:131;;;;;;;34190:91;34155:131;;34190:91;;34155:131;;;;;;;;;;;;;;;;;;19104:213;19213:19;;:47;;;-1:-1:-1;;;19213:47:0;;;;19176:10;;19213:19;;;-1:-1:-1;;;;;19213:19:0;;:45;;:47;;;;;;;;;;;;;;:19;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19213:47:0;-1:-1:-1;;;;;19200:60:0;;;;;;;19199:86;;-1:-1:-1;19279:5:0;;-1:-1:-1;;;;;19266:18:0;;;19279:5;;19266:18;19199:86;19287:24;;;;;;;;;;;;;-1:-1:-1;;;19287:24:0;;;19191:121;;;;;-1:-1:-1;;;19191:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19104:213;:::o;45985:424::-;46080:7;46089;46105:19;46134;;;;;;;;;-1:-1:-1;;;;;46134:19:0;-1:-1:-1;;;;;46134:39:0;;46174:9;46134:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46134:50:0;46258:93;;;-1:-1:-1;;;;;46258:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;46134:50;46258:93;;;;;-1:-1:-1;;;;;46258:93:0;-1:-1:-1;;;46258:93:0;;;46223:133;;-1:-1:-1;;;46223:133:0;;;;;;;;;;;;;;;;;;;46134:50;;-1:-1:-1;46190:17:0;;46223:29;;;;;;46258:93;;46223:133;;;;;;;;46258:93;-1:-1:-1;46223:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46223:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46223:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46223:133:0;;;;;;-1:-1:-1;46223:133:0;;;;;;;;;;-1:-1:-1;46223:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46212:144;;;;;;46379:4;46368:36;;;;;;;;;;;;;;;-1:-1:-1;46368:36:0;;;;;;;;;;;-1:-1:-1;45985:424:0;-1:-1:-1;;;;;45985:424:0:o;5165:128::-;5230:7;5253:35;5258:10;5263:1;5266;5258:4;:10::i;:::-;4010:8;5253:35;;;;;;;;;;;;;-1:-1:-1;;;5253:35:0;;;:4;:35::i;5032:128::-;5097:7;5120:35;5125:21;5130:1;4010:8;5125:4;:21::i;:::-;5148:1;5120:35;;;;;;;;;;;;;-1:-1:-1;;;5120:35:0;;;:4;:35::i;48043:738::-;48158:7;48167;48183:13;48199:32;48221:9;48199:21;:32::i;:::-;48183:48;;48236:19;48265;;;;;;;;;-1:-1:-1;;;;;48265:19:0;-1:-1:-1;;;;;48265:39:0;;48305:9;48265:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48265:50:0;48442:99;;;-1:-1:-1;;;;;48442:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;48265:50;48442:99;;;;;-1:-1:-1;;;;;48442:99:0;-1:-1:-1;;;48442:99:0;;;48407:139;;-1:-1:-1;;;48407:139:0;;;;;;;;;;;;;;;;;;;48265:50;;-1:-1:-1;48321:21:0;;;;48374:17;;48407:29;;;;;;:139;;;;;48442:99;48407:139;;48442:99;48321:21;48407:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48407:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48407:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48407:139:0;;;;;;-1:-1:-1;48407:139:0;;;;;;;;;;-1:-1:-1;48407:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48396:150;;;;;;48594:4;48583:36;;;;;;;;;;;;;;;-1:-1:-1;48583:36:0;;;;;;;;;-1:-1:-1;48583:36:0;-1:-1:-1;48626:20:0;48649:31;48583:36;48674:5;48649:24;:31::i;:::-;48626:54;-1:-1:-1;48685:19:0;48707:30;:12;48731:5;48707:23;:30::i;:::-;48750:12;;;;-1:-1:-1;48043:738:0;;-1:-1:-1;;;;;;;;;48043:738:0:o;4077:134::-;4135:7;4163:5;;;4181:6;;;;4173:20;;;;;-1:-1:-1;;;4173:20:0;;;;;;;;;;;;-1:-1:-1;;;4173:20:0;;;;;;;;;;;;;;4216:101;4274:7;4297:15;4302:1;4305;4297:15;;;;;;;;;;;;;-1:-1:-1;;;4297:15:0;;;:4;:15::i;50165:468::-;50271:7;50285:21;50311:20;50368:39;50398:8;50368:29;:39::i;:::-;50336:71;;-1:-1:-1;50336:71:0;-1:-1:-1;50416:18:0;50412:47;;50452:1;50445:8;;;;;;50412:47;50485:12;50469:13;:28;50465:164;;;50515:76;50558:32;50580:9;50558:21;:32::i;:::-;50515:31;:13;50533:12;50515:17;:31::i;:76::-;50508:83;;;;;;50465:164;50622:1;50615:8;;;;;;4688:181;4747:7;4767:6;4763:35;;-1:-1:-1;4791:1:0;4784:8;;4763:35;4816:4;;;4819:1;4816;:4;:1;4834:5;;;;;4833:12;4825:26;;;;;-1:-1:-1;;;4825:26:0;;;;;;;;;;;;-1:-1:-1;;;4825:26:0;;;;;;;;;;;;;;4874:153;4961:7;4992:12;4985:5;4977:28;;;;-1:-1:-1;;;4977:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5021:1;5017;:5;;;;;;;4874:153;-1:-1:-1;;;;4874:153:0:o;4529:154::-;4616:7;4648:12;4640:6;;;;4632:29;;;;-1:-1:-1;;;4632:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4673:5:0;;;4529:154::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://cf985dddebef7b1ded8b71ff43e0df43880fc6f1d293faea507acc7a687eb14f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.