More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,665 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem Underlyin... | 22746833 | 881 days ago | IN | 0 AVAX | 0.01391065 | ||||
Redeem | 15959981 | 1045 days ago | IN | 0 AVAX | 0.00558155 | ||||
Redeem | 15718572 | 1051 days ago | IN | 0 AVAX | 0.00558125 | ||||
Redeem | 14103605 | 1088 days ago | IN | 0 AVAX | 0.00574093 | ||||
Redeem | 14103605 | 1088 days ago | IN | 0 AVAX | 0.01012798 | ||||
Repay Borrow | 14103472 | 1088 days ago | IN | 0 AVAX | 0.01641064 | ||||
Redeem Underlyin... | 14103450 | 1088 days ago | IN | 0 AVAX | 0.02153416 | ||||
Repay Borrow | 14103425 | 1088 days ago | IN | 0 AVAX | 0.01598759 | ||||
Redeem Underlyin... | 14103407 | 1088 days ago | IN | 0 AVAX | 0.02250756 | ||||
Repay Borrow | 14103377 | 1088 days ago | IN | 0 AVAX | 0.0158961 | ||||
Redeem Underlyin... | 14103335 | 1088 days ago | IN | 0 AVAX | 0.02118264 | ||||
Repay Borrow | 14103301 | 1088 days ago | IN | 0 AVAX | 0.01628296 | ||||
Redeem Underlyin... | 14103243 | 1088 days ago | IN | 0 AVAX | 0.02117131 | ||||
Redeem | 13997960 | 1091 days ago | IN | 0 AVAX | 0.01241666 | ||||
Redeem | 13996261 | 1091 days ago | IN | 0 AVAX | 0.01059054 | ||||
Redeem Underlyin... | 13996243 | 1091 days ago | IN | 0 AVAX | 0.02223721 | ||||
Repay Borrow | 13995892 | 1091 days ago | IN | 0 AVAX | 0.01320527 | ||||
Redeem Underlyin... | 13995871 | 1091 days ago | IN | 0 AVAX | 0.01686285 | ||||
Repay Borrow | 13995830 | 1091 days ago | IN | 0 AVAX | 0.01260971 | ||||
Redeem Underlyin... | 13995802 | 1091 days ago | IN | 0 AVAX | 0.01771966 | ||||
Repay Borrow | 13995766 | 1091 days ago | IN | 0 AVAX | 0.0133398 | ||||
Redeem Underlyin... | 13995747 | 1091 days ago | IN | 0 AVAX | 0.01781568 | ||||
Repay Borrow | 13995724 | 1091 days ago | IN | 0 AVAX | 0.01221331 | ||||
Redeem Underlyin... | 13995703 | 1091 days ago | IN | 0 AVAX | 0.01574942 | ||||
Repay Borrow | 13995682 | 1091 days ago | IN | 0 AVAX | 0.01260662 |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x2773604f...f39d7C369 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
CErc20Immutable
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2021-11-09 */ pragma solidity >=0.8.0; contract ExponentialNoError { uint constant expScale = 1e18; uint constant doubleScale = 1e36; uint constant halfExpScale = expScale/2; uint constant mantissaOne = expScale; struct Exp { uint mantissa; } struct Double { uint mantissa; } function truncate(Exp memory exp) pure internal returns (uint) { return exp.mantissa / expScale; } function mul_ScalarTruncate(Exp memory a, uint scalar) pure internal returns (uint) { Exp memory product = mul_(a, scalar); return truncate(product); } function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (uint) { Exp memory product = mul_(a, scalar); return add_(truncate(product), addend); } function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa < right.mantissa; } function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa <= right.mantissa; } function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa > right.mantissa; } function isZeroExp(Exp memory value) pure internal returns (bool) { return value.mantissa == 0; } function safe224(uint n, string memory errorMessage) pure internal returns (uint224) { require(n < 2**224, errorMessage); return uint224(n); } function safe32(uint n, string memory errorMessage) pure internal returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function add_(Exp memory a, Exp memory b) pure internal returns (Exp memory) { return Exp({mantissa: add_(a.mantissa, b.mantissa)}); } function add_(Double memory a, Double memory b) pure internal returns (Double memory) { return Double({mantissa: add_(a.mantissa, b.mantissa)}); } function add_(uint a, uint b) pure internal returns (uint) { return add_(a, b, "addition overflow"); } function add_(uint a, uint b, string memory errorMessage) pure internal returns (uint) { uint c = a + b; require(c >= a, errorMessage); return c; } function sub_(Exp memory a, Exp memory b) pure internal returns (Exp memory) { return Exp({mantissa: sub_(a.mantissa, b.mantissa)}); } function sub_(Double memory a, Double memory b) pure internal returns (Double memory) { return Double({mantissa: sub_(a.mantissa, b.mantissa)}); } function sub_(uint a, uint b) pure internal returns (uint) { return sub_(a, b, "subtraction underflow"); } function sub_(uint a, uint b, string memory errorMessage) pure internal returns (uint) { require(b <= a, errorMessage); return a - b; } function mul_(Exp memory a, Exp memory b) pure internal returns (Exp memory) { return Exp({mantissa: mul_(a.mantissa, b.mantissa) / expScale}); } function mul_(Exp memory a, uint b) pure internal returns (Exp memory) { return Exp({mantissa: mul_(a.mantissa, b)}); } function mul_(uint a, Exp memory b) pure internal returns (uint) { return mul_(a, b.mantissa) / expScale; } function mul_(Double memory a, Double memory b) pure internal returns (Double memory) { return Double({mantissa: mul_(a.mantissa, b.mantissa) / doubleScale}); } function mul_(Double memory a, uint b) pure internal returns (Double memory) { return Double({mantissa: mul_(a.mantissa, b)}); } function mul_(uint a, Double memory b) pure internal returns (uint) { return mul_(a, b.mantissa) / doubleScale; } function mul_(uint a, uint b) pure internal returns (uint) { return mul_(a, b, "multiplication overflow"); } function mul_(uint a, uint b, string memory errorMessage) pure internal returns (uint) { if (a == 0 || b == 0) { return 0; } uint c = a * b; require(c / a == b, errorMessage); return c; } function div_(Exp memory a, Exp memory b) pure internal returns (Exp memory) { return Exp({mantissa: div_(mul_(a.mantissa, expScale), b.mantissa)}); } function div_(Exp memory a, uint b) pure internal returns (Exp memory) { return Exp({mantissa: div_(a.mantissa, b)}); } function div_(uint a, Exp memory b) pure internal returns (uint) { return div_(mul_(a, expScale), b.mantissa); } function div_(Double memory a, Double memory b) pure internal returns (Double memory) { return Double({mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa)}); } function div_(Double memory a, uint b) pure internal returns (Double memory) { return Double({mantissa: div_(a.mantissa, b)}); } function div_(uint a, Double memory b) pure internal returns (uint) { return div_(mul_(a, doubleScale), b.mantissa); } function div_(uint a, uint b) pure internal returns (uint) { return div_(a, b, "divide by zero"); } function div_(uint a, uint b, string memory errorMessage) pure internal returns (uint) { require(b > 0, errorMessage); return a / b; } function fraction(uint a, uint b) pure internal returns (Double memory) { return Double({mantissa: div_(mul_(a, doubleScale), b)}); } } pragma solidity >=0.8.0; contract CarefulMath { enum MathError { NO_ERROR, DIVISION_BY_ZERO, INTEGER_OVERFLOW, INTEGER_UNDERFLOW } function mulUInt(uint a, uint b) internal pure returns (MathError, uint) { if (a == 0) { return (MathError.NO_ERROR, 0); } uint c = a * b; if (c / a != b) { return (MathError.INTEGER_OVERFLOW, 0); } else { return (MathError.NO_ERROR, c); } } function divUInt(uint a, uint b) internal pure returns (MathError, uint) { if (b == 0) { return (MathError.DIVISION_BY_ZERO, 0); } return (MathError.NO_ERROR, a / b); } function subUInt(uint a, uint b) internal pure returns (MathError, uint) { if (b <= a) { return (MathError.NO_ERROR, a - b); } else { return (MathError.INTEGER_UNDERFLOW, 0); } } function addUInt(uint a, uint b) internal pure returns (MathError, uint) { uint c = a + b; if (c >= a) { return (MathError.NO_ERROR, c); } else { return (MathError.INTEGER_OVERFLOW, 0); } } function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) { (MathError err0, uint sum) = addUInt(a, b); if (err0 != MathError.NO_ERROR) { return (err0, 0); } return subUInt(sum, c); } } pragma solidity >=0.8.0; interface EIP20NonStandardInterface { function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256 balance); function transfer(address dst, uint256 amount) external; function transferFrom(address src, address dst, uint256 amount) external; function approve(address spender, uint256 amount) external returns (bool success); function allowance(address owner, address spender) external view returns (uint256 remaining); event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); } pragma solidity >=0.8.0; abstract contract InterestRateModel { bool public constant isInterestRateModel = true; function getBorrowRate(uint cash, uint borrows, uint reserves) external virtual view returns (uint); function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) external virtual view returns (uint); } pragma solidity >=0.8.0; abstract contract ComptrollerInterface { bool public constant isComptroller = true; function enterMarkets(address[] calldata cTokens) external virtual returns (uint[] memory); function exitMarket(address cToken) external virtual returns (uint); function mintAllowed(address cToken, address minter, uint mintAmount) external virtual returns (uint); function mintVerify(address cToken, address minter, uint mintAmount, uint mintTokens) external virtual; function redeemAllowed(address cToken, address redeemer, uint redeemTokens) external virtual returns (uint); function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual; function borrowAllowed(address cToken, address borrower, uint borrowAmount) external virtual returns (uint); function borrowVerify(address cToken, address borrower, uint borrowAmount) external virtual; function repayBorrowAllowed( address cToken, address payer, address borrower, uint repayAmount) external virtual returns (uint); function repayBorrowVerify( address cToken, address payer, address borrower, uint repayAmount, uint borrowerIndex) external virtual; function liquidateBorrowAllowed( address cTokenBorrowed, address cTokenCollateral, address liquidator, address borrower, uint repayAmount) external virtual returns (uint); function liquidateBorrowVerify( address cTokenBorrowed, address cTokenCollateral, address liquidator, address borrower, uint repayAmount, uint seizeTokens) external virtual; function seizeAllowed( address cTokenCollateral, address cTokenBorrowed, address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); function seizeVerify( address cTokenCollateral, address cTokenBorrowed, address liquidator, address borrower, uint seizeTokens) external virtual; function transferAllowed(address cToken, address src, address dst, uint transferTokens) external virtual returns (uint); function transferVerify(address cToken, address src, address dst, uint transferTokens) external virtual; function liquidateCalculateSeizeTokens( address cTokenBorrowed, address cTokenCollateral, uint repayAmount) external virtual view returns (uint, uint); function getBlockNumber() public virtual view returns (uint); } pragma solidity ^0.8.0; library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } } pragma solidity >=0.5.16 <0.9.0; library BytesLib { function concatBytesSig(bytes4 signature, bytes memory data1, bytes memory data2) internal pure returns(bytes memory combined) { bytes memory tempBytes; assembly { tempBytes := mload(0x40) let length := mload(data1) mstore(tempBytes, length) let mc := add(tempBytes, 0x20) mstore(mc, signature) mc := add(mc, 4) let end := add(mc, length) for { let cc := add(data1, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } length := mload(data2) mstore(tempBytes, add(4, add(length, mload(tempBytes)))) mc := end end := add(mc, length) for { let cc := add(data2, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(0x40, and( add(add(end, iszero(add(4, add(length, mload(data1))))), 31), not(31) )) } return tempBytes; } } pragma solidity >=0.5.0; interface IVeeProxyController { function deposit(address account, address token, uint256 amount, uint8 leverage) external payable; } pragma solidity >=0.8.0; interface EIP20Interface { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256 balance); function transfer(address dst, uint256 amount) external returns (bool success); function transferFrom(address src, address dst, uint256 amount) external returns (bool success); function approve(address spender, uint256 amount) external returns (bool success); function allowance(address owner, address spender) external view returns (uint256 remaining); event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); } pragma solidity >=0.8.0; contract Exponential is CarefulMath, ExponentialNoError { function getExp(uint num, uint denom) pure internal returns (MathError, Exp memory) { (MathError err0, uint scaledNumerator) = mulUInt(num, expScale); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } (MathError err1, uint rational) = divUInt(scaledNumerator, denom); if (err1 != MathError.NO_ERROR) { return (err1, Exp({mantissa: 0})); } return (MathError.NO_ERROR, Exp({mantissa: rational})); } function addExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) { (MathError error, uint result) = addUInt(a.mantissa, b.mantissa); return (error, Exp({mantissa: result})); } function subExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) { (MathError error, uint result) = subUInt(a.mantissa, b.mantissa); return (error, Exp({mantissa: result})); } function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) { (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa})); } function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) { (MathError err, Exp memory product) = mulScalar(a, scalar); if (err != MathError.NO_ERROR) { return (err, 0); } return (MathError.NO_ERROR, truncate(product)); } function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (MathError, uint) { (MathError err, Exp memory product) = mulScalar(a, scalar); if (err != MathError.NO_ERROR) { return (err, 0); } return addUInt(truncate(product), addend); } function divScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) { (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return (MathError.NO_ERROR, Exp({mantissa: descaledMantissa})); } function divScalarByExp(uint scalar, Exp memory divisor) pure internal returns (MathError, Exp memory) { (MathError err0, uint numerator) = mulUInt(expScale, scalar); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return getExp(numerator, divisor.mantissa); } function divScalarByExpTruncate(uint scalar, Exp memory divisor) pure internal returns (MathError, uint) { (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor); if (err != MathError.NO_ERROR) { return (err, 0); } return (MathError.NO_ERROR, truncate(fraction)); } function mulExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) { (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct); if (err1 != MathError.NO_ERROR) { return (err1, Exp({mantissa: 0})); } (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale); assert(err2 == MathError.NO_ERROR); return (MathError.NO_ERROR, Exp({mantissa: product})); } function mulExp(uint a, uint b) pure internal returns (MathError, Exp memory) { return mulExp(Exp({mantissa: a}), Exp({mantissa: b})); } function mulExp3(Exp memory a, Exp memory b, Exp memory c) pure internal returns (MathError, Exp memory) { (MathError err, Exp memory ab) = mulExp(a, b); if (err != MathError.NO_ERROR) { return (err, ab); } return mulExp(ab, c); } function divExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) { return getExp(a.mantissa, b.mantissa); } } pragma solidity >=0.8.0; contract ComptrollerErrorReporter { enum Error { NO_ERROR, UNAUTHORIZED, COMPTROLLER_MISMATCH, INSUFFICIENT_SHORTFALL, INSUFFICIENT_LIQUIDITY, INVALID_CLOSE_FACTOR, INVALID_COLLATERAL_FACTOR, INVALID_LIQUIDATION_INCENTIVE, MARKET_NOT_ENTERED, MARKET_NOT_LISTED, MARKET_ALREADY_LISTED, MATH_ERROR, NONZERO_BORROW_BALANCE, PRICE_ERROR, REJECTION, SNAPSHOT_ERROR, TOO_MANY_ASSETS, TOO_MUCH_REPAY } enum FailureInfo { ACCEPT_ADMIN_PENDING_ADMIN_CHECK, ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK, EXIT_MARKET_BALANCE_OWED, EXIT_MARKET_REJECTION, SET_CLOSE_FACTOR_OWNER_CHECK, SET_CLOSE_FACTOR_VALIDATION, SET_COLLATERAL_FACTOR_OWNER_CHECK, SET_COLLATERAL_FACTOR_NO_EXISTS, SET_COLLATERAL_FACTOR_VALIDATION, SET_COLLATERAL_FACTOR_WITHOUT_PRICE, SET_IMPLEMENTATION_OWNER_CHECK, SET_LIQUIDATION_INCENTIVE_OWNER_CHECK, SET_LIQUIDATION_INCENTIVE_VALIDATION, SET_MAX_ASSETS_OWNER_CHECK, SET_PENDING_ADMIN_OWNER_CHECK, SET_PENDING_IMPLEMENTATION_OWNER_CHECK, SET_PRICE_ORACLE_OWNER_CHECK, SUPPORT_MARKET_EXISTS, SUPPORT_MARKET_OWNER_CHECK, SET_PAUSE_GUARDIAN_OWNER_CHECK, SET_TOKEN_ADDRESS_OWNER_CHECK } event Failure(uint error, uint info, uint detail); function fail(Error err, FailureInfo info) internal returns (uint) { emit Failure(uint(err), uint(info), 0); return uint(err); } function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { emit Failure(uint(err), uint(info), opaqueError); return uint(err); } } contract TokenErrorReporter { enum Error { NO_ERROR, UNAUTHORIZED, BAD_INPUT, COMPTROLLER_REJECTION, COMPTROLLER_CALCULATION_ERROR, INTEREST_RATE_MODEL_ERROR, INVALID_ACCOUNT_PAIR, INVALID_CLOSE_AMOUNT_REQUESTED, INVALID_COLLATERAL_FACTOR, MATH_ERROR, MARKET_NOT_FRESH, MARKET_NOT_LISTED, TOKEN_INSUFFICIENT_ALLOWANCE, TOKEN_INSUFFICIENT_BALANCE, TOKEN_INSUFFICIENT_CASH, TOKEN_TRANSFER_IN_FAILED, TOKEN_TRANSFER_OUT_FAILED } enum FailureInfo { ACCEPT_ADMIN_PENDING_ADMIN_CHECK, ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, ACCRUE_INTEREST_BORROW_RATE_CALCULATION_FAILED, ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, BORROW_ACCRUE_INTEREST_FAILED, BORROW_CASH_NOT_AVAILABLE, BORROW_FRESHNESS_CHECK, BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, BORROW_MARKET_NOT_LISTED, BORROW_COMPTROLLER_REJECTION, LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED, LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED, LIQUIDATE_COLLATERAL_FRESHNESS_CHECK, LIQUIDATE_COMPTROLLER_REJECTION, LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED, LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX, LIQUIDATE_CLOSE_AMOUNT_IS_ZERO, LIQUIDATE_FRESHNESS_CHECK, LIQUIDATE_LIQUIDATOR_IS_BORROWER, LIQUIDATE_REPAY_BORROW_FRESH_FAILED, LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED, LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED, LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER, LIQUIDATE_SEIZE_TOO_MUCH, MINT_ACCRUE_INTEREST_FAILED, MINT_COMPTROLLER_REJECTION, MINT_EXCHANGE_CALCULATION_FAILED, MINT_EXCHANGE_RATE_READ_FAILED, MINT_FRESHNESS_CHECK, MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, MINT_TRANSFER_IN_FAILED, MINT_TRANSFER_IN_NOT_POSSIBLE, REDEEM_ACCRUE_INTEREST_FAILED, REDEEM_COMPTROLLER_REJECTION, REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, REDEEM_EXCHANGE_RATE_READ_FAILED, REDEEM_FRESHNESS_CHECK, REDEEM_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED, REDEEM_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, REDEEM_TRANSFER_OUT_NOT_POSSIBLE, REDUCE_RESERVES_ACCRUE_INTEREST_FAILED, REDUCE_RESERVES_ADMIN_CHECK, REDUCE_RESERVES_CASH_NOT_AVAILABLE, REDUCE_RESERVES_FRESH_CHECK, REDUCE_RESERVES_VALIDATION, REPAY_BEHALF_ACCRUE_INTEREST_FAILED, REPAY_BORROW_ACCRUE_INTEREST_FAILED, REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, REPAY_BORROW_COMPTROLLER_REJECTION, REPAY_BORROW_FRESHNESS_CHECK, REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED, REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE, SET_COLLATERAL_FACTOR_OWNER_CHECK, SET_COLLATERAL_FACTOR_VALIDATION, SET_COMPTROLLER_OWNER_CHECK, SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED, SET_INTEREST_RATE_MODEL_FRESH_CHECK, SET_INTEREST_RATE_MODEL_OWNER_CHECK, SET_MAX_ASSETS_OWNER_CHECK, SET_ORACLE_MARKET_NOT_LISTED, SET_PENDING_ADMIN_OWNER_CHECK, SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED, SET_RESERVE_FACTOR_ADMIN_CHECK, SET_RESERVE_FACTOR_FRESH_CHECK, SET_RESERVE_FACTOR_BOUNDS_CHECK, TRANSFER_COMPTROLLER_REJECTION, TRANSFER_NOT_ALLOWED, TRANSFER_NOT_ENOUGH, TRANSFER_TOO_MUCH, ADD_RESERVES_ACCRUE_INTEREST_FAILED, ADD_RESERVES_FRESH_CHECK, ADD_RESERVES_TRANSFER_IN_NOT_POSSIBLE, BORROW_FRESH_LEVERAGE_AMOUNT_FAILED, REPAY_LEVERAGE_ACCUMULATED_BALANCE_CALCULATION_FAILED } event Failure(uint error, uint info, uint detail); function fail(Error err, FailureInfo info) internal returns (uint) { emit Failure(uint(err), uint(info), 0); return uint(err); } function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) { emit Failure(uint(err), uint(info), opaqueError); return uint(err); } } pragma solidity >=0.8.0; abstract contract CTokenStorage { bool internal _notEntered; string public name; string public symbol; uint8 public decimals; uint internal constant borrowRateMaxMantissa = 0.0005e16; uint internal constant reserveFactorMaxMantissa = 1e18; address public admin; address public pendingAdmin; ComptrollerInterface public comptroller; InterestRateModel public interestRateModel; uint internal initialExchangeRateMantissa; uint public reserveFactorMantissa; uint public accrualBlockNumber; uint public borrowIndex; uint public totalBorrows; uint public totalReserves; uint public totalSupply; address public orderProxy; mapping (address => uint) internal accountTokens; mapping (address => mapping (address => uint)) internal transferAllowances; struct BorrowSnapshot { uint principal; uint interestIndex; } mapping(address => BorrowSnapshot) internal accountBorrows; } abstract contract CTokenInterface is CTokenStorage { bool public constant isCToken = true; event AccrueInterest(uint cashPrior, uint interestAccumulated, uint borrowIndex, uint totalBorrows); event Mint(address payer, address minter, uint mintAmount, uint mintTokens); event Redeem(address redeemer, uint redeemAmount, uint redeemTokens); event Borrow(address borrower, uint borrowAmount, uint accountBorrows, uint totalBorrows); event RepayBorrow(address payer, address borrower, uint repayAmount, uint accountBorrows, uint totalBorrows); event LiquidateBorrow(address liquidator, address borrower, uint repayAmount, address cTokenCollateral, uint seizeTokens); event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); event NewAdmin(address oldAdmin, address newAdmin); event NewComptroller(ComptrollerInterface oldComptroller, ComptrollerInterface newComptroller); event NewMarketInterestRateModel(InterestRateModel oldInterestRateModel, InterestRateModel newInterestRateModel); event NewReserveFactor(uint oldReserveFactorMantissa, uint newReserveFactorMantissa); event ReservesAdded(address benefactor, uint addAmount, uint newTotalReserves); event ReservesReduced(address admin, uint reduceAmount, uint newTotalReserves); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); event NewOrderProxy(address oldVeeProxy, address newVeeProxy); event RepayLeverage(address payer, address borrower, uint repayAmount, uint expectLeverageAmount, uint remainLeverageAmount); event LiquidateLeverage(address borrower, uint insufficientLeverage, uint oldBorrowPrincipal, uint newBorrowPrincipal); function transfer(address dst, uint amount) external virtual returns (bool); function transferFrom(address src, address dst, uint amount) external virtual returns (bool); function approve(address spender, uint amount) external virtual returns (bool); function allowance(address owner, address spender) external virtual view returns (uint); function balanceOf(address owner) external virtual view returns (uint); function balanceOfUnderlying(address owner) external virtual returns (uint); function getAccountSnapshot(address account) external virtual view returns (uint, uint, uint, uint); function borrowRatePerBlock() external virtual view returns (uint); function supplyRatePerBlock() external virtual view returns (uint); function totalBorrowsCurrent() external virtual returns (uint); function borrowBalanceCurrent(address account) external virtual returns (uint); function borrowBalanceStored(address account) public virtual view returns (uint); function exchangeRateCurrent() public virtual returns (uint); function exchangeRateStored() public virtual view returns (uint); function getCash() external virtual view returns (uint); function accrueInterest() public virtual returns (uint); function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint); function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint); function _acceptAdmin() external virtual returns (uint); function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint); function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint); function _reduceReserves(uint reduceAmount) external virtual returns (uint); function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint); } contract CErc20Storage { address public underlying; } abstract contract CErc20Interface is CErc20Storage { function mint(uint mintAmount) external virtual returns (uint); function redeem(uint redeemTokens) external virtual returns (uint); function redeemUnderlying(uint redeemAmount) external virtual returns (uint); function borrow(uint borrowAmount) external virtual returns (uint); function repayBorrow(uint repayAmount) external virtual returns (uint); function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint); function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external virtual returns (uint); function sweepToken(EIP20NonStandardInterface token) external virtual; function _addReserves(uint addAmount) external virtual returns (uint); function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint); } contract CDelegationStorage { address public implementation; } abstract contract CDelegatorInterface is CDelegationStorage { event NewImplementation(address oldImplementation, address newImplementation); function _setImplementation(address implementation_, bool allowResign, bytes memory becomeImplementationData) public virtual; } abstract contract CDelegateInterface is CDelegationStorage { function _becomeImplementation(bytes memory data) public virtual; function _resignImplementation() public virtual; } interface CEtherInterface { function mintBehalf(address receiver) external payable returns (uint); } pragma solidity >=0.8.0; abstract contract CToken is CTokenInterface, Exponential, TokenErrorReporter { address constant VETH = address(1); function initialize(ComptrollerInterface comptroller_, InterestRateModel interestRateModel_, uint initialExchangeRateMantissa_, string memory name_, string memory symbol_, uint8 decimals_) public { require(msg.sender == admin, "only admin may initialize the market"); require(accrualBlockNumber == 0 && borrowIndex == 0, "market may only be initialized once"); initialExchangeRateMantissa = initialExchangeRateMantissa_; require(initialExchangeRateMantissa > 0, "initial exchange rate must be greater than zero."); uint err = _setComptroller(comptroller_); require(err == uint(Error.NO_ERROR), "setting comptroller failed"); accrualBlockNumber = getBlockNumber(); borrowIndex = mantissaOne; err = _setInterestRateModelFresh(interestRateModel_); require(err == uint(Error.NO_ERROR), "setting interest rate model failed"); name = name_; symbol = symbol_; decimals = decimals_; _notEntered = true; } function transferTokens(address spender, address src, address dst, uint tokens) internal returns (uint) { uint allowed = comptroller.transferAllowed(address(this), src, dst, tokens); if (allowed != 0) { return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.TRANSFER_COMPTROLLER_REJECTION, allowed); } if (src == dst) { return fail(Error.BAD_INPUT, FailureInfo.TRANSFER_NOT_ALLOWED); } uint startingAllowance = 0; if (spender == src) { startingAllowance = type(uint).max; } else { startingAllowance = transferAllowances[src][spender]; } uint allowanceNew = startingAllowance - tokens; uint srcTokensNew = accountTokens[src] - tokens; uint dstTokensNew = accountTokens[dst] + tokens; accountTokens[src] = srcTokensNew; accountTokens[dst] = dstTokensNew; if (startingAllowance != type(uint).max) { transferAllowances[src][spender] = allowanceNew; } emit Transfer(src, dst, tokens); return uint(Error.NO_ERROR); } function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) { return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR); } function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) { return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR); } function approve(address spender, uint256 amount) external override returns (bool) { address src = msg.sender; transferAllowances[src][spender] = amount; emit Approval(src, spender, amount); return true; } function allowance(address owner, address spender) external override view returns (uint256) { return transferAllowances[owner][spender]; } function balanceOf(address owner) external override view returns (uint256) { return accountTokens[owner]; } function balanceOfUnderlying(address owner) external override returns (uint) { Exp memory exchangeRate = Exp({mantissa: exchangeRateCurrent()}); (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]); require(mErr == MathError.NO_ERROR, "balance could not be calculated"); return balance; } function getAccountSnapshot(address account) external override view returns (uint, uint, uint, uint) { uint cTokenBalance = accountTokens[account]; uint borrowBalance; uint exchangeRateMantissa; MathError mErr; (mErr, borrowBalance) = borrowBalanceStoredInternal(account); if (mErr != MathError.NO_ERROR) { return (uint(Error.MATH_ERROR), 0, 0, 0); } (mErr, exchangeRateMantissa) = exchangeRateStoredInternal(); if (mErr != MathError.NO_ERROR) { return (uint(Error.MATH_ERROR), 0, 0, 0); } return (uint(Error.NO_ERROR), cTokenBalance, borrowBalance, exchangeRateMantissa); } function getBlockNumber() internal virtual view returns (uint) { return block.number; } function borrowRatePerBlock() external override view returns (uint) { return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves); } function supplyRatePerBlock() external override view returns (uint) { return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa); } function totalBorrowsCurrent() external override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return totalBorrows; } function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return borrowBalanceStored(account); } function borrowBalanceStored(address account) public override view returns (uint) { (MathError err, uint result) = borrowBalanceStoredInternal(account); require(err == MathError.NO_ERROR, "borrowBalanceStoredInternal failed"); return result; } function borrowBalanceStoredInternal(address account) internal view returns (MathError, uint) { MathError mathErr; uint principalTimesIndex; uint result; BorrowSnapshot storage borrowSnapshot = accountBorrows[account]; if (borrowSnapshot.principal == 0) { return (MathError.NO_ERROR, 0); } (mathErr, principalTimesIndex) = mulUInt(borrowSnapshot.principal, borrowIndex); if (mathErr != MathError.NO_ERROR) { return (mathErr, 0); } (mathErr, result) = divUInt(principalTimesIndex, borrowSnapshot.interestIndex); if (mathErr != MathError.NO_ERROR) { return (mathErr, 0); } return (MathError.NO_ERROR, result); } function exchangeRateCurrent() public override nonReentrant returns (uint) { require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed"); return exchangeRateStored(); } function exchangeRateStored() public override view returns (uint) { (MathError err, uint result) = exchangeRateStoredInternal(); require(err == MathError.NO_ERROR, "exchangeRateStoredInternal failed"); return result; } function exchangeRateStoredInternal() internal virtual view returns (MathError, uint) { uint _totalSupply = totalSupply; if (_totalSupply == 0) { return (MathError.NO_ERROR, initialExchangeRateMantissa); } else { uint totalCash = getCashPrior(); Exp memory exchangeRate; MathError mathErr; uint cashPlusBorrowsMinusReserves = totalCash + totalBorrows - totalReserves; (mathErr, exchangeRate) = getExp(cashPlusBorrowsMinusReserves, _totalSupply); if (mathErr != MathError.NO_ERROR) { return (mathErr, 0); } return (MathError.NO_ERROR, exchangeRate.mantissa); } } function getCash() external view override returns (uint) { return getCashPrior(); } function accrueInterest() public override virtual returns (uint) { uint currentBlockNumber = getBlockNumber(); uint accrualBlockNumberPrior = accrualBlockNumber; if (accrualBlockNumberPrior == currentBlockNumber) { return uint(Error.NO_ERROR); } uint cashPrior = getCashPrior(); uint borrowsPrior = totalBorrows; uint reservesPrior = totalReserves; uint borrowIndexPrior = borrowIndex; uint borrowRateMantissa = interestRateModel.getBorrowRate(cashPrior, borrowsPrior, reservesPrior); require(borrowRateMantissa <= borrowRateMaxMantissa, "borrow rate is absurdly high"); (MathError mathErr, uint blockDelta) = subUInt(currentBlockNumber, accrualBlockNumberPrior); require(mathErr == MathError.NO_ERROR, "block delta error"); Exp memory simpleInterestFactor; uint interestAccumulated; uint totalBorrowsNew; uint totalReservesNew; uint borrowIndexNew; (mathErr, simpleInterestFactor) = mulScalar(Exp({mantissa: borrowRateMantissa}), blockDelta); if (mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, uint(mathErr)); } (mathErr, interestAccumulated) = mulScalarTruncate(simpleInterestFactor, borrowsPrior); if (mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, uint(mathErr)); } (mathErr, totalBorrowsNew) = addUInt(interestAccumulated, borrowsPrior); if (mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, uint(mathErr)); } (mathErr, totalReservesNew) = mulScalarTruncateAddUInt(Exp({mantissa: reserveFactorMantissa}), interestAccumulated, reservesPrior); if (mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, uint(mathErr)); } (mathErr, borrowIndexNew) = mulScalarTruncateAddUInt(simpleInterestFactor, borrowIndexPrior, borrowIndexPrior); if (mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, uint(mathErr)); } accrualBlockNumber = currentBlockNumber; borrowIndex = borrowIndexNew; totalBorrows = totalBorrowsNew; totalReserves = totalReservesNew; emit AccrueInterest(cashPrior, interestAccumulated, borrowIndexNew, totalBorrowsNew); return uint(Error.NO_ERROR); } function mintInternal(uint mintAmount) internal nonReentrant returns (uint, uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); } return mintFresh(msg.sender, mintAmount); } struct MintLocalVars { Error err; MathError mathErr; uint exchangeRateMantissa; uint mintTokens; uint totalSupplyNew; uint accountTokensNew; uint actualMintAmount; } function mintFresh(address minter, uint mintAmount) internal returns (uint, uint) { uint allowed = comptroller.mintAllowed(address(this), minter, mintAmount); if (allowed != 0) { return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0); } if (accrualBlockNumber != getBlockNumber()) { return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0); } MintLocalVars memory vars; (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); if (vars.mathErr != MathError.NO_ERROR) { return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0); } address payer = msg.sender; vars.actualMintAmount = doTransferIn(payer, mintAmount); (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate(vars.actualMintAmount, Exp({mantissa: vars.exchangeRateMantissa})); require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED"); vars.totalSupplyNew = totalSupply + vars.mintTokens; vars.accountTokensNew = accountTokens[minter] + vars.mintTokens; totalSupply = vars.totalSupplyNew; accountTokens[minter] = vars.accountTokensNew; emit Mint(payer, minter, vars.actualMintAmount, vars.mintTokens); emit Transfer(address(this), minter, vars.mintTokens); return (uint(Error.NO_ERROR), vars.actualMintAmount); } function redeemInternal(uint redeemTokens) internal nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } return redeemFresh(payable(msg.sender), redeemTokens, 0); } function redeemUnderlyingInternal(uint redeemAmount) internal nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED); } return redeemFresh(payable(msg.sender), 0, redeemAmount); } struct RedeemLocalVars { Error err; MathError mathErr; uint exchangeRateMantissa; uint redeemTokens; uint redeemAmount; uint totalSupplyNew; uint accountTokensNew; } function redeemFresh(address payable redeemer, uint redeemTokensIn, uint redeemAmountIn) internal returns (uint) { require(redeemTokensIn == 0 || redeemAmountIn == 0, "one of redeemTokensIn or redeemAmountIn must be zero"); RedeemLocalVars memory vars; (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal(); if (vars.mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)); } if (redeemTokensIn > 0) { vars.redeemTokens = redeemTokensIn; (vars.mathErr, vars.redeemAmount) = mulScalarTruncate(Exp({mantissa: vars.exchangeRateMantissa}), redeemTokensIn); if (vars.mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, uint(vars.mathErr)); } } else { (vars.mathErr, vars.redeemTokens) = divScalarByExpTruncate(redeemAmountIn, Exp({mantissa: vars.exchangeRateMantissa})); if (vars.mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, uint(vars.mathErr)); } vars.redeemAmount = redeemAmountIn; } uint allowed = comptroller.redeemAllowed(address(this), redeemer, vars.redeemTokens); if (allowed != 0) { return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REDEEM_COMPTROLLER_REJECTION, allowed); } if (accrualBlockNumber != getBlockNumber()) { return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDEEM_FRESHNESS_CHECK); } vars.totalSupplyNew = totalSupply - vars.redeemTokens; vars.accountTokensNew = accountTokens[redeemer] - vars.redeemTokens; if (getCashPrior() < vars.redeemAmount) { return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDEEM_TRANSFER_OUT_NOT_POSSIBLE); } totalSupply = vars.totalSupplyNew; accountTokens[redeemer] = vars.accountTokensNew; doTransferOut(redeemer, vars.redeemAmount); emit Transfer(redeemer, address(this), vars.redeemTokens); emit Redeem(redeemer, vars.redeemAmount, vars.redeemTokens); comptroller.redeemVerify(address(this), redeemer, vars.redeemAmount, vars.redeemTokens); return uint(Error.NO_ERROR); } function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED); } return borrowFresh(payable(msg.sender), borrowAmount); } struct BorrowLocalVars { MathError mathErr; uint accountBorrows; uint accountBorrowsNew; uint totalBorrowsNew; } function borrowFresh(address payable borrower, uint borrowAmount) internal returns (uint) { require(msg.sender == tx.origin, "contract call deny"); uint allowed = comptroller.borrowAllowed(address(this), borrower, borrowAmount); if (allowed != 0) { return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.BORROW_COMPTROLLER_REJECTION, allowed); } if (accrualBlockNumber != getBlockNumber()) { return fail(Error.MARKET_NOT_FRESH, FailureInfo.BORROW_FRESHNESS_CHECK); } if (getCashPrior() < borrowAmount) { return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.BORROW_CASH_NOT_AVAILABLE); } BorrowLocalVars memory vars; uint deltaFee; uint borrowAmountWithFee; (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); if (vars.mathErr != MathError.NO_ERROR) { return failOpaque(Error.MATH_ERROR, FailureInfo.BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)); } vars.accountBorrowsNew = vars.accountBorrows + borrowAmount; vars.totalBorrowsNew = totalBorrows + borrowAmount; accountBorrows[borrower].principal = vars.accountBorrowsNew; accountBorrows[borrower].interestIndex = borrowIndex; totalBorrows = vars.totalBorrowsNew; doTransferOut(borrower, borrowAmount); emit Borrow(borrower, borrowAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); return uint(Error.NO_ERROR); } function repayBorrowInternal(uint repayAmount) internal nonReentrant returns (uint, uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.REPAY_BORROW_ACCRUE_INTEREST_FAILED), 0); } return repayBorrowFresh(msg.sender, msg.sender, repayAmount); } function repayBorrowBehalfInternal(address borrower, uint repayAmount) internal nonReentrant returns (uint, uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0); } return repayBorrowFresh(msg.sender, borrower, repayAmount); } struct RepayBorrowLocalVars { Error err; MathError mathErr; uint repayAmount; uint borrowerIndex; uint accountBorrows; uint accountBorrowsNew; uint totalBorrowsNew; uint actualRepayAmount; } function repayBorrowFresh(address payer, address borrower, uint repayAmount) internal returns (uint, uint) { uint allowed = comptroller.repayBorrowAllowed(address(this), payer, borrower, repayAmount); if (allowed != 0) { return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REPAY_BORROW_COMPTROLLER_REJECTION, allowed), 0); } if (accrualBlockNumber != getBlockNumber()) { return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0); } RepayBorrowLocalVars memory vars; vars.borrowerIndex = accountBorrows[borrower].interestIndex; (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower); if (vars.mathErr != MathError.NO_ERROR) { return (failOpaque(Error.MATH_ERROR, FailureInfo.REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)), 0); } if (repayAmount == type(uint).max) { vars.repayAmount = vars.accountBorrows; } else { vars.repayAmount = repayAmount; } vars.actualRepayAmount = doTransferIn(payer, vars.repayAmount); vars.accountBorrowsNew = vars.accountBorrows - vars.actualRepayAmount; vars.totalBorrowsNew = totalBorrows - vars.actualRepayAmount; accountBorrows[borrower].principal = vars.accountBorrowsNew; accountBorrows[borrower].interestIndex = borrowIndex; totalBorrows = vars.totalBorrowsNew; emit RepayBorrow(payer, borrower, vars.actualRepayAmount, vars.accountBorrowsNew, vars.totalBorrowsNew); return (uint(Error.NO_ERROR), vars.actualRepayAmount); } function liquidateBorrowInternal(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal nonReentrant returns (uint, uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED), 0); } error = cTokenCollateral.accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED), 0); } return liquidateBorrowFresh(msg.sender, borrower, repayAmount, cTokenCollateral); } function liquidateBorrowFresh(address liquidator, address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal returns (uint, uint) { uint allowed = comptroller.liquidateBorrowAllowed(address(this), address(cTokenCollateral), liquidator, borrower, repayAmount); if (allowed != 0) { return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_COMPTROLLER_REJECTION, allowed), 0); } if (accrualBlockNumber != getBlockNumber()) { return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_FRESHNESS_CHECK), 0); } if (cTokenCollateral.accrualBlockNumber() != getBlockNumber()) { return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_COLLATERAL_FRESHNESS_CHECK), 0); } if (borrower == liquidator) { return (fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_LIQUIDATOR_IS_BORROWER), 0); } if (repayAmount == 0) { return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_ZERO), 0); } if (repayAmount == type(uint).max) { return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0); } (uint repayBorrowError, uint actualRepayAmount) = repayBorrowFresh(liquidator, borrower, repayAmount); if (repayBorrowError != uint(Error.NO_ERROR)) { return (fail(Error(repayBorrowError), FailureInfo.LIQUIDATE_REPAY_BORROW_FRESH_FAILED), 0); } (uint amountSeizeError, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens(address(this), address(cTokenCollateral), actualRepayAmount); require(amountSeizeError == uint(Error.NO_ERROR), "CALCULATE_AMOUNT_SEIZE_FAILED"); require(cTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH"); uint seizeError; if (address(cTokenCollateral) == address(this)) { seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens); } else { seizeError = cTokenCollateral.seize(liquidator, borrower, seizeTokens); } require(seizeError == uint(Error.NO_ERROR), "token seizure failed"); emit LiquidateBorrow(liquidator, borrower, actualRepayAmount, address(cTokenCollateral), seizeTokens); return (uint(Error.NO_ERROR), actualRepayAmount); } function seize(address liquidator, address borrower, uint seizeTokens) external override nonReentrant returns (uint) { return seizeInternal(msg.sender, liquidator, borrower, seizeTokens); } function seizeInternal(address seizerToken, address liquidator, address borrower, uint seizeTokens) internal returns (uint) { uint allowed = comptroller.seizeAllowed(address(this), seizerToken, liquidator, borrower, seizeTokens); if (allowed != 0) { return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, allowed); } if (borrower == liquidator) { return fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER); } uint borrowerTokensNew = accountTokens[borrower] - seizeTokens; uint liquidatorTokensNew = accountTokens[liquidator] + seizeTokens; accountTokens[borrower] = borrowerTokensNew; accountTokens[liquidator] = liquidatorTokensNew; emit Transfer(borrower, liquidator, seizeTokens); return uint(Error.NO_ERROR); } function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) { if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK); } address oldPendingAdmin = pendingAdmin; pendingAdmin = newPendingAdmin; emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin); return uint(Error.NO_ERROR); } function _acceptAdmin() external override returns (uint) { if (msg.sender != pendingAdmin || msg.sender == address(0)) { return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK); } address oldAdmin = admin; address oldPendingAdmin = pendingAdmin; admin = pendingAdmin; pendingAdmin = payable(address(0)); emit NewAdmin(oldAdmin, admin); emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); return uint(Error.NO_ERROR); } function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) { if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK); } ComptrollerInterface oldComptroller = comptroller; require(newComptroller.isComptroller(), "marker method returned false"); comptroller = newComptroller; emit NewComptroller(oldComptroller, newComptroller); return uint(Error.NO_ERROR); } function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED); } return _setReserveFactorFresh(newReserveFactorMantissa); } function _setReserveFactorFresh(uint newReserveFactorMantissa) internal returns (uint) { if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_RESERVE_FACTOR_ADMIN_CHECK); } if (accrualBlockNumber != getBlockNumber()) { return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_RESERVE_FACTOR_FRESH_CHECK); } if (newReserveFactorMantissa > reserveFactorMaxMantissa) { return fail(Error.BAD_INPUT, FailureInfo.SET_RESERVE_FACTOR_BOUNDS_CHECK); } uint oldReserveFactorMantissa = reserveFactorMantissa; reserveFactorMantissa = newReserveFactorMantissa; emit NewReserveFactor(oldReserveFactorMantissa, newReserveFactorMantissa); return uint(Error.NO_ERROR); } function _addReservesInternal(uint addAmount) internal nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.ADD_RESERVES_ACCRUE_INTEREST_FAILED); } (error, ) = _addReservesFresh(addAmount); return error; } function _addReservesFresh(uint addAmount) internal returns (uint, uint) { uint totalReservesNew; uint actualAddAmount; if (accrualBlockNumber != getBlockNumber()) { return (fail(Error.MARKET_NOT_FRESH, FailureInfo.ADD_RESERVES_FRESH_CHECK), actualAddAmount); } actualAddAmount = doTransferIn(msg.sender, addAmount); totalReservesNew = totalReserves + actualAddAmount; require(totalReservesNew >= totalReserves, "add reserves overflow"); totalReserves = totalReservesNew; emit ReservesAdded(msg.sender, actualAddAmount, totalReservesNew); return (uint(Error.NO_ERROR), actualAddAmount); } function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.REDUCE_RESERVES_ACCRUE_INTEREST_FAILED); } return _reduceReservesFresh(reduceAmount); } function _reduceReservesFresh(uint reduceAmount) internal returns (uint) { uint totalReservesNew; if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.REDUCE_RESERVES_ADMIN_CHECK); } if (accrualBlockNumber != getBlockNumber()) { return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDUCE_RESERVES_FRESH_CHECK); } if (getCashPrior() < reduceAmount) { return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDUCE_RESERVES_CASH_NOT_AVAILABLE); } if (reduceAmount > totalReserves) { return fail(Error.BAD_INPUT, FailureInfo.REDUCE_RESERVES_VALIDATION); } totalReservesNew = totalReserves - reduceAmount; require(totalReservesNew <= totalReserves, "reduce reserves underflow"); totalReserves = totalReservesNew; doTransferOut(payable(admin), reduceAmount); emit ReservesReduced(admin, reduceAmount, totalReservesNew); return uint(Error.NO_ERROR); } function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return fail(Error(error), FailureInfo.SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED); } return _setInterestRateModelFresh(newInterestRateModel); } function _setInterestRateModelFresh(InterestRateModel newInterestRateModel) internal returns (uint) { InterestRateModel oldInterestRateModel; if (msg.sender != admin) { return fail(Error.UNAUTHORIZED, FailureInfo.SET_INTEREST_RATE_MODEL_OWNER_CHECK); } if (accrualBlockNumber != getBlockNumber()) { return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_INTEREST_RATE_MODEL_FRESH_CHECK); } oldInterestRateModel = interestRateModel; require(newInterestRateModel.isInterestRateModel(), "marker method returned false"); interestRateModel = newInterestRateModel; emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel); return uint(Error.NO_ERROR); } function getCashPrior() internal virtual view returns (uint); function doTransferIn(address from, uint amount) internal virtual returns (uint); function doTransferOut(address payable to, uint amount) internal virtual; modifier nonReentrant() { require(_notEntered, "re-entered"); _notEntered = false; _; _notEntered = true; } function mintBehalfInternal(address receiver, uint mintAmount) internal virtual nonReentrant returns (uint, uint) { uint error = accrueInterest(); if (error != uint(Error.NO_ERROR)) { return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0); } return mintFresh(receiver, mintAmount); } } pragma solidity >=0.8.0; contract CErc20 is CToken, CErc20Interface { function initialize(address underlying_, ComptrollerInterface comptroller_, InterestRateModel interestRateModel_, uint initialExchangeRateMantissa_, string memory name_, string memory symbol_, uint8 decimals_) public { super.initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); underlying = underlying_; EIP20Interface(underlying).totalSupply(); } function mint(uint mintAmount) external override returns (uint) { (uint err,) = mintInternal(mintAmount); return err; } function redeem(uint redeemTokens) external override returns (uint) { return redeemInternal(redeemTokens); } function redeemUnderlying(uint redeemAmount) external override returns (uint) { return redeemUnderlyingInternal(redeemAmount); } function borrow(uint borrowAmount) external override returns (uint) { return borrowInternal(borrowAmount); } function repayBorrow(uint repayAmount) external override returns (uint) { (uint err,) = repayBorrowInternal(repayAmount); return err; } function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) { (uint err,) = repayBorrowBehalfInternal(borrower, repayAmount); return err; } function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external override returns (uint) { (uint err,) = liquidateBorrowInternal(borrower, repayAmount, cTokenCollateral); return err; } function sweepToken(EIP20NonStandardInterface token) external override { require(address(token) != underlying, "CErc20::sweepToken: can not sweep underlying token"); uint256 balance = token.balanceOf(address(this)); token.transfer(admin, balance); } function _addReserves(uint addAmount) external override returns (uint) { return _addReservesInternal(addAmount); } function getCashPrior() internal override virtual view returns (uint) { EIP20Interface token = EIP20Interface(underlying); return token.balanceOf(address(this)); } function doTransferIn(address from, uint amount) internal override virtual returns (uint) { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this)); token.transferFrom(from, address(this), amount); bool success; assembly { switch returndatasize() case 0 { success := not(0) } case 32 { returndatacopy(0, 0, 32) success := mload(0) } default { revert(0, 0) } } require(success, "TOKEN_TRANSFER_IN_FAILED"); uint balanceAfter = EIP20Interface(underlying).balanceOf(address(this)); require(balanceAfter >= balanceBefore, "TOKEN_TRANSFER_IN_OVERFLOW"); return balanceAfter - balanceBefore; } function doTransferOut(address payable to, uint amount) internal override virtual { EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying); token.transfer(to, amount); bool success; assembly { switch returndatasize() case 0 { success := not(0) } case 32 { returndatacopy(0, 0, 32) success := mload(0) } default { revert(0, 0) } } require(success, "TOKEN_TRANSFER_OUT_FAILED"); } function mintBehalf(address receiver, uint mintAmount) external override returns (uint) { require(mintAmount != 0, "mintAmount error"); (uint err,) = mintBehalfInternal(receiver, mintAmount); requireNoError(err, "mintBehalf failed"); return err; } function requireNoError(uint errCode, string memory message) internal pure { if (errCode == uint(Error.NO_ERROR)) { return; } bytes memory fullMessage = new bytes(bytes(message).length + 5); uint i; for (i = 0; i < bytes(message).length; i++) { fullMessage[i] = bytes(message)[i]; } fullMessage[i+0] = bytes1(uint8(32)); fullMessage[i+1] = bytes1(uint8(40)); fullMessage[i+2] = bytes1(uint8(48 + ( errCode / 10 ))); fullMessage[i+3] = bytes1(uint8(48 + ( errCode % 10 ))); fullMessage[i+4] = bytes1(uint8(41)); require(errCode == uint(Error.NO_ERROR), string(fullMessage)); } } pragma solidity >=0.8.0; contract CErc20Immutable is CErc20 { constructor(address underlying_, ComptrollerInterface comptroller_, InterestRateModel interestRateModel_, uint initialExchangeRateMantissa_, string memory name_, string memory symbol_, uint8 decimals_, address payable admin_) public { admin = payable(msg.sender); initialize(underlying_, comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_); admin = admin_; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address payable","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cashPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interestAccumulated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"AccrueInterest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"error","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"info","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"Failure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"cTokenCollateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"LiquidateBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"insufficientLeverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldBorrowPrincipal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBorrowPrincipal","type":"uint256"}],"name":"LiquidateLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ComptrollerInterface","name":"oldComptroller","type":"address"},{"indexed":false,"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"NewComptroller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract InterestRateModel","name":"oldInterestRateModel","type":"address"},{"indexed":false,"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"NewMarketInterestRateModel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldVeeProxy","type":"address"},{"indexed":false,"internalType":"address","name":"newVeeProxy","type":"address"}],"name":"NewOrderProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldReserveFactorMantissa","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"NewReserveFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"RepayBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expectLeverageAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainLeverageAmount","type":"uint256"}],"name":"RepayLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"benefactor","type":"address"},{"indexed":false,"internalType":"uint256","name":"addAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"reduceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_acceptAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"addAmount","type":"uint256"}],"name":"_addReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reduceAmount","type":"uint256"}],"name":"_reduceReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"_setComptroller","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"_setInterestRateModel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"_setReserveFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accrualBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrueInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"contract ComptrollerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeRateStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestRateModel","outputs":[{"internalType":"contract InterestRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"contract CTokenInterface","name":"cTokenCollateral","type":"address"}],"name":"liquidateBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mintBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveFactorMantissa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"seize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract EIP20NonStandardInterface","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrowsCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c806373acee981161019d578063bd6d894d116100e9578063f2b3abbd116100a2578063f851a4401161007c578063f851a4401461068a578063f8f9da28146106a2578063fca7820b146106aa578063fe9c44ae146106bd57600080fd5b8063f2b3abbd14610651578063f3fdb15a14610664578063f5e3c4621461067757600080fd5b8063bd6d894d146105af578063c37f68e2146105b7578063c5ebeaec146105ea578063db006a75146105fd578063dd62ed3e14610610578063e9c714f21461064957600080fd5b8063a0712d6811610156578063aa5af0fd11610130578063aa5af0fd14610578578063ae9d70b014610581578063b2a02ff114610589578063b71d1a0c1461059c57600080fd5b8063a0712d681461054a578063a6afed951461055d578063a9059cbb1461056557600080fd5b806373acee98146104f8578063852a12e3146105005780638f840ddd1461051357806395d89b411461051c57806395dd91931461052457806399d8c1b41461053757600080fd5b8063267822471161025c57806347bd371811610215578063601a0bf1116101ef578063601a0bf1146104a05780636c540baf146104b35780636f307dc3146104bc57806370a08231146104cf57600080fd5b806347bd3718146104715780634ead96be1461047a5780635fe3b5671461048d57600080fd5b806326782247146103e6578063313ce567146104115780633af9e669146104305780633b1d21a2146104435780633e9410101461044b5780634576b5db1461045e57600080fd5b8063182df0f5116102ae578063182df0f51461037d5780631a31d465146103855780631be195601461039a57806323323e03146103ad57806323b872dd146103c05780632608f818146103d357600080fd5b806306fdde03146102f6578063095ea7b3146103145780630e75270214610337578063173b99041461035857806317bfdfbc1461036157806318160ddd14610374575b600080fd5b6102fe6106c5565b60405161030b919061489d565b60405180910390f35b6103276103223660046146f1565b610753565b604051901515815260200161030b565b61034a610345366004614823565b6107c3565b60405190815260200161030b565b61034a60085481565b61034a61036f3660046145a4565b6107d7565b61034a600d5481565b61034a610850565b61039861039336600461463b565b6108cd565b005b6103986103a83660046145a4565b610971565b61034a6103bb3660046146f1565b610ad5565b6103276103ce3660046145fa565b610b60565b61034a6103e13660046146f1565b610bb0565b6004546103f9906001600160a01b031681565b6040516001600160a01b03909116815260200161030b565b60035461041e9060ff1681565b60405160ff909116815260200161030b565b61034a61043e3660046145a4565b610bc6565b61034a610c76565b61034a610459366004614823565b610c85565b61034a61046c3660046145a4565b610c90565b61034a600b5481565b600e546103f9906001600160a01b031681565b6005546103f9906001600160a01b031681565b61034a6104ae366004614823565b610de4565b61034a60095481565b6012546103f9906001600160a01b031681565b61034a6104dd3660046145a4565b6001600160a01b03166000908152600f602052604090205490565b61034a610e63565b61034a61050e366004614823565b610ec9565b61034a600c5481565b6102fe610ed4565b61034a6105323660046145a4565b610ee1565b610398610545366004614781565b610f60565b61034a610558366004614823565b6111bb565b61034a6111c7565b6103276105733660046146f1565b61153c565b61034a600a5481565b61034a61158b565b61034a6105973660046145fa565b611632565b61034a6105aa3660046145a4565b611681565b61034a611701565b6105ca6105c53660046145a4565b61176d565b60408051948552602085019390935291830152606082015260800161030b565b61034a6105f8366004614823565b61180e565b61034a61060b366004614823565b611819565b61034a61061e3660046145c1565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b61034a611824565b61034a61065f3660046145a4565b61191c565b6006546103f9906001600160a01b031681565b61034a61068536600461471d565b611954565b6003546103f99061010090046001600160a01b031681565b61034a61196c565b61034a6106b8366004614823565b6119bf565b610327600181565b600180546106d2906149a8565b80601f01602080910402602001604051908101604052809291908181526020018280546106fe906149a8565b801561074b5780601f106107205761010080835404028352916020019161074b565b820191906000526020600020905b81548152906001019060200180831161072e57829003601f168201915b505050505081565b3360008181526010602090815260408083206001600160a01b03871680855292528083208590555191929182907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107af9087815260200190565b60405180910390a360019150505b92915050565b6000806107cf83611a21565b509392505050565b6000805460ff166108035760405162461bcd60e51b81526004016107fa90614922565b60405180910390fd5b6000805460ff191681556108156111c7565b146108325760405162461bcd60e51b81526004016107fa906148f2565b61083b82610ee1565b90505b6000805460ff19166001179055919050565b600080600061085d611aad565b9092509050600082600381111561087657610876614a3e565b146107bd5760405162461bcd60e51b815260206004820152602160248201527f65786368616e67655261746553746f726564496e7465726e616c206661696c656044820152601960fa1b60648201526084016107fa565b6108db868686868686610f60565b601280546001600160a01b0319166001600160a01b038916908117909155604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610967919061483c565b5050505050505050565b6012546001600160a01b03828116911614156109ea5760405162461bcd60e51b815260206004820152603260248201527f4345726332303a3a7377656570546f6b656e3a2063616e206e6f74207377656560448201527138103ab73232b9363cb4b733903a37b5b2b760711b60648201526084016107fa565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610a2c57600080fd5b505afa158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a64919061483c565b60035460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925083169063a9059cbb90604401600060405180830381600087803b158015610ab957600080fd5b505af1158015610acd573d6000803e3d6000fd5b505050505050565b600081610b175760405162461bcd60e51b815260206004820152601060248201526f36b4b73a20b6b7bab73a1032b93937b960811b60448201526064016107fa565b6000610b238484611b4c565b509050610b5981604051806040016040528060118152602001701b5a5b9d10995a185b198819985a5b1959607a1b815250611bd9565b9392505050565b6000805460ff16610b835760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610b9933868686611e02565b1490506000805460ff191660011790559392505050565b600080610bbd848461202b565b50949350505050565b6000806040518060200160405280610bdc611701565b90526001600160a01b0384166000908152600f6020526040812054919250908190610c08908490612091565b90925090506000826003811115610c2157610c21614a3e565b14610c6e5760405162461bcd60e51b815260206004820152601f60248201527f62616c616e636520636f756c64206e6f742062652063616c63756c617465640060448201526064016107fa565b949350505050565b6000610c806120e4565b905090565b60006107bd82612168565b60035460009061010090046001600160a01b03163314610cb6576107bd6001603f6121e0565b60055460408051623f1ee960e11b815290516001600160a01b0392831692851691627e3dd2916004808301926020929190829003018186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d33919061475f565b610d7f5760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c73650000000060448201526064016107fa565b600580546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527f7ac369dbd14fa5ea3f473ed67cc9d598964a77501540ba6751eb0b3decf5870d91015b60405180910390a160009392505050565b6000805460ff16610e075760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610e196111c7565b90508015610e4557610e3d816010811115610e3657610e36614a3e565b60306121e0565b91505061083e565b610e4e83612259565b9150506000805460ff19166001179055919050565b6000805460ff16610e865760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155610e986111c7565b14610eb55760405162461bcd60e51b81526004016107fa906148f2565b50600b546000805460ff1916600117905590565b60006107bd82612397565b600280546106d2906149a8565b6000806000610eef846123fc565b90925090506000826003811115610f0857610f08614a3e565b14610b595760405162461bcd60e51b815260206004820152602260248201527f626f72726f7742616c616e636553746f726564496e7465726e616c206661696c604482015261195960f21b60648201526084016107fa565b60035461010090046001600160a01b03163314610fcb5760405162461bcd60e51b8152602060048201526024808201527f6f6e6c792061646d696e206d617920696e697469616c697a6520746865206d616044820152631c9ad95d60e21b60648201526084016107fa565b600954158015610fdb5750600a54155b6110335760405162461bcd60e51b815260206004820152602360248201527f6d61726b6574206d6179206f6e6c7920626520696e697469616c697a6564206f6044820152626e636560e81b60648201526084016107fa565b60078490558361109e5760405162461bcd60e51b815260206004820152603060248201527f696e697469616c2065786368616e67652072617465206d75737420626520677260448201526f32b0ba32b9103a3430b7103d32b9379760811b60648201526084016107fa565b60006110a987610c90565b905080156110f95760405162461bcd60e51b815260206004820152601a60248201527f73657474696e6720636f6d7074726f6c6c6572206661696c656400000000000060448201526064016107fa565b43600955670de0b6b3a7640000600a55611112866124b5565b9050801561116d5760405162461bcd60e51b815260206004820152602260248201527f73657474696e6720696e7465726573742072617465206d6f64656c206661696c604482015261195960f21b60648201526084016107fa565b8351611180906001906020870190614468565b508251611194906002906020860190614468565b50506003805460ff90921660ff199283161790556000805490911660011790555050505050565b6000806107cf8361261f565b6009546000904390808214156111e15760005b9250505090565b60006111eb6120e4565b600b54600c54600a546006546040516315f2405360e01b81526004810186905260248101859052604481018490529495509293919290916000916001600160a01b0316906315f240539060640160206040518083038186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611288919061483c565b905065048c273950008111156112e05760405162461bcd60e51b815260206004820152601c60248201527f626f72726f772072617465206973206162737572646c7920686967680000000060448201526064016107fa565b6000806112ed898961267d565b9092509050600082600381111561130657611306614a3e565b146113475760405162461bcd60e51b8152602060048201526011602482015270313637b1b5903232b63a309032b93937b960791b60448201526064016107fa565b60408051602081019091526000815260008060008061137460405180602001604052808a815250876126a8565b9097509450600087600381111561138d5761138d614a3e565b146113c3576113b0600960068960038111156113ab576113ab614a3e565b612724565b9e50505050505050505050505050505090565b6113cd858c612091565b909750935060008760038111156113e6576113e6614a3e565b14611404576113b0600960018960038111156113ab576113ab614a3e565b61140e848c61279c565b9097509250600087600381111561142757611427614a3e565b14611445576113b0600960048960038111156113ab576113ab614a3e565b6114606040518060200160405280600854815250858c6127cc565b9097509150600087600381111561147957611479614a3e565b14611497576113b0600960058960038111156113ab576113ab614a3e565b6114a2858a8b6127cc565b909750905060008760038111156114bb576114bb614a3e565b146114d9576113b0600960038960038111156113ab576113ab614a3e565b60098e9055600a819055600b839055600c829055604080518d815260208101869052908101829052606081018490527f4dec04e750ca11537cabcd8a9eab06494de08da3735bc8871cd41250e190bc049060800160405180910390a160006113b0565b6000805460ff1661155f5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916815561157533338686611e02565b1490506000805460ff1916600117905592915050565b6006546000906001600160a01b031663b81688166115a76120e4565b600b54600c546008546040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015b60206040518083038186803b1580156115fa57600080fd5b505afa15801561160e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061483c565b6000805460ff166116555760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916905561166b33858585612827565b90506000805460ff191660011790559392505050565b60035460009061010090046001600160a01b031633146116a7576107bd600160456121e0565b600480546001600160a01b038481166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610dd3565b6000805460ff166117245760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556117366111c7565b146117535760405162461bcd60e51b81526004016107fa906148f2565b61175b610850565b90506000805460ff1916600117905590565b6001600160a01b0381166000908152600f6020526040812054819081908190818080611798896123fc565b9350905060008160038111156117b0576117b0614a3e565b146117ce5760095b6000806000975097509750975050505050611807565b6117d6611aad565b9250905060008160038111156117ee576117ee614a3e565b146117fa5760096117b8565b5060009650919450925090505b9193509193565b60006107bd826129b2565b60006107bd82612a15565b6004546000906001600160a01b03163314158061183f575033155b1561185057610c80600160006121e0565b60038054600480546001600160a01b03808216610100818102610100600160a81b0319871617968790556001600160a01b031990931690935560408051948390048216808652929095041660208401529290917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600454604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9910160405180910390a160006111da565b6000806119276111c7565b9050801561194b57610b5981601081111561194457611944614a3e565b60406121e0565b610b59836124b5565b600080611962858585612a73565b5095945050505050565b6006546000906001600160a01b03166315f240536119886120e4565b600b54600c546040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064016115e2565b6000805460ff166119e25760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556119f46111c7565b90508015611a1857610e3d816010811115611a1157611a11614a3e565b60466121e0565b610e4e83612b9a565b60008054819060ff16611a465760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155611a586111c7565b90508015611a8857611a7c816010811115611a7557611a75614a3e565b60366121e0565b60009250925050611a99565b611a93333386612c2f565b92509250505b6000805460ff191660011790559092909150565b600d54600090819080611ac7575050600754600092909150565b6000611ad16120e4565b9050611ae96040518060200160405280600081525090565b600080600c54600b5485611afd9190614946565b611b079190614991565b9050611b138186612ef0565b935091506000826003811115611b2b57611b2b614a3e565b14611b3d575095600095509350505050565b50505160009590945092505050565b60008054819060ff16611b715760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155611b836111c7565b90508015611bb357611ba7816010811115611ba057611ba0614a3e565b601e6121e0565b60009250925050611bc3565b611bbd8585612fbb565b92509250505b6000805460ff1916600117905590939092509050565b81611be2575050565b600081516005611bf29190614946565b67ffffffffffffffff811115611c0a57611c0a614a6a565b6040519080825280601f01601f191660200182016040528015611c34576020820181803683370190505b50905060005b8251811015611c9b57828181518110611c5557611c55614a54565b602001015160f81c60f81b828281518110611c7257611c72614a54565b60200101906001600160f81b031916908160001a90535080611c93816149e3565b915050611c3a565b600160fd1b82611cac836000614946565b81518110611cbc57611cbc614a54565b60200101906001600160f81b031916908160001a905350600560fb1b82611ce4836001614946565b81518110611cf457611cf4614a54565b60200101906001600160f81b031916908160001a905350611d16600a8561495e565b611d21906030614946565b60f81b82611d30836002614946565b81518110611d4057611d40614a54565b60200101906001600160f81b031916908160001a905350611d62600a856149fe565b611d6d906030614946565b60f81b82611d7c836003614946565b81518110611d8c57611d8c614a54565b60200101906001600160f81b031916908160001a905350602960f81b82611db4836004614946565b81518110611dc457611dc4614a54565b60200101906001600160f81b031916908160001a905350818415611dfb5760405162461bcd60e51b81526004016107fa919061489d565b5050505050565b6005546040516317b9b84b60e31b81523060048201526001600160a01b038581166024830152848116604483015260648201849052600092839291169063bdcdc25890608401602060405180830381600087803b158015611e6257600080fd5b505af1158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a919061483c565b90508015611eb757611eaf6003604a83612724565b915050610c6e565b836001600160a01b0316856001600160a01b03161415611edd57611eaf6002604b6121e0565b6000856001600160a01b0316876001600160a01b03161415611f025750600019611f2a565b506001600160a01b038086166000908152601060209081526040808320938a16835292905220545b6000611f368583614991565b6001600160a01b0388166000908152600f602052604081205491925090611f5e908790614991565b6001600160a01b0388166000908152600f602052604081205491925090611f86908890614946565b6001600160a01b03808b166000908152600f6020526040808220869055918b1681522081905590506000198414611fe0576001600160a01b03808a166000908152601060209081526040808320938e168352929052208390555b876001600160a01b0316896001600160a01b0316600080516020614a998339815191528960405161201391815260200190565b60405180910390a35060009998505050505050505050565b60008054819060ff166120505760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556120626111c7565b9050801561208657611ba781601081111561207f5761207f614a3e565b60356121e0565b611bbd338686612c2f565b6000806000806120a186866126a8565b909250905060008260038111156120ba576120ba614a3e565b146120cb57509150600090506120dd565b60006120d682613312565b9350935050505b9250929050565b6012546040516370a0823160e01b81523060048201526000916001600160a01b03169081906370a082319060240160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612162919061483c565b91505090565b6000805460ff1661218b5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff1916815561219d6111c7565b905080156121c157610e3d8160108111156121ba576121ba614a3e565b604e6121e0565b6121ca8361332a565b509150506000805460ff19166001179055919050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa083601081111561221557612215614a3e565b83605281111561222757612227614a3e565b60408051928352602083019190915260009082015260600160405180910390a1826010811115610b5957610b59614a3e565b600354600090819061010090046001600160a01b0316331461228157610b59600160316121e0565b436009541461229657610b59600a60336121e0565b8261229f6120e4565b10156122b157610b59600e60326121e0565b600c548311156122c757610b59600260346121e0565b82600c546122d59190614991565b9050600c548111156123295760405162461bcd60e51b815260206004820152601960248201527f72656475636520726573657276657320756e646572666c6f770000000000000060448201526064016107fa565b600c8190556003546123499061010090046001600160a01b031684613401565b600354604080516101009092046001600160a01b031682526020820185905281018290527f3bad0c59cf2f06e7314077049f48a93578cd16f5ef92329f1dab1420a99c177e90606001610dd3565b6000805460ff166123ba5760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556123cc6111c7565b905080156123f057610e3d8160108111156123e9576123e9614a3e565b60276121e0565b610e4e336000856134eb565b6001600160a01b0381166000908152601160205260408120805482918291829182916124315750600096879650945050505050565b6124418160000154600a546139c1565b9094509250600084600381111561245a5761245a614a3e565b1461246d57509195600095509350505050565b61247b838260010154613a0b565b9094509150600084600381111561249457612494614a3e565b146124a757509195600095509350505050565b506000969095509350505050565b600354600090819061010090046001600160a01b031633146124dd57610b59600160426121e0565b43600954146124f257610b59600a60416121e0565b600660009054906101000a90046001600160a01b03169050826001600160a01b0316632191f92a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561254357600080fd5b505afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b919061475f565b6125c75760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c73650000000060448201526064016107fa565b600680546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527fedffc32e068c7c95dfd4bdfd5c4d939a084d6b11c4199eac8436ed234d72f9269101610dd3565b60008054819060ff166126445760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556126566111c7565b9050801561267357611a7c816010811115611ba057611ba0614a3e565b611a933385612fbb565b60008083831161269c5760006126938486614991565b915091506120dd565b506003905060006120dd565b60006126c06040518060200160405280600081525090565b6000806126d18660000151866139c1565b909250905060008260038111156126ea576126ea614a3e565b14612709575060408051602081019091526000815290925090506120dd565b60408051602081019091529081526000969095509350505050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa084601081111561275957612759614a3e565b84605281111561276b5761276b614a3e565b604080519283526020830191909152810184905260600160405180910390a1836010811115610c6e57610c6e614a3e565b600080806127aa8486614946565b90508481106127be576000925090506120dd565b6002600092509250506120dd565b6000806000806127dc87876126a8565b909250905060008260038111156127f5576127f5614a3e565b14612806575091506000905061281f565b61281861281282613312565b8661279c565b9350935050505b935093915050565b60055460405163d02f735160e01b81523060048201526001600160a01b0386811660248301528581166044830152848116606483015260848201849052600092839291169063d02f73519060a401602060405180830381600087803b15801561288f57600080fd5b505af11580156128a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c7919061483c565b905080156128dc57611eaf6003601b83612724565b846001600160a01b0316846001600160a01b0316141561290257611eaf6006601c6121e0565b6001600160a01b0384166000908152600f6020526040812054612926908590614991565b6001600160a01b0387166000908152600f60205260408120549192509061294e908690614946565b6001600160a01b038088166000818152600f6020526040808220879055928b168082529083902084905591519293509091600080516020614a998339815191529061299c9089815260200190565b60405180910390a3600098975050505050505050565b6000805460ff166129d55760405162461bcd60e51b81526004016107fa90614922565b6000805460ff191681556129e76111c7565b90508015612a0b57610e3d816010811115612a0457612a04614a3e565b60086121e0565b610e4e3384613a36565b6000805460ff16612a385760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155612a4a6111c7565b90508015612a6757610e3d8160108111156123e9576123e9614a3e565b610e4e338460006134eb565b60008054819060ff16612a985760405162461bcd60e51b81526004016107fa90614922565b6000805460ff19168155612aaa6111c7565b90508015612ada57612ace816010811115612ac757612ac7614a3e565b600f6121e0565b60009250925050612b83565b836001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612b1557600080fd5b505af1158015612b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4d919061483c565b90508015612b7157612ace816010811115612b6a57612b6a614a3e565b60106121e0565b612b7d33878787613cc1565b92509250505b6000805460ff191660011790559094909350915050565b60035460009061010090046001600160a01b03163314612bc0576107bd600160476121e0565b4360095414612bd5576107bd600a60486121e0565b670de0b6b3a7640000821115612bf1576107bd600260496121e0565b600880549083905560408051828152602081018590527faaa68312e2ea9d50e16af5068410ab56e1a1fd06037b1a35664812c30f8214609101610dd3565b600554604051631200453160e11b81523060048201526001600160a01b03858116602483015284811660448301526064820184905260009283928392909116906324008a6290608401602060405180830381600087803b158015612c9257600080fd5b505af1158015612ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cca919061483c565b90508015612ceb57612cdf6003603883612724565b6000925092505061281f565b4360095414612d0057612cdf600a60396121e0565b612d496040805161010081019091528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b0386166000908152601160205260409020600101546060820152612d73866123fc565b6080830181905260208301826003811115612d9057612d90614a3e565b6003811115612da157612da1614a3e565b9052506000905081602001516003811115612dbe57612dbe614a3e565b14612ded57612de060096037836020015160038111156113ab576113ab614a3e565b600093509350505061281f565b600019851415612e065760808101516040820152612e0e565b604081018590525b612e1c8782604001516141b1565b60e082018190526080820151612e329190614991565b60a082015260e0810151600b54612e499190614991565b60c0820190815260a080830180516001600160a01b038a8116600081815260116020908152604091829020948555600a546001909501949094559551600b81905560e088015194518751938f1684529383019190915294810192909252606082015260808101929092527f1a2a22cb034d26d1854bdc6666a5b91fe25efbbb5dcad3b0355478d6f5c362a1910160405180910390a160e00151600097909650945050505050565b6000612f086040518060200160405280600081525090565b600080612f1d86670de0b6b3a76400006139c1565b90925090506000826003811115612f3657612f36614a3e565b14612f55575060408051602081019091526000815290925090506120dd565b600080612f628388613a0b565b90925090506000826003811115612f7b57612f7b614a3e565b14612f9e57816040518060200160405280600081525095509550505050506120dd565b604080516020810190915290815260009890975095505050505050565b600554604051634ef4c3e160e01b8152600091829182916001600160a01b031690634ef4c3e190612ff490309089908990600401614879565b602060405180830381600087803b15801561300e57600080fd5b505af1158015613022573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613046919061483c565b905080156130675761305b6003601f83612724565b600092509250506120dd565b436009541461307c5761305b600a60226121e0565b6130bd6040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6130c5611aad565b60408301819052602083018260038111156130e2576130e2614a3e565b60038111156130f3576130f3614a3e565b905250600090508160200151600381111561311057613110614a3e565b1461313f5761313260096021836020015160038111156113ab576113ab614a3e565b60009350935050506120dd565b3361314a81876141b1565b60c083018190526040805160208101825290840151815261316b91906143ea565b606084018190526020840182600381111561318857613188614a3e565b600381111561319957613199614a3e565b90525060009050826020015160038111156131b6576131b6614a3e565b146132035760405162461bcd60e51b815260206004820181905260248201527f4d494e545f45584348414e47455f43414c43554c4154494f4e5f4641494c454460448201526064016107fa565b8160600151600d546132159190614946565b608083015260608201516001600160a01b0388166000908152600f60205260409020546132429190614946565b60a08301819052608080840151600d556001600160a01b038981166000818152600f60209081526040918290209590955560c08701516060808901518351958916865296850193909352908301528101929092527f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a1866001600160a01b0316306001600160a01b0316600080516020614a9983398151915284606001516040516132f891815260200190565b60405180910390a35060c001516000969095509350505050565b80516000906107bd90670de0b6b3a76400009061495e565b6000808080436009541461334e57613344600a604f6121e0565b9590945092505050565b61335833866141b1565b905080600c546133689190614946565b9150600c548210156133b45760405162461bcd60e51b8152602060048201526015602482015274616464207265736572766573206f766572666c6f7760581b60448201526064016107fa565b600c82905560408051338152602081018390529081018390527fa91e67c5ea634cd43a12c5a482724b03de01e85ca68702a53d0c2f45cb7c1dc59060600160405180910390a16000613344565b60125460405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905290911690819063a9059cbb90604401600060405180830381600087803b15801561345157600080fd5b505af1158015613465573d6000803e3d6000fd5b5050505060003d60008114613481576020811461348b57600080fd5b6000199150613497565b60206000803e60005191505b50806134e55760405162461bcd60e51b815260206004820152601960248201527f544f4b454e5f5452414e534645525f4f55545f4641494c45440000000000000060448201526064016107fa565b50505050565b60008215806134f8575081155b6135615760405162461bcd60e51b815260206004820152603460248201527f6f6e65206f662072656465656d546f6b656e73496e206f722072656465656d416044820152736d6f756e74496e206d757374206265207a65726f60601b60648201526084016107fa565b6135a26040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6135aa611aad565b60408301819052602083018260038111156135c7576135c7614a3e565b60038111156135d8576135d8614a3e565b90525060009050816020015160038111156135f5576135f5614a3e565b1461361f576136176009602b836020015160038111156113ab576113ab614a3e565b915050610b59565b83156136b85760608101849052604080516020810182529082015181526136469085612091565b608083018190526020830182600381111561366357613663614a3e565b600381111561367457613674614a3e565b905250600090508160200151600381111561369157613691614a3e565b146136b35761361760096029836020015160038111156113ab576113ab614a3e565b613749565b6136d483604051806020016040528084604001518152506143ea565b60608301819052602083018260038111156136f1576136f1614a3e565b600381111561370257613702614a3e565b905250600090508160200151600381111561371f5761371f614a3e565b14613741576136176009602a836020015160038111156113ab576113ab614a3e565b608081018390525b600554606082015160405163eabe7d9160e01b81526000926001600160a01b03169163eabe7d91916137829130918b9190600401614879565b602060405180830381600087803b15801561379c57600080fd5b505af11580156137b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d4919061483c565b905080156137f2576137e96003602883612724565b92505050610b59565b4360095414613807576137e9600a602c6121e0565b8160600151600d546138199190614991565b60a083015260608201516001600160a01b0387166000908152600f60205260409020546138469190614991565b60c083015260808201516138586120e4565b101561386a576137e9600e602f6121e0565b60a0820151600d5560c08201516001600160a01b0387166000908152600f602052604090205560808201516138a0908790613401565b306001600160a01b0316866001600160a01b0316600080516020614a9983398151915284606001516040516138d791815260200190565b60405180910390a36080820151606080840151604080516001600160a01b038b16815260208101949094528301527fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929910160405180910390a1600554608083015160608401516040516351dff98960e01b81523060048201526001600160a01b038a81166024830152604482019390935260648101919091529116906351dff98990608401600060405180830381600087803b15801561399657600080fd5b505af11580156139aa573d6000803e3d6000fd5b50600092506139b7915050565b9695505050505050565b600080836139d4575060009050806120dd565b60006139e08486614972565b9050836139ed868361495e565b14613a00576002600092509250506120dd565b6000925090506120dd565b60008082613a1f57506001905060006120dd565b6000613a2b848661495e565b915091509250929050565b6000333214613a7c5760405162461bcd60e51b8152602060048201526012602482015271636f6e74726163742063616c6c2064656e7960701b60448201526064016107fa565b60055460405163368f515360e21b81526000916001600160a01b03169063da3d454c90613ab190309088908890600401614879565b602060405180830381600087803b158015613acb57600080fd5b505af1158015613adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b03919061483c565b90508015613b2057613b186003600e83612724565b9150506107bd565b4360095414613b3457613b18600a806121e0565b82613b3d6120e4565b1015613b4f57613b18600e60096121e0565b613b7b604080516080810190915280600081526020016000815260200160008152602001600081525090565b600080613b87876123fc565b6020850181905284826003811115613ba157613ba1614a3e565b6003811115613bb257613bb2614a3e565b9052506000905083516003811115613bcc57613bcc614a3e565b14613bf957613bee60096007856000015160038111156113ab576113ab614a3e565b9450505050506107bd565b858360200151613c099190614946565b6040840152600b54613c1c908790614946565b606084019081526040808501516001600160a01b038a166000908152601160205291909120908155600a5460019091015551600b55613c5b8787613401565b60408084015160608086015183516001600160a01b038c168152602081018b9052938401929092528201527f13ed6866d4e1ee6da46f845c46d7e54120883d75c5ea9a2dacc1c4ca8984ab809060800160405180910390a160005b979650505050505050565b600554604051632fe3f38f60e11b81523060048201526001600160a01b03838116602483015286811660448301528581166064830152608482018590526000928392839290911690635fc7e71e9060a401602060405180830381600087803b158015613d2c57600080fd5b505af1158015613d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d64919061483c565b90508015613d8557613d796003601283612724565b600092509250506141a8565b4360095414613d9a57613d79600a60166121e0565b43846001600160a01b0316636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015613dd457600080fd5b505afa158015613de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0c919061483c565b14613e1d57613d79600a60116121e0565b866001600160a01b0316866001600160a01b03161415613e4357613d79600660176121e0565b84613e5457613d79600760156121e0565b600019851415613e6a57613d79600760146121e0565b600080613e78898989612c2f565b90925090508115613ead57613e9f826010811115613e9857613e98614a3e565b60186121e0565b6000945094505050506141a8565b60055460405163c488847b60e01b815260009182916001600160a01b039091169063c488847b90613ee69030908c908890600401614879565b604080518083038186803b158015613efd57600080fd5b505afa158015613f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f359190614855565b90925090508115613f885760405162461bcd60e51b815260206004820152601d60248201527f43414c43554c4154455f414d4f554e545f5345495a455f4641494c454400000060448201526064016107fa565b6040516370a0823160e01b81526001600160a01b038b811660048301528291908a16906370a082319060240160206040518083038186803b158015613fcc57600080fd5b505afa158015613fe0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614004919061483c565b10156140525760405162461bcd60e51b815260206004820152601860248201527f4c49515549444154455f5345495a455f544f4f5f4d554348000000000000000060448201526064016107fa565b60006001600160a01b03891630141561407857614071308d8d85612827565b90506140fd565b60405163b2a02ff160e01b81526001600160a01b038a169063b2a02ff1906140a8908f908f908790600401614879565b602060405180830381600087803b1580156140c257600080fd5b505af11580156140d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fa919061483c565b90505b80156141425760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b881cd95a5e9d5c994819985a5b195960621b60448201526064016107fa565b604080516001600160a01b038e811682528d811660208301528183018790528b1660608201526080810184905290517f298637f684da70674f26509b10f07ec2fbc77a335ab1e7d6215a4b2484d8bb529181900360a00190a16000975092955050505050505b94509492505050565b6012546040516370a0823160e01b81523060048201526000916001600160a01b031690829082906370a082319060240160206040518083038186803b1580156141f957600080fd5b505afa15801561420d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614231919061483c565b6040516323b872dd60e01b81529091506001600160a01b038316906323b872dd9061426490889030908990600401614879565b600060405180830381600087803b15801561427e57600080fd5b505af1158015614292573d6000803e3d6000fd5b5050505060003d600081146142ae57602081146142b857600080fd5b60001991506142c4565b60206000803e60005191505b50806143125760405162461bcd60e51b815260206004820152601860248201527f544f4b454e5f5452414e534645525f494e5f4641494c4544000000000000000060448201526064016107fa565b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561435657600080fd5b505afa15801561436a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061438e919061483c565b9050828110156143e05760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e5f5452414e534645525f494e5f4f564552464c4f5700000000000060448201526064016107fa565b613cb68382614991565b6000806000806120a18686600061440d6040518060200160405280600081525090565b600080614422670de0b6b3a7640000876139c1565b9092509050600082600381111561443b5761443b614a3e565b1461445a575060408051602081019091526000815290925090506120dd565b6120d6818660000151612ef0565b828054614474906149a8565b90600052602060002090601f01602090048101928261449657600085556144dc565b82601f106144af57805160ff19168380011785556144dc565b828001600101855582156144dc579182015b828111156144dc5782518255916020019190600101906144c1565b506144e89291506144ec565b5090565b5b808211156144e857600081556001016144ed565b600082601f83011261451257600080fd5b813567ffffffffffffffff8082111561452d5761452d614a6a565b604051601f8301601f19908116603f0116810190828211818310171561455557614555614a6a565b8160405283815286602085880101111561456e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811461459f57600080fd5b919050565b6000602082840312156145b657600080fd5b8135610b5981614a80565b600080604083850312156145d457600080fd5b82356145df81614a80565b915060208301356145ef81614a80565b809150509250929050565b60008060006060848603121561460f57600080fd5b833561461a81614a80565b9250602084013561462a81614a80565b929592945050506040919091013590565b600080600080600080600060e0888a03121561465657600080fd5b873561466181614a80565b9650602088013561467181614a80565b9550604088013561468181614a80565b945060608801359350608088013567ffffffffffffffff808211156146a557600080fd5b6146b18b838c01614501565b945060a08a01359150808211156146c757600080fd5b506146d48a828b01614501565b9250506146e360c0890161458e565b905092959891949750929550565b6000806040838503121561470457600080fd5b823561470f81614a80565b946020939093013593505050565b60008060006060848603121561473257600080fd5b833561473d81614a80565b925060208401359150604084013561475481614a80565b809150509250925092565b60006020828403121561477157600080fd5b81518015158114610b5957600080fd5b60008060008060008060c0878903121561479a57600080fd5b86356147a581614a80565b955060208701356147b581614a80565b945060408701359350606087013567ffffffffffffffff808211156147d957600080fd5b6147e58a838b01614501565b945060808901359150808211156147fb57600080fd5b5061480889828a01614501565b92505061481760a0880161458e565b90509295509295509295565b60006020828403121561483557600080fd5b5035919050565b60006020828403121561484e57600080fd5b5051919050565b6000806040838503121561486857600080fd5b505080516020909101519092909150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208083528351808285015260005b818110156148ca578581018301518582016040015282016148ae565b818111156148dc576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601690820152751858d8dc9d59481a5b9d195c995cdd0819985a5b195960521b604082015260600190565b6020808252600a90820152691c994b595b9d195c995960b21b604082015260600190565b6000821982111561495957614959614a12565b500190565b60008261496d5761496d614a28565b500490565b600081600019048311821515161561498c5761498c614a12565b500290565b6000828210156149a3576149a3614a12565b500390565b600181811c908216806149bc57607f821691505b602082108114156149dd57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149f7576149f7614a12565b5060010190565b600082614a0d57614a0d614a28565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614a9557600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200a5495c8ff9c90708ed5a6572006ba639f53ca959030d8021949a95fe036f9cd64736f6c63430008060033
Deployed Bytecode Sourcemap
73627:633:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25809:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35836:246;;;;;;:::i;:::-;;:::i;:::-;;;13445:14:1;;13438:22;13420:41;;13408:2;13393:18;35836:246:0;13375:92:1;69454:158:0;;;;;;:::i;:::-;;:::i;:::-;;;25037:25:1;;;25025:2;25010:18;69454:158:0;24992:76:1;26299:33:0;;;;;;38221:233;;;;;;:::i;:::-;;:::i;26509:23::-;;;;;;39814:250;;;:::i;68249:599::-;;;;;;:::i;:::-;;:::i;:::-;;70098:272;;;;;;:::i;:::-;;:::i;72572:288::-;;;;;;:::i;:::-;;:::i;35618:204::-;;;;;;:::i;:::-;;:::i;69626:198::-;;;;;;:::i;:::-;;:::i;26090:27::-;;;;;-1:-1:-1;;;;;26090:27:0;;;;;;-1:-1:-1;;;;;7166:32:1;;;7148:51;;7136:2;7121:18;26090:27:0;7103:102:1;25877:21:0;;;;;;;;;;;;26550:4:1;26538:17;;;26520:36;;26508:2;26493:18;25877:21:0;26475:87:1;36397:363:0;;;;;;:::i;:::-;;:::i;40932:97::-;;;:::i;70384:128::-;;;;;;:::i;:::-;;:::i;61383:564::-;;;;;;:::i;:::-;;:::i;26430:24::-;;;;;;26541:25;;;;;-1:-1:-1;;;;;26541:25:0;;;26132:39;;;;;-1:-1:-1;;;;;26132:39:0;;;64448:363;;;;;;:::i;:::-;;:::i;26347:30::-;;;;;;30866:25;;;;;-1:-1:-1;;;;;30866:25:0;;;36262:121;;;;;;:::i;:::-;-1:-1:-1;;;;;36355:20:0;36328:7;36355:20;;;:13;:20;;;;;;;36262:121;38006:201;;;:::i;69162:142::-;;;;;;:::i;:::-;;:::i;26469:25::-;;;;;;25842:20;;;:::i;38468:275::-;;;;;;:::i;:::-;;:::i;32726:1214::-;;;;;;:::i;:::-;;:::i;68870:142::-;;;;;;:::i;:::-;;:::i;41043:2958::-;;;:::i;35410:194::-;;;;;;:::i;:::-;;:::i;26392:23::-;;;;;;37799:193;;;:::i;58888:203::-;;;;;;:::i;:::-;;:::i;60288:477::-;;;;;;:::i;:::-;;:::i;39593:207::-;;;:::i;36774:712::-;;;;;;:::i;:::-;;:::i;:::-;;;;26213:25:1;;;26269:2;26254:18;;26247:34;;;;26297:18;;;26290:34;26355:2;26340:18;;26333:34;26200:3;26185:19;36774:712:0;26167:206:1;69318:122:0;;;;;;:::i;:::-;;:::i;69026:::-;;;;;;:::i;:::-;;:::i;36096:152::-;;;;;;:::i;:::-;-1:-1:-1;;;;;36206:25:0;;;36179:7;36206:25;;;:18;:25;;;;;;;;:34;;;;;;;;;;;;;36096:152;60779:590;;;:::i;66019:397::-;;;;;;:::i;:::-;;:::i;26186:42::-;;;;;-1:-1:-1;;;;;26186:42:0;;;69838:246;;;;;;:::i;:::-;;:::i;26055:20::-;;;;;;;;-1:-1:-1;;;;;26055:20:0;;;37615:170;;;:::i;61961:394::-;;;;;;:::i;:::-;;:::i;26963:36::-;;26995:4;26963:36;;25809:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35836:246::-;35944:10;35913:4;35965:23;;;:18;:23;;;;;;;;-1:-1:-1;;;;;35965:32:0;;;;;;;;;;:41;;;36022:30;35913:4;;35944:10;;;36022:30;;;;36000:6;25037:25:1;;25025:2;25010:18;;24992:76;36022:30:0;;;;;;;;36070:4;36063:11;;;35836:246;;;;;:::o;69454:158::-;69520:4;69538:8;69551:32;69571:11;69551:19;:32::i;:::-;-1:-1:-1;69537:46:0;69454:158;-1:-1:-1;;;69454:158:0:o;38221:233::-;38308:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;;;;;;;;;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;38333:16:::1;:14;:16::i;:::-;:40;38325:75;;;;-1:-1:-1::0;;;38325:75:0::1;;;;;;;:::i;:::-;38418:28;38438:7;38418:19;:28::i;:::-;38411:35;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;38221:233;;-1:-1:-1;38221:233:0:o;39814:250::-;39874:4;39892:13;39907:11;39922:28;:26;:28::i;:::-;39891:59;;-1:-1:-1;39891:59:0;-1:-1:-1;39976:18:0;39969:3;:25;;;;;;;;:::i;:::-;;39961:71;;;;-1:-1:-1;;;39961:71:0;;23210:2:1;39961:71:0;;;23192:21:1;23249:2;23229:18;;;23222:30;23288:34;23268:18;;;23261:62;-1:-1:-1;;;23339:18:1;;;23332:31;23380:19;;39961:71:0;23182:223:1;68249:599:0;68637:107;68654:12;68668:18;68688:28;68718:5;68725:7;68734:9;68637:16;:107::i;:::-;68765:10;:24;;-1:-1:-1;;;;;;68765:24:0;-1:-1:-1;;;;;68765:24:0;;;;;;;;68800:40;;;-1:-1:-1;;;68800:40:0;;;;:38;;:40;;;;;;;;;;;;;;;68765:24;68800:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68249:599;;;;;;;:::o;70098:272::-;70203:10;;-1:-1:-1;;;;;70185:28:0;;;70203:10;;70185:28;;70177:91;;;;-1:-1:-1;;;70177:91:0;;18098:2:1;70177:91:0;;;18080:21:1;18137:2;18117:18;;;18110:30;18176:34;18156:18;;;18149:62;-1:-1:-1;;;18227:18:1;;;18220:48;18285:19;;70177:91:0;18070:240:1;70177:91:0;70294:30;;-1:-1:-1;;;70294:30:0;;70318:4;70294:30;;;7148:51:1;70276:15:0;;-1:-1:-1;;;;;70294:15:0;;;;;7121:18:1;;70294:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70347:5;;70332:30;;-1:-1:-1;;;70332:30:0;;-1:-1:-1;;;;;70347:5:0;;;;;;70332:30;;;7392:51:1;7459:18;;;7452:34;;;;;-1:-1:-1;70332:14:0;;;;;7365:18:1;;70332:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70169:201;70098:272;:::o;72572:288::-;72654:4;72679:15;72671:44;;;;-1:-1:-1;;;72671:44:0;;18517:2:1;72671:44:0;;;18499:21:1;18556:2;18536:18;;;18529:30;-1:-1:-1;;;18575:18:1;;;18568:46;18631:18;;72671:44:0;18489:166:1;72671:44:0;72727:8;72740:40;72759:8;72769:10;72740:18;:40::i;:::-;72726:54;;;72791:40;72806:3;72791:40;;;;;;;;;;;;;-1:-1:-1;;;72791:40:0;;;:14;:40::i;:::-;72849:3;72572:288;-1:-1:-1;;;72572:288:0:o;35618:204::-;35722:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;35746:44:::1;35761:10;35773:3;35778;35783:6;35746:14;:44::i;:::-;:68;35739:75;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;35618:204;;-1:-1:-1;;;35618:204:0:o;69626:198::-;69716:4;69734:8;69747:48;69773:8;69783:11;69747:25;:48::i;:::-;-1:-1:-1;69733:62:0;69626:198;-1:-1:-1;;;;69626:198:0:o;36397:363::-;36468:4;36485:23;36511:38;;;;;;;;36526:21;:19;:21::i;:::-;36511:38;;-1:-1:-1;;;;;36625:20:0;;36561:14;36625:20;;;:13;:20;;;;;;36485:64;;-1:-1:-1;36561:14:0;;;36593:53;;36485:64;;36593:17;:53::i;:::-;36560:86;;-1:-1:-1;36560:86:0;-1:-1:-1;36673:18:0;36665:4;:26;;;;;;;;:::i;:::-;;36657:70;;;;-1:-1:-1;;;36657:70:0;;16987:2:1;36657:70:0;;;16969:21:1;17026:2;17006:18;;;16999:30;17065:33;17045:18;;;17038:61;17116:18;;36657:70:0;16959:181:1;36657:70:0;36745:7;36397:363;-1:-1:-1;;;;36397:363:0:o;40932:97::-;40983:4;41007:14;:12;:14::i;:::-;41000:21;;40932:97;:::o;70384:128::-;70449:4;70473:31;70494:9;70473:20;:31::i;61383:564::-;61515:5;;61470:4;;61515:5;;;-1:-1:-1;;;;;61515:5:0;61501:10;:19;61497:124;;61544:65;61549:18;61569:39;61544:4;:65::i;61497:124::-;61671:11;;61711:30;;;-1:-1:-1;;;61711:30:0;;;;-1:-1:-1;;;;;61671:11:0;;;;61711:28;;;;;:30;;;;;;;;;;;;;;:28;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61703:71;;;;-1:-1:-1;;;61703:71:0;;21103:2:1;61703:71:0;;;21085:21:1;21142:2;21122:18;;;21115:30;21181;21161:18;;;21154:58;21229:18;;61703:71:0;21075:178:1;61703:71:0;61797:11;:28;;-1:-1:-1;;;;;;61797:28:0;-1:-1:-1;;;;;61797:28:0;;;;;;;;;61853:46;;;8515:15:1;;;8497:34;;8562:2;8547:18;;8540:43;;;;61853:46:0;;8432:18:1;61853:46:0;;;;;;;;61924:14;61912:27;61383:564;-1:-1:-1;;;61383:564:0:o;64448:363::-;64532:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;64562:16:::1;:14;:16::i;:::-;64549:29:::0;-1:-1:-1;64593:29:0;;64589:153:::1;;64660:70;64671:5;64665:12;;;;;;;;:::i;:::-;64679:50;64660:4;:70::i;:::-;64653:77;;;;;64589:153;64769:34;64790:12;64769:20;:34::i;:::-;64762:41;;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;64448:363;;-1:-1:-1;64448:363:0:o;38006:201::-;38077:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;38102:16:::1;:14;:16::i;:::-;:40;38094:75;;;;-1:-1:-1::0;;;38094:75:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;38187:12:0::1;::::0;67709:11;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;38006:201;:::o;69162:142::-;69234:4;69258:38;69283:12;69258:24;:38::i;25842:20::-;;;;;;;:::i;38468:275::-;38544:4;38562:13;38577:11;38592:36;38620:7;38592:27;:36::i;:::-;38561:67;;-1:-1:-1;38561:67:0;-1:-1:-1;38654:18:0;38647:3;:25;;;;;;;;:::i;:::-;;38639:72;;;;-1:-1:-1;;;38639:72:0;;15475:2:1;38639:72:0;;;15457:21:1;15514:2;15494:18;;;15487:30;15553:34;15533:18;;;15526:62;-1:-1:-1;;;15604:18:1;;;15597:32;15646:19;;38639:72:0;15447:224:1;32726:1214:0;33080:5;;;;;-1:-1:-1;;;;;33080:5:0;33066:10;:19;33058:68;;;;-1:-1:-1;;;33058:68:0;;16229:2:1;33058:68:0;;;16211:21:1;16268:2;16248:18;;;16241:30;16307:34;16287:18;;;16280:62;-1:-1:-1;;;16358:18:1;;;16351:34;16402:19;;33058:68:0;16201:226:1;33058:68:0;33145:18;;:23;:43;;;;-1:-1:-1;33172:11:0;;:16;33145:43;33137:91;;;;-1:-1:-1;;;33137:91:0;;17694:2:1;33137:91:0;;;17676:21:1;17733:2;17713:18;;;17706:30;17772:34;17752:18;;;17745:62;-1:-1:-1;;;17823:18:1;;;17816:33;17866:19;;33137:91:0;17666:225:1;33137:91:0;33251:27;:58;;;33328:31;33320:92;;;;-1:-1:-1;;;33320:92:0;;19929:2:1;33320:92:0;;;19911:21:1;19968:2;19948:18;;;19941:30;20007:34;19987:18;;;19980:62;-1:-1:-1;;;20058:18:1;;;20051:46;20114:19;;33320:92:0;19901:238:1;33320:92:0;33435:8;33446:29;33462:12;33446:15;:29::i;:::-;33435:40;-1:-1:-1;33494:27:0;;33486:66;;;;-1:-1:-1;;;33486:66:0;;22502:2:1;33486:66:0;;;22484:21:1;22541:2;22521:18;;;22514:30;22580:28;22560:18;;;22553:56;22626:18;;33486:66:0;22474:176:1;33486:66:0;37581:12;33575:18;:37;90:4;33623:11;:25;33677:46;33704:18;33677:26;:46::i;:::-;33671:52;-1:-1:-1;33742:27:0;;33734:74;;;;-1:-1:-1;;;33734:74:0;;20346:2:1;33734:74:0;;;20328:21:1;20385:2;20365:18;;;20358:30;20424:34;20404:18;;;20397:62;-1:-1:-1;;;20475:18:1;;;20468:32;20517:19;;33734:74:0;20318:224:1;33734:74:0;33821:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;33844:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;33871:8:0;:20;;;;;;-1:-1:-1;;33871:20:0;;;;;;:8;33914:18;;;;;33871:20;33914:18;;;-1:-1:-1;;;;;32726:1214:0:o;68870:142::-;68928:4;68946:8;68959:24;68972:10;68959:12;:24::i;41043:2958::-;41213:18;;41102:4;;37581:12;;41258:45;;;41254:105;;;41332:14;41327:20;41320:27;;;;41043:2958;:::o;41254:105::-;41381:14;41398;:12;:14::i;:::-;41443:12;;41487:13;;41535:11;;41595:17;;:71;;-1:-1:-1;;;41595:71:0;;;;;25536:25:1;;;25577:18;;;25570:34;;;25620:18;;;25613:34;;;41381:31:0;;-1:-1:-1;41443:12:0;;41487:13;;41535:11;;41423:17;;-1:-1:-1;;;;;41595:17:0;;:31;;25509:18:1;;41595:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41569:97;;25962:9;41685:18;:43;;41677:84;;;;-1:-1:-1;;;41677:84:0;;22145:2:1;41677:84:0;;;22127:21:1;22184:2;22164:18;;;22157:30;22223;22203:18;;;22196:58;22271:18;;41677:84:0;22117:178:1;41677:84:0;41785:17;41804:15;41823:52;41831:18;41851:23;41823:7;:52::i;:::-;41784:91;;-1:-1:-1;41784:91:0;-1:-1:-1;41905:18:0;41894:7;:29;;;;;;;;:::i;:::-;;41886:59;;;;-1:-1:-1;;;41886:59:0;;21460:2:1;41886:59:0;;;21442:21:1;21499:2;21479:18;;;21472:30;-1:-1:-1;;;21518:18:1;;;21511:47;21575:18;;41886:59:0;21432:167:1;41886:59:0;-1:-1:-1;;;;;;;;;;;;42012:24:0;42047:20;42078:21;42110:19;42176:58;42186:35;;;;;;;;42201:18;42186:35;;;42223:10;42176:9;:58::i;:::-;42142:92;;-1:-1:-1;42142:92:0;-1:-1:-1;42260:18:0;42249:7;:29;;;;;;;;:::i;:::-;;42245:183;;42302:114;42313:16;42331:69;42407:7;42402:13;;;;;;;;:::i;:::-;42302:10;:114::i;:::-;42295:121;;;;;;;;;;;;;;;;41043:2958;:::o;42245:183::-;42473:53;42491:20;42513:12;42473:17;:53::i;:::-;42440:86;;-1:-1:-1;42440:86:0;-1:-1:-1;42552:18:0;42541:7;:29;;;;;;;;:::i;:::-;;42537:181;;42594:112;42605:16;42623:67;42697:7;42692:13;;;;;;;;:::i;42537:181::-;42757:42;42765:19;42786:12;42757:7;:42::i;:::-;42728:71;;-1:-1:-1;42728:71:0;-1:-1:-1;42825:18:0;42814:7;:29;;;;;;;;:::i;:::-;;42810:178;;42867:109;42878:16;42896:64;42967:7;42962:13;;;;;;;;:::i;42810:178::-;43030:100;43055:38;;;;;;;;43070:21;;43055:38;;;43095:19;43116:13;43030:24;:100::i;:::-;43000:130;;-1:-1:-1;43000:130:0;-1:-1:-1;43156:18:0;43145:7;:29;;;;;;;;:::i;:::-;;43141:179;;43198:110;43209:16;43227:65;43299:7;43294:13;;;;;;;;:::i;43141:179::-;43360:82;43385:20;43407:16;43425;43360:24;:82::i;:::-;43332:110;;-1:-1:-1;43332:110:0;-1:-1:-1;43468:18:0;43457:7;:29;;;;;;;;:::i;:::-;;43453:177;;43510:108;43521:16;43539:63;43609:7;43604:13;;;;;;;;:::i;43453:177::-;43684:18;:39;;;43734:11;:28;;;43773:12;:30;;;43814:13;:32;;;43874:79;;;26213:25:1;;;26269:2;26254:18;;26247:34;;;26297:18;;;26290:34;;;26355:2;26340:18;;26333:34;;;43874:79:0;;26200:3:1;26185:19;43874:79:0;;;;;;;43978:14;43973:20;;35410:194;35497:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;35521:51:::1;35536:10;35548;35560:3;35565:6;35521:14;:51::i;:::-;:75;35514:82;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;35410:194;;-1:-1:-1;;35410:194:0:o;37799:193::-;37885:17;;37861:4;;-1:-1:-1;;;;;37885:17:0;:31;37917:14;:12;:14::i;:::-;37933:12;;37947:13;;37962:21;;37885:99;;-1:-1:-1;;;;;;37885:99:0;;;;;;;;;;26213:25:1;;;;26254:18;;;26247:34;;;;26297:18;;;26290:34;26340:18;;;26333:34;26185:19;;37885:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58888:203::-;58999:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;59023:60:::1;59037:10;59049::::0;59061:8;59071:11;59023:13:::1;:60::i;:::-;59016:67;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;58888:203;;-1:-1:-1;;;58888:203:0:o;60288:477::-;60419:5;;60374:4;;60419:5;;;-1:-1:-1;;;;;60419:5:0;60405:10;:19;60401:126;;60448:67;60453:18;60473:41;60448:4;:67::i;60401:126::-;60575:12;;;-1:-1:-1;;;;;60610:30:0;;;-1:-1:-1;;;;;;60610:30:0;;;;;;;60668:49;;;60575:12;;;;8497:34:1;;;8562:2;8547:18;;8540:43;;;;60668:49:0;;8432:18:1;60668:49:0;8414:175:1;39593:207:0;39662:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;39687:16:::1;:14;:16::i;:::-;:40;39679:75;;;;-1:-1:-1::0;;;39679:75:0::1;;;;;;;:::i;:::-;39772:20;:18;:20::i;:::-;39765:27;;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;39593:207;:::o;36774:712::-;-1:-1:-1;;;;;36907:22:0;;36851:4;36907:22;;;:13;:22;;;;;;36851:4;;;;;;;;;37058:36;36921:7;37058:27;:36::i;:::-;37034:60;-1:-1:-1;37034:60:0;-1:-1:-1;37117:18:0;37109:4;:26;;;;;;;;:::i;:::-;;37105:99;;37165:16;37160:22;37184:1;37187;37190;37152:40;;;;;;;;;;;;;;37105:99;37247:28;:26;:28::i;:::-;37216:59;-1:-1:-1;37216:59:0;-1:-1:-1;37298:18:0;37290:4;:26;;;;;;;;:::i;:::-;;37286:99;;37346:16;37341:22;;37286:99;-1:-1:-1;37410:14:0;;-1:-1:-1;37427:13:0;;-1:-1:-1;37442:13:0;-1:-1:-1;37442:13:0;-1:-1:-1;36774:712:0;;;;;;:::o;69318:122::-;69380:4;69404:28;69419:12;69404:14;:28::i;69026:122::-;69088:4;69112:28;69127:12;69112:14;:28::i;60779:590::-;60875:12;;60830:4;;-1:-1:-1;;;;;60875:12:0;60861:10;:26;;;:54;;-1:-1:-1;60891:10:0;:24;60861:54;60857:164;;;60939:70;60944:18;60964:44;60939:4;:70::i;60857:164::-;61062:5;;;61104:12;;;-1:-1:-1;;;;;61104:12:0;;;61062:5;61139:20;;;-1:-1:-1;;;;;;61139:20:0;;;;;;;-1:-1:-1;;;;;;61182:34:0;;;;;;61234:25;;;61062:5;;;;;;8497:34:1;;;61253:5:0;;;;;8562:2:1;8547:18;;8540:43;61062:5:0;61104:12;;61234:25;;8432:18:1;61234:25:0;;;;;;;61308:12;;61275:46;;;-1:-1:-1;;;;;8515:15:1;;;8497:34;;61308:12:0;;;8562:2:1;8547:18;;8540:43;61275:46:0;;8432:18:1;61275:46:0;;;;;;;61346:14;61341:20;;66019:397;66115:4;66132:10;66145:16;:14;:16::i;:::-;66132:29;-1:-1:-1;66176:29:0;;66172:161;;66243:78;66254:5;66248:12;;;;;;;;:::i;:::-;66262:58;66243:4;:78::i;66172:161::-;66360:48;66387:20;66360:26;:48::i;69838:246::-;69960:4;69978:8;69991:64;70015:8;70025:11;70038:16;69991:23;:64::i;:::-;-1:-1:-1;69977:78:0;69838:246;-1:-1:-1;;;;;69838:246:0:o;37615:170::-;37701:17;;37677:4;;-1:-1:-1;;;;;37701:17:0;:31;37733:14;:12;:14::i;:::-;37749:12;;37763:13;;37701:76;;-1:-1:-1;;;;;;37701:76:0;;;;;;;;;;25536:25:1;;;;25577:18;;;25570:34;;;;25620:18;;;25613:34;25509:18;;37701:76:0;25491:162:1;61961:394:0;62059:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;62089:16:::1;:14;:16::i;:::-;62076:29:::0;-1:-1:-1;62120:29:0;;62116:156:::1;;62187:73;62198:5;62192:12;;;;;;;;:::i;:::-;62206:53;62187:4;:73::i;62116:156::-;62299:48;62322:24;62299:22;:48::i;52473:384::-:0;52551:4;67630:11;;52551:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;52587:16:::1;:14;:16::i;:::-;52574:29:::0;-1:-1:-1;52618:29:0;;52614:155:::1;;52686:67;52697:5;52691:12;;;;;;;;:::i;:::-;52705:47;52686:4;:67::i;:::-;52755:1;52678:79;;;;;;;52614:155;52796:53;52813:10;52825;52837:11;52796:16;:53::i;:::-;52789:60;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;52473:384;;;;-1:-1:-1;52473:384:0:o;40078:840::-;40195:11;;40147:9;;;;40221:17;40217:694;;-1:-1:-1;;40297:27:0;;40277:18;;40297:27;;-1:-1:-1;40078:840:0:o;40217:694::-;40372:14;40389;:12;:14::i;:::-;40372:31;;40432:23;-1:-1:-1;;;;;;;;;;;;;;40432:23:0;40470:17;40560:33;40623:13;;40608:12;;40596:9;:24;;;;:::i;:::-;:40;;;;:::i;:::-;40560:76;;40679:50;40686:28;40716:12;40679:6;:50::i;:::-;40653:76;-1:-1:-1;40653:76:0;-1:-1:-1;40759:18:0;40748:7;:29;;;;;;;;:::i;:::-;;40744:89;;-1:-1:-1;40806:7:0;40815:1;;-1:-1:-1;40078:840:0;-1:-1:-1;;;;40078:840:0:o;40744:89::-;-1:-1:-1;;40877:21:0;40857:18;;40877:21;;-1:-1:-1;40078:840:0;-1:-1:-1;;;40078:840:0:o;67750:378::-;67852:4;67630:11;;67852:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;67888:16:::1;:14;:16::i;:::-;67875:29:::0;-1:-1:-1;67919:29:0;;67915:147:::1;;67987:59;67998:5;67992:12;;;;;;;;:::i;:::-;68006:39;67987:4;:59::i;:::-;68048:1;67979:71;;;;;;;67915:147;68089:31;68099:8;68109:10;68089:9;:31::i;:::-;68082:38;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;67750:378;;;;-1:-1:-1;67750:378:0;-1:-1:-1;67750:378:0:o;72866:714::-;72956:31;72952:70;;72866:714;;:::o;72952:70::-;73032:24;73075:7;73069:21;73093:1;73069:25;;;;:::i;:::-;73059:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73059:36:0;;73032:63;;73106:6;73123:105;73145:7;73139:21;73135:1;:25;73123:105;;;73205:7;73214:1;73199:17;;;;;;;;:::i;:::-;;;;;;;;;73182:11;73194:1;73182:14;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;73182:34:0;;;;;;;;-1:-1:-1;73162:3:0;;;;:::i;:::-;;;;73123:105;;;-1:-1:-1;;;73238:11:0;73250:3;:1;73252;73250:3;:::i;:::-;73238:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73238:36:0;;;;;;;;-1:-1:-1;;;;73285:11:0;73297:3;:1;73299;73297:3;:::i;:::-;73285:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73285:36:0;;;;;;;;-1:-1:-1;73371:12:0;73381:2;73371:7;:12;:::i;:::-;73364:21;;:2;:21;:::i;:::-;73351:36;;73332:11;73344:3;:1;73346;73344:3;:::i;:::-;73332:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;73332:55:0;;;;;;;;-1:-1:-1;73437:12:0;73447:2;73437:7;:12;:::i;:::-;73430:21;;:2;:21;:::i;:::-;73417:36;;73398:11;73410:3;:1;73412;73410:3;:::i;:::-;73398:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;73398:55:0;;;;;;;;-1:-1:-1;;;;73464:11:0;73476:3;:1;73478;73476:3;:::i;:::-;73464:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;73464:36:0;;;;;;;;-1:-1:-1;73559:11:0;73519:31;;73511:61;;;;-1:-1:-1;;;73511:61:0;;;;;;;;:::i;:::-;;72941:639;;72866:714;;:::o;33954:1442::-;34094:11;;:60;;-1:-1:-1;;;34094:60:0;;34130:4;34094:60;;;10570:34:1;-1:-1:-1;;;;;10640:15:1;;;10620:18;;;10613:43;10692:15;;;10672:18;;;10665:43;10724:18;;;10717:34;;;34052:4:0;;;;34094:11;;;:27;;10504:19:1;;34094:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34079:75;-1:-1:-1;34169:12:0;;34165:144;;34205:92;34216:27;34245:42;34289:7;34205:10;:92::i;:::-;34198:99;;;;;34165:144;34342:3;-1:-1:-1;;;;;34335:10:0;:3;-1:-1:-1;;;;;34335:10:0;;34331:105;;;34369:55;34374:15;34391:32;34369:4;:55::i;34331:105::-;34458:22;34510:3;-1:-1:-1;;;;;34499:14:0;:7;-1:-1:-1;;;;;34499:14:0;;34495:166;;;-1:-1:-1;;;34495:166:0;;;-1:-1:-1;;;;;;34617:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;;34495:166;34851:17;34871:26;34891:6;34871:17;:26;:::i;:::-;-1:-1:-1;;;;;34928:18:0;;34908:17;34928:18;;;:13;:18;;;;;;34851:46;;-1:-1:-1;34908:17:0;34928:27;;34949:6;;34928:27;:::i;:::-;-1:-1:-1;;;;;34986:18:0;;34966:17;34986:18;;;:13;:18;;;;;;34908:47;;-1:-1:-1;34966:17:0;34986:27;;35007:6;;34986:27;:::i;:::-;-1:-1:-1;;;;;35058:18:0;;;;;;;:13;:18;;;;;;:33;;;35102:18;;;;;;:33;;;34966:47;-1:-1:-1;;;35162:35:0;;35158:115;;-1:-1:-1;;;;;35214:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;:47;;;35158:115;35314:3;-1:-1:-1;;;;;35300:26:0;35309:3;-1:-1:-1;;;;;35300:26:0;-1:-1:-1;;;;;;;;;;;35319:6:0;35300:26;;;;25037:25:1;;25025:2;25010:18;;24992:76;35300:26:0;;;;;;;;-1:-1:-1;35373:14:0;;33954:1442;-1:-1:-1;;;;;;;;;33954:1442:0:o;52871:406::-;52973:4;67630:11;;52973:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;53009:16:::1;:14;:16::i;:::-;52996:29:::0;-1:-1:-1;53040:29:0;;53036:155:::1;;53108:67;53119:5;53113:12;;;;;;;;:::i;:::-;53127:47;53108:4;:67::i;53036:155::-;53218:51;53235:10;53247:8;53257:11;53218:16;:51::i;15699:313::-:0;15776:9;15787:4;15805:13;15820:18;15842:20;15852:1;15855:6;15842:9;:20::i;:::-;15804:58;;-1:-1:-1;15804:58:0;-1:-1:-1;15884:18:0;15877:3;:25;;;;;;;;:::i;:::-;;15873:73;;-1:-1:-1;15927:3:0;-1:-1:-1;15932:1:0;;-1:-1:-1;15919:15:0;;15873:73;15966:18;15986:17;15995:7;15986:8;:17::i;:::-;15958:46;;;;;;15699:313;;;;;;:::o;70534:186::-;70653:10;;70682:30;;-1:-1:-1;;;70682:30:0;;70706:4;70682:30;;;7148:51:1;70598:4:0;;-1:-1:-1;;;;;70653:10:0;;;;70682:15;;7121:18:1;;70682:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70675:37;;;70534:186;:::o;63227:377::-;63304:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;63334:16:::1;:14;:16::i;:::-;63321:29:::0;-1:-1:-1;63365:29:0;;63361:150:::1;;63432:67;63443:5;63437:12;;;;;;;;:::i;:::-;63451:47;63432:4;:67::i;63361:150::-;63545:28;63563:9;63545:17;:28::i;:::-;-1:-1:-1::0;63533:40:0;-1:-1:-1;;67709:11:0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;63227:377;;-1:-1:-1;63227:377:0:o;25307:153::-;25368:4;25390:33;25403:3;25398:9;;;;;;;;:::i;:::-;25414:4;25409:10;;;;;;;;:::i;:::-;25390:33;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;;25421:1:0;25620:18:1;;;25613:34;25524:2;25509:18;25390:33:0;;;;;;;25448:3;25443:9;;;;;;;;:::i;64825:1180::-;64981:5;;64892:4;;;;64981:5;;;-1:-1:-1;;;;;64981:5:0;64967:10;:19;64963:124;;65010:65;65015:18;65035:39;65010:4;:65::i;64963:124::-;37581:12;65113:18;;:38;65109:147;;65175:69;65180:22;65204:39;65175:4;:69::i;65109:147::-;65299:12;65282:14;:12;:14::i;:::-;:29;65278:152;;;65335:83;65340:29;65371:46;65335:4;:83::i;65278:152::-;65471:13;;65456:12;:28;65452:129;;;65508:61;65513:15;65530:38;65508:4;:61::i;65452:129::-;65660:12;65644:13;;:28;;;;:::i;:::-;65625:47;;65721:13;;65701:16;:33;;65693:71;;;;-1:-1:-1;;;65693:71:0;;20749:2:1;65693:71:0;;;20731:21:1;20788:2;20768:18;;;20761:30;20827:27;20807:18;;;20800:55;20872:18;;65693:71:0;20721:175:1;65693:71:0;65787:13;:32;;;65864:5;;65842:43;;65864:5;;;-1:-1:-1;;;;;65864:5:0;65872:12;65842:13;:43::i;:::-;65919:5;;65903:54;;;65919:5;;;;-1:-1:-1;;;;;65919:5:0;7707:51:1;;7789:2;7774:18;;7767:34;;;7817:18;;7810:34;;;65903:54:0;;7695:2:1;7680:18;65903:54:0;7662:188:1;46736:369:0;46820:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;46850:16:::1;:14;:16::i;:::-;46837:29:::0;-1:-1:-1;46881:29:0;;46877:144:::1;;46948:61;46959:5;46953:12;;;;;;;;:::i;:::-;46967:41;46948:4;:61::i;46877:144::-;47048:49;47068:10;47081:1;47084:12;47048:11;:49::i;38757:822::-:0;-1:-1:-1;;;;;39009:23:0;;38834:9;39009:23;;;:14;:23;;;;;39059:24;;38834:9;;;;;;;;39055:92;;-1:-1:-1;39113:18:0;;;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;;38757:822:0:o;39055:92::-;39204:46;39212:14;:24;;;39238:11;;39204:7;:46::i;:::-;39171:79;;-1:-1:-1;39171:79:0;-1:-1:-1;39276:18:0;39265:7;:29;;;;;;;;:::i;:::-;;39261:81;;-1:-1:-1;39319:7:0;;39328:1;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;39261:81::-;39374:58;39382:19;39403:14;:28;;;39374:7;:58::i;:::-;39354:78;;-1:-1:-1;39354:78:0;-1:-1:-1;39458:18:0;39447:7;:29;;;;;;;;:::i;:::-;;39443:81;;-1:-1:-1;39501:7:0;;39510:1;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;39443:81::-;-1:-1:-1;39544:18:0;;39564:6;;-1:-1:-1;38757:822:0;-1:-1:-1;;;;38757:822:0:o;66430:870::-;66632:5;;66524:4;;;;66632:5;;;-1:-1:-1;;;;;66632:5:0;66618:10;:19;66614:132;;66661:73;66666:18;66686:47;66661:4;:73::i;66614:132::-;37581:12;66772:18;;:38;66768:155;;66834:77;66839:22;66863:47;66834:4;:77::i;66768:155::-;66968:17;;;;;;;;;-1:-1:-1;;;;;66968:17:0;66945:40;;67016:20;-1:-1:-1;;;;;67016:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67008:83;;;;-1:-1:-1;;;67008:83:0;;21103:2:1;67008:83:0;;;21085:21:1;21142:2;21122:18;;;21115:30;21181;21161:18;;;21154:58;21229:18;;67008:83:0;21075:178:1;67008:83:0;67114:17;:40;;-1:-1:-1;;;;;;67114:40:0;-1:-1:-1;;;;;67114:40:0;;;;;;;;;67182:70;;;8515:15:1;;;8497:34;;8562:2;8547:18;;8540:43;;;;67182:70:0;;8432:18:1;67182:70:0;8414:175:1;44015:348:0;44085:4;67630:11;;44085:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;44121:16:::1;:14;:16::i;:::-;44108:29:::0;-1:-1:-1;44152:29:0;;44148:147:::1;;44220:59;44231:5;44225:12;;;;;;;;:::i;44148:147::-;44322:33;44332:10;44344;44322:9;:33::i;6545:236::-:0;6601:9;6612:4;6638:1;6633;:6;6629:145;;6664:18;6684:5;6688:1;6684;:5;:::i;:::-;6656:34;;;;;;6629:145;-1:-1:-1;6731:27:0;;-1:-1:-1;6760:1:0;6723:39;;15332:353;15401:9;15412:10;-1:-1:-1;;;;;;;;;;;;;;15412:10:0;15436:14;15452:19;15475:27;15483:1;:10;;;15495:6;15475:7;:27::i;:::-;15435:67;;-1:-1:-1;15435:67:0;-1:-1:-1;15525:18:0;15517:4;:26;;;;;;;;:::i;:::-;;15513:92;;-1:-1:-1;15574:18:0;;;;;;;;;-1:-1:-1;15574:18:0;;15568:4;;-1:-1:-1;15574:18:0;-1:-1:-1;15560:33:0;;15513:92;15645:31;;;;;;;;;;;;-1:-1:-1;;15645:31:0;;-1:-1:-1;15332:353:0;-1:-1:-1;;;;15332:353:0:o;25474:187::-;25559:4;25581:43;25594:3;25589:9;;;;;;;;:::i;:::-;25605:4;25600:10;;;;;;;;:::i;:::-;25581:43;;;25536:25:1;;;25592:2;25577:18;;25570:34;;;;25620:18;;25613:34;;;25524:2;25509:18;25581:43:0;;;;;;;25649:3;25644:9;;;;;;;;:::i;6795:258::-;6851:9;;;6888:5;6892:1;6888;:5;:::i;:::-;6879:14;;6915:1;6910;:6;6906:140;;6941:18;;-1:-1:-1;6961:1:0;-1:-1:-1;6933:30:0;;6906:140;7004:26;7032:1;6996:38;;;;;;;16026:328;16123:9;16134:4;16152:13;16167:18;16189:20;16199:1;16202:6;16189:9;:20::i;:::-;16151:58;;-1:-1:-1;16151:58:0;-1:-1:-1;16231:18:0;16224:3;:25;;;;;;;;:::i;:::-;;16220:73;;-1:-1:-1;16274:3:0;-1:-1:-1;16279:1:0;;-1:-1:-1;16266:15:0;;16220:73;16312:34;16320:17;16329:7;16320:8;:17::i;:::-;16339:6;16312:7;:34::i;:::-;16305:41;;;;;;16026:328;;;;;;;:::o;59105:1159::-;59265:11;;:87;;-1:-1:-1;;;59265:87:0;;59298:4;59265:87;;;10056:34:1;-1:-1:-1;;;;;10126:15:1;;;10106:18;;;10099:43;10178:15;;;10158:18;;;10151:43;10230:15;;;10210:18;;;10203:43;10262:19;;;10255:35;;;59223:4:0;;;;59265:11;;;:24;;9990:19:1;;59265:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59250:102;-1:-1:-1;59367:12:0;;59363:151;;59403:99;59414:27;59443:49;59494:7;59403:10;:99::i;59363:151::-;59552:10;-1:-1:-1;;;;;59540:22:0;:8;-1:-1:-1;;;;;59540:22:0;;59536:146;;;59586:84;59591:26;59619:50;59586:4;:84::i;59536:146::-;-1:-1:-1;;;;;59843:23:0;;59818:22;59843:23;;;:13;:23;;;;;;:37;;59869:11;;59843:37;:::i;:::-;-1:-1:-1;;;;;59918:25:0;;59891:24;59918:25;;;:13;:25;;;;;;59818:62;;-1:-1:-1;59891:24:0;59918:39;;59946:11;;59918:39;:::i;:::-;-1:-1:-1;;;;;60012:23:0;;;;;;;:13;:23;;;;;;:43;;;60066:25;;;;;;;;;;:47;;;60141:43;;59891:66;;-1:-1:-1;60066:25:0;;-1:-1:-1;;;;;;;;;;;60141:43:0;;;60172:11;25037:25:1;;25025:2;25010:18;;24992:76;60141:43:0;;;;;;;;60241:14;60229:27;59105:1159;-1:-1:-1;;;;;;;;59105:1159:0:o;50113:356::-;50187:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;50217:16:::1;:14;:16::i;:::-;50204:29:::0;-1:-1:-1;50248:29:0;;50244:144:::1;;50315:61;50326:5;50320:12;;;;;;;;:::i;:::-;50334:41;50315:4;:61::i;50244:144::-;50415:46;50435:10;50448:12;50415:11;:46::i;46363:359::-:0;46437:4;67630:11;;;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;46467:16:::1;:14;:16::i;:::-;46454:29:::0;-1:-1:-1;46498:29:0;;46494:144:::1;;46565:61;46576:5;46570:12;;;;;;;;:::i;46494:144::-;46665:49;46685:10;46698:12;46712:1;46665:11;:49::i;55493:693::-:0;55627:4;67630:11;;55627:4;;67630:11;;67622:34;;;;-1:-1:-1;;;67622:34:0;;;;;;;:::i;:::-;67681:5;67667:19;;-1:-1:-1;;67667:19:0;;;55663:16:::1;:14;:16::i;:::-;55650:29:::0;-1:-1:-1;55694:29:0;;55690:159:::1;;55762:71;55773:5;55767:12;;;;;;;;:::i;:::-;55781:51;55762:4;:71::i;:::-;55835:1;55754:83;;;;;;;55690:159;55869:16;-1:-1:-1::0;;;;;55869:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55861:41:::0;-1:-1:-1;55917:29:0;;55913:163:::1;;55985:75;55996:5;55990:12;;;;;;;;:::i;:::-;56004:55;55985:4;:75::i;55913:163::-;56105:73;56126:10;56138:8;56148:11;56161:16;56105:20;:73::i;:::-;56098:80;;;;;67697:1;67709:11:::0;:18;;-1:-1:-1;;67709:18:0;67723:4;67709:18;;;55493:693;;;;-1:-1:-1;55493:693:0;-1:-1:-1;;55493:693:0:o;62369:844::-;62495:5;;62450:4;;62495:5;;;-1:-1:-1;;;;;62495:5:0;62481:10;:19;62477:127;;62524:68;62529:18;62549:42;62524:4;:68::i;62477:127::-;37581:12;62630:18;;:38;62626:150;;62692:72;62697:22;62721:42;62692:4;:72::i;62626:150::-;26036:4;62802:24;:51;62798:157;;;62877:66;62882:15;62899:43;62877:4;:66::i;62798:157::-;62999:21;;;63031:48;;;;63097:68;;;25247:25:1;;;25303:2;25288:18;;25281:34;;;63097:68:0;;25220:18:1;63097:68:0;25202:119:1;53566:1913:0;53709:11;;:75;;-1:-1:-1;;;53709:75:0;;53748:4;53709:75;;;10570:34:1;-1:-1:-1;;;;;10640:15:1;;;10620:18;;;10613:43;10692:15;;;10672:18;;;10665:43;10724:18;;;10717:34;;;53661:4:0;;;;;;53709:11;;;;:30;;10504:19:1;;53709:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53694:90;-1:-1:-1;53799:12:0;;53795:153;;53836:96;53847:27;53876:46;53924:7;53836:10;:96::i;:::-;53934:1;53828:108;;;;;;;53795:153;37581:12;53974:18;;:38;53970:153;;54037:70;54042:22;54066:40;54037:4;:70::i;53970:153::-;54135:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54135:32:0;-1:-1:-1;;;;;54211:24:0;;;;;;:14;:24;;;;;:38;;;54190:18;;;:59;54310:37;54226:8;54310:27;:37::i;:::-;54287:19;;;54272:75;;;54273:12;;;54272:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;54378:18:0;;-1:-1:-1;54362:4:0;:12;;;:34;;;;;;;;:::i;:::-;;54358:192;;54421:113;54432:16;54450:63;54520:4;:12;;;54515:18;;;;;;;;:::i;54421:113::-;54536:1;54413:125;;;;;;;;54358:192;-1:-1:-1;;54576:11:0;:29;54572:163;;;54641:19;;;;54622:16;;;:38;54572:163;;;54693:16;;;:30;;;54572:163;54814:37;54827:5;54834:4;:16;;;54814:12;:37::i;:::-;54789:22;;;:62;;;54941:19;;;;:44;;54789:62;54941:44;:::i;:::-;54916:22;;;:69;55034:22;;;;55019:12;;:37;;55034:22;55019:37;:::i;:::-;54996:20;;;:60;;;55116:22;;;;;;-1:-1:-1;;;;;55079:24:0;;;;;;;:14;:24;;;;;;;;;:59;;;55190:11;;55149:38;;;;:52;;;;55227:20;;55212:12;:35;;;55304:22;;;;55328;;55275:98;;12442:15:1;;;12424:34;;12474:18;;;12467:43;;;;12526:18;;;12519:34;;;;12584:2;12569:18;;12562:34;12627:3;12612:19;;12605:35;;;;55275:98:0;;12358:19:1;55275:98:0;;;;;;;55448:22;;;55431:14;;55448:22;;-1:-1:-1;53566:1913:0;-1:-1:-1;;;;;53566:1913:0:o;14325:515::-;14386:9;14397:10;-1:-1:-1;;;;;;;;;;;;;;14397:10:0;14421:14;14437:20;14461:22;14469:3;90:4;14461:7;:22::i;:::-;14420:63;;-1:-1:-1;14420:63:0;-1:-1:-1;14506:18:0;14498:4;:26;;;;;;;;:::i;:::-;;14494:92;;-1:-1:-1;14555:18:0;;;;;;;;;-1:-1:-1;14555:18:0;;14549:4;;-1:-1:-1;14555:18:0;-1:-1:-1;14541:33:0;;14494:92;14599:14;14615:13;14632:31;14640:15;14657:5;14632:7;:31::i;:::-;14598:65;;-1:-1:-1;14598:65:0;-1:-1:-1;14686:18:0;14678:4;:26;;;;;;;;:::i;:::-;;14674:92;;14729:4;14735:18;;;;;;;;14750:1;14735:18;;;14721:33;;;;;;;;;;14674:92;14806:25;;;;;;;;;;;;-1:-1:-1;;14806:25:0;;-1:-1:-1;14325:515:0;-1:-1:-1;;;;;;14325:515:0:o;44618:1731::-;44736:11;;:58;;-1:-1:-1;;;44736:58:0;;44688:4;;;;;;-1:-1:-1;;;;;44736:11:0;;:23;;:58;;44768:4;;44775:6;;44783:10;;44736:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44721:73;-1:-1:-1;44809:12:0;;44805:145;;44846:88;44857:27;44886:38;44926:7;44846:10;:88::i;:::-;44936:1;44838:100;;;;;;;44805:145;37581:12;44974:18;;:38;44970:145;;45037:62;45042:22;45066:32;45037:4;:62::i;44970:145::-;45125:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45125:25:0;45207:28;:26;:28::i;:::-;45178:25;;;45163:72;;;45164:12;;;45163:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;45266:18:0;;-1:-1:-1;45250:4:0;:12;;;:34;;;;;;;;:::i;:::-;;45246:171;;45309:92;45320:16;45338:42;45387:4;:12;;;45382:18;;;;;;;;:::i;45309:92::-;45403:1;45301:104;;;;;;;;45246:171;45485:10;45530:31;45485:10;45550;45530:12;:31::i;:::-;45506:21;;;:55;;;45664:42;;;;;;;;45679:25;;;;45664:42;;45618:89;;45506:55;45618:22;:89::i;:::-;45599:15;;;45584:123;;;45585:12;;;45584:123;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;45742:18:0;;-1:-1:-1;45726:4:0;:12;;;:34;;;;;;;;:::i;:::-;;45718:79;;;;-1:-1:-1;;;45718:79:0;;23612:2:1;45718:79:0;;;23594:21:1;;;23631:18;;;23624:30;23690:34;23670:18;;;23663:62;23742:18;;45718:79:0;23584:182:1;45718:79:0;45904:4;:15;;;45890:11;;:29;;;;:::i;:::-;45868:19;;;:51;45978:15;;;;-1:-1:-1;;;;;45954:21:0;;;;;;:13;:21;;;;;;:39;;45978:15;45954:39;:::i;:::-;45930:21;;;:63;;;46018:19;;;;;46004:11;:33;-1:-1:-1;;;;;46048:21:0;;;;;;;:13;:21;;;;;;;;;:45;;;;46141:21;;;;46164:15;;;;;46121:59;;9594:15:1;;;9576:34;;9626:18;;;9619:43;;;;9678:18;;;9671:34;9721:18;;9714:34;;;;46121:59:0;;9510:19:1;46121:59:0;;;;;;;46220:6;-1:-1:-1;;;;;46196:48:0;46213:4;-1:-1:-1;;;;;46196:48:0;-1:-1:-1;;;;;;;;;;;46228:4:0;:15;;;46196:48;;;;25037:25:1;;25025:2;25010:18;;24992:76;46196:48:0;;;;;;;;-1:-1:-1;46319:21:0;;;46302:14;;46319:21;;-1:-1:-1;44618:1731:0;-1:-1:-1;;;;44618:1731:0:o;342:122::-;433:12;;399:4;;433:23;;90:4;;433:23;:::i;63618:814::-;63679:4;;;;37581:12;63791:18;;:38;63787:163;;63854:66;63859:22;63883:36;63854:4;:66::i;:::-;63846:92;63922:15;;-1:-1:-1;63618:814:0;-1:-1:-1;;;63618:814:0:o;63787:163::-;64024:35;64037:10;64049:9;64024:12;:35::i;:::-;64006:53;;64107:15;64091:13;;:31;;;;:::i;:::-;64072:50;;64173:13;;64153:16;:33;;64145:67;;;;-1:-1:-1;;;64145:67:0;;24743:2:1;64145:67:0;;;24725:21:1;24782:2;24762:18;;;24755:30;-1:-1:-1;;;24801:18:1;;;24794:51;24862:18;;64145:67:0;24715:171:1;64145:67:0;64235:13;:32;;;64295:60;;;64309:10;7707:51:1;;7789:2;7774:18;;7767:34;;;7817:18;;;7810:34;;;64295:60:0;;7695:2:1;7680:18;64295:60:0;;;;;;;64391:14;64386:20;;71821:737;71974:10;;71996:26;;-1:-1:-1;;;71996:26:0;;-1:-1:-1;;;;;7410:32:1;;;71996:26:0;;;7392:51:1;7459:18;;;7452:34;;;71974:10:0;;;;;;71996:14;;7365:18:1;;71996:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72035:12;72089:16;72128:1;72123:98;;;;72244:2;72239:144;;;;72463:1;72460;72453:12;72123:98;-1:-1:-1;;72186:6:0;-1:-1:-1;72123:98:0;;72239:144;72312:2;72309:1;72306;72291:24;72354:1;72348:8;72337:19;;72082:402;;72513:7;72505:45;;;;-1:-1:-1;;;72505:45:0;;19217:2:1;72505:45:0;;;19199:21:1;19256:2;19236:18;;;19229:30;19295:27;19275:18;;;19268:55;19340:18;;72505:45:0;19189:175:1;72505:45:0;71903:655;;71821:737;;:::o;47360:2739::-;47467:4;47492:19;;;:42;;-1:-1:-1;47515:19:0;;47492:42;47484:107;;;;-1:-1:-1;;;47484:107:0;;23973:2:1;47484:107:0;;;23955:21:1;24012:2;23992:18;;;23985:30;24051:34;24031:18;;;24024:62;-1:-1:-1;;;24102:18:1;;;24095:50;24162:19;;47484:107:0;23945:242:1;47484:107:0;47604:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47604:27:0;47698:28;:26;:28::i;:::-;47669:25;;;47654:72;;;47655:12;;;47654:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;47757:18:0;;-1:-1:-1;47741:4:0;:12;;;:34;;;;;;;;:::i;:::-;;47737:168;;47799:94;47810:16;47828:44;47879:4;:12;;;47874:18;;;;;;;;:::i;47799:94::-;47792:101;;;;;47737:168;47931:18;;47927:845;;47980:17;;;:34;;;48085:42;;;;;;;;48100:25;;;;48085:42;;48067:77;;48000:14;48067:17;:77::i;:::-;48046:17;;;48031:113;;;48032:12;;;48031:113;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48179:18:0;;-1:-1:-1;48163:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48159:185;;48225:103;48236:16;48254:53;48314:4;:12;;;48309:18;;;;;;;;:::i;48159:185::-;47927:845;;;48428:82;48451:14;48467:42;;;;;;;;48482:4;:25;;;48467:42;;;48428:22;:82::i;:::-;48407:17;;;48392:118;;;48393:12;;;48392:118;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48545:18:0;;-1:-1:-1;48529:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48525:185;;48591:103;48602:16;48620:53;48680:4;:12;;;48675:18;;;;;;;;:::i;48525:185::-;48726:17;;;:34;;;47927:845;48809:11;;48860:17;;;;48809:69;;-1:-1:-1;;;48809:69:0;;48794:12;;-1:-1:-1;;;;;48809:11:0;;:25;;:69;;48843:4;;48850:8;;48860:17;48809:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48794:84;-1:-1:-1;48893:12:0;;48889:142;;48929:90;48940:27;48969:40;49011:7;48929:10;:90::i;:::-;48922:97;;;;;;48889:142;37581:12;49057:18;;:38;49053:142;;49119:64;49124:22;49148:34;49119:4;:64::i;49053:142::-;49335:4;:17;;;49321:11;;:31;;;;:::i;:::-;49299:19;;;:53;49413:17;;;;-1:-1:-1;;;;;49387:23:0;;;;;;:13;:23;;;;;;:43;;49413:17;49387:43;:::i;:::-;49363:21;;;:67;49474:17;;;;49457:14;:12;:14::i;:::-;:34;49453:155;;;49515:81;49520:29;49551:44;49515:4;:81::i;49453:155::-;49648:19;;;;49634:11;:33;49704:21;;;;-1:-1:-1;;;;;49678:23:0;;;;;;:13;:23;;;;;:47;49773:17;;;;49749:42;;49692:8;;49749:13;:42::i;:::-;49846:4;-1:-1:-1;;;;;49819:52:0;49828:8;-1:-1:-1;;;;;49819:52:0;-1:-1:-1;;;;;;;;;;;49853:4:0;:17;;;49819:52;;;;25037:25:1;;25025:2;25010:18;;24992:76;49819:52:0;;;;;;;;49904:17;;;;49923;;;;;49887:54;;;-1:-1:-1;;;;;7725:32:1;;7707:51;;7789:2;7774:18;;7767:34;;;;7817:18;;7810:34;49887:54:0;;7680:18:1;49887:54:0;;;;;;;49964:11;;50014:17;;;;50033;;;;49964:87;;-1:-1:-1;;;49964:87:0;;49997:4;49964:87;;;9576:34:1;-1:-1:-1;;;;;9646:15:1;;;9626:18;;;9619:43;9678:18;;;9671:34;;;;9721:18;;;9714:34;;;;49964:11:0;;;:24;;9510:19:1;;49964:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50076:14:0;;-1:-1:-1;50071:20:0;;-1:-1:-1;;50071:20:0;;50064:27;47360:2739;-1:-1:-1;;;;;;47360:2739:0:o;5959:343::-;6015:9;;6047:6;6043:69;;-1:-1:-1;6078:18:0;;-1:-1:-1;6078:18:0;6070:30;;6043:69;6124:6;6133:5;6137:1;6133;:5;:::i;:::-;6124:14;-1:-1:-1;6164:1:0;6155:5;6159:1;6124:14;6155:5;:::i;:::-;:10;6151:144;;6190:26;6218:1;6182:38;;;;;;;6151:144;6261:18;;-1:-1:-1;6281:1:0;-1:-1:-1;6253:30:0;;6316:215;6372:9;;6404:6;6400:77;;-1:-1:-1;6435:26:0;;-1:-1:-1;6463:1:0;6427:38;;6400:77;6497:18;6517:5;6521:1;6517;:5;:::i;:::-;6489:34;;;;6316:215;;;;;:::o;50644:1815::-;50728:4;50753:10;50767:9;50753:23;50745:54;;;;-1:-1:-1;;;50745:54:0;;17347:2:1;50745:54:0;;;17329:21:1;17386:2;17366:18;;;17359:30;-1:-1:-1;;;17405:18:1;;;17398:48;17463:18;;50745:54:0;17319:168:1;50745:54:0;50835:11;;:64;;-1:-1:-1;;;50835:64:0;;50820:12;;-1:-1:-1;;;;;50835:11:0;;:25;;:64;;50869:4;;50876:8;;50886:12;;50835:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50820:79;-1:-1:-1;50914:12:0;;50910:142;;50950:90;50961:27;50990:40;51032:7;50950:10;:90::i;:::-;50943:97;;;;;50910:142;37581:12;51078:18;;:38;51074:142;;51140:64;51145:22;51169:34;51140:4;:64::i;51074:142::-;51259:12;51242:14;:12;:14::i;:::-;:29;51238:143;;;51295:74;51300:29;51331:37;51295:4;:74::i;51238:143::-;51393:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51393:27:0;51431:13;51455:24;51540:37;51568:8;51540:27;:37::i;:::-;51517:19;;;51502:75;;;51503:4;51502:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;51608:18:0;;-1:-1:-1;51592:12:0;;:34;;;;;;;;:::i;:::-;;51588:181;;51650:107;51661:16;51679:57;51743:4;:12;;;51738:18;;;;;;;;:::i;51650:107::-;51643:114;;;;;;;;51588:181;51910:12;51888:4;:19;;;:34;;;;:::i;:::-;51863:22;;;:59;51956:12;;:27;;51971:12;;51956:27;:::i;:::-;51933:20;;;:50;;;52034:22;;;;;-1:-1:-1;;;;;51997:24:0;;;;;;:14;:24;;;;;;:59;;;52108:11;;52067:38;;;;:52;52191:20;52176:12;:35;52226:37;52012:8;52250:12;52226:13;:37::i;:::-;52334:22;;;;;52358:20;;;;;52303:76;;-1:-1:-1;;;;;8112:32:1;;8094:51;;8176:2;8161:18;;8154:34;;;8204:18;;;8197:34;;;;8247:18;;8240:34;52303:76:0;;8081:3:1;8066:19;52303:76:0;;;;;;;52436:14;52431:20;52424:27;50644:1815;-1:-1:-1;;;;;;;50644:1815:0:o;56200:2674::-;56386:11;;:111;;-1:-1:-1;;;56386:111:0;;56429:4;56386:111;;;10056:34:1;-1:-1:-1;;;;;10126:15:1;;;10106:18;;;10099:43;10178:15;;;10158:18;;;10151:43;10230:15;;;10210:18;;;10203:43;10262:19;;;10255:35;;;56338:4:0;;;;;;56386:11;;;;:34;;9990:19:1;;56386:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56371:126;-1:-1:-1;56512:12:0;;56508:150;;56549:93;56560:27;56589:43;56634:7;56549:10;:93::i;:::-;56644:1;56541:105;;;;;;;56508:150;37581:12;56684:18;;:38;56680:150;;56747:67;56752:22;56776:37;56747:4;:67::i;56680:150::-;37581:12;56856:16;-1:-1:-1;;;;;56856:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;56852:180;;56938:78;56943:22;56967:48;56938:4;:78::i;56852:180::-;57070:10;-1:-1:-1;;;;;57058:22:0;:8;-1:-1:-1;;;;;57058:22:0;;57054:145;;;57105:78;57110:26;57138:44;57105:4;:78::i;57054:145::-;57225:16;57221:147;;57266:86;57271:36;57309:42;57266:4;:86::i;57221:147::-;-1:-1:-1;;57394:11:0;:29;57390:164;;;57448:90;57453:36;57491:46;57448:4;:90::i;57390:164::-;57579:21;57602:22;57628:51;57645:10;57657:8;57667:11;57628:16;:51::i;:::-;57578:101;;-1:-1:-1;57578:101:0;-1:-1:-1;57694:40:0;;57690:163;;57759:78;57770:16;57764:23;;;;;;;;:::i;:::-;57789:47;57759:4;:78::i;:::-;57839:1;57751:90;;;;;;;;;57690:163;57951:11;;:102;;-1:-1:-1;;;57951:102:0;;57908:21;;;;-1:-1:-1;;;;;57951:11:0;;;;:41;;:102;;58001:4;;58016:16;;58035:17;;57951:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57907:146;;-1:-1:-1;57907:146:0;-1:-1:-1;58072:40:0;;58064:82;;;;-1:-1:-1;;;58064:82:0;;19571:2:1;58064:82:0;;;19553:21:1;19610:2;19590:18;;;19583:30;19649:31;19629:18;;;19622:59;19698:18;;58064:82:0;19543:179:1;58064:82:0;58177:36;;-1:-1:-1;;;58177:36:0;;-1:-1:-1;;;;;7166:32:1;;;58177:36:0;;;7148:51:1;58217:11:0;;58177:26;;;;;;7121:18:1;;58177:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;58169:88;;;;-1:-1:-1;;;58169:88:0;;22857:2:1;58169:88:0;;;22839:21:1;22896:2;22876:18;;;22869:30;22935:26;22915:18;;;22908:54;22979:18;;58169:88:0;22829:174:1;58169:88:0;58280:15;-1:-1:-1;;;;;58310:42:0;;58347:4;58310:42;58306:254;;;58382:63;58404:4;58411:10;58423:8;58433:11;58382:13;:63::i;:::-;58369:76;;58306:254;;;58491:57;;-1:-1:-1;;;58491:57:0;;-1:-1:-1;;;;;58491:22:0;;;;;:57;;58514:10;;58526:8;;58536:11;;58491:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58478:70;;58306:254;58590:34;;58582:67;;;;-1:-1:-1;;;58582:67:0;;24394:2:1;58582:67:0;;;24376:21:1;24433:2;24413:18;;;24406:30;-1:-1:-1;;;24452:18:1;;;24445:50;24512:18;;58582:67:0;24366:170:1;58582:67:0;58677:96;;;-1:-1:-1;;;;;11457:15:1;;;11439:34;;11509:15;;;11504:2;11489:18;;11482:43;11541:18;;;11534:34;;;11604:15;;11599:2;11584:18;;11577:43;11651:3;11636:19;;11629:35;;;58677:96:0;;;;;;;11388:3:1;58677:96:0;;;58831:14;58818:48;-1:-1:-1;58848:17:0;;-1:-1:-1;;;;;;56200:2674:0;;;;;;;;:::o;70734:1073::-;70895:10;;70938:51;;-1:-1:-1;;;70938:51:0;;70983:4;70938:51;;;7148::1;70818:4:0;;-1:-1:-1;;;;;70895:10:0;;70818:4;;70895:10;;70938:36;;7121:18:1;;70938:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71000:47;;-1:-1:-1;;;71000:47:0;;70917:72;;-1:-1:-1;;;;;;71000:18:0;;;;;:47;;71019:4;;71033;;71040:6;;71000:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71060:12;71114:16;71153:1;71148:99;;;;71270:2;71265:145;;;;71491:1;71488;71481:12;71148:99;-1:-1:-1;;71212:6:0;-1:-1:-1;71148:99:0;;71265:145;71339:2;71336:1;71333;71318:24;71381:1;71375:8;71364:19;;71107:405;;71541:7;71533:44;;;;-1:-1:-1;;;71533:44:0;;16634:2:1;71533:44:0;;;16616:21:1;16673:2;16653:18;;;16646:30;16712:26;16692:18;;;16685:54;16756:18;;71533:44:0;16606:174:1;71533:44:0;71635:10;;71620:51;;-1:-1:-1;;;71620:51:0;;71665:4;71620:51;;;7148::1;71600:17:0;;-1:-1:-1;;;;;71635:10:0;;71620:36;;7121:18:1;;71620:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71600:71;;71706:13;71690:12;:29;;71682:68;;;;-1:-1:-1;;;71682:68:0;;18862:2:1;71682:68:0;;;18844:21:1;18901:2;18881:18;;;18874:30;18940:28;18920:18;;;18913:56;18986:18;;71682:68:0;18834:176:1;71682:68:0;71768:28;71783:13;71768:12;:28;:::i;17100:337::-;17188:9;17199:4;17217:13;17232:19;17255:31;17270:6;17278:7;16819:9;16830:10;-1:-1:-1;;;;;;;;;;;;;;16830:10:0;16864:14;16880;16898:25;90:4;16916:6;16898:7;:25::i;:::-;16863:60;;-1:-1:-1;16863:60:0;-1:-1:-1;16946:18:0;16938:4;:26;;;;;;;;:::i;:::-;;16934:92;;-1:-1:-1;16995:18:0;;;;;;;;;-1:-1:-1;16995:18:0;;16989:4;;-1:-1:-1;16995:18:0;-1:-1:-1;16981:33:0;;16934:92;17043:35;17050:9;17061:7;:16;;;17043:6;:35::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:719:1;57:5;110:3;103:4;95:6;91:17;87:27;77:2;;128:1;125;118:12;77:2;164:6;151:20;190:18;227:2;223;220:10;217:2;;;233:18;;:::i;:::-;308:2;302:9;276:2;362:13;;-1:-1:-1;;358:22:1;;;382:2;354:31;350:40;338:53;;;406:18;;;426:22;;;403:46;400:2;;;452:18;;:::i;:::-;492:10;488:2;481:22;527:2;519:6;512:18;573:3;566:4;561:2;553:6;549:15;545:26;542:35;539:2;;;590:1;587;580:12;539:2;654;647:4;639:6;635:17;628:4;620:6;616:17;603:54;701:1;694:4;689:2;681:6;677:15;673:26;666:37;721:6;712:15;;;;;;67:666;;;;:::o;738:156::-;804:20;;864:4;853:16;;843:27;;833:2;;884:1;881;874:12;833:2;785:109;;;:::o;899:247::-;958:6;1011:2;999:9;990:7;986:23;982:32;979:2;;;1027:1;1024;1017:12;979:2;1066:9;1053:23;1085:31;1110:5;1085:31;:::i;1411:388::-;1479:6;1487;1540:2;1528:9;1519:7;1515:23;1511:32;1508:2;;;1556:1;1553;1546:12;1508:2;1595:9;1582:23;1614:31;1639:5;1614:31;:::i;:::-;1664:5;-1:-1:-1;1721:2:1;1706:18;;1693:32;1734:33;1693:32;1734:33;:::i;:::-;1786:7;1776:17;;;1498:301;;;;;:::o;1804:456::-;1881:6;1889;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:2;;;1966:1;1963;1956:12;1918:2;2005:9;1992:23;2024:31;2049:5;2024:31;:::i;:::-;2074:5;-1:-1:-1;2131:2:1;2116:18;;2103:32;2144:33;2103:32;2144:33;:::i;:::-;1908:352;;2196:7;;-1:-1:-1;;;2250:2:1;2235:18;;;;2222:32;;1908:352::o;2265:1157::-;2451:6;2459;2467;2475;2483;2491;2499;2552:3;2540:9;2531:7;2527:23;2523:33;2520:2;;;2569:1;2566;2559:12;2520:2;2608:9;2595:23;2627:31;2652:5;2627:31;:::i;:::-;2677:5;-1:-1:-1;2734:2:1;2719:18;;2706:32;2747:33;2706:32;2747:33;:::i;:::-;2799:7;-1:-1:-1;2858:2:1;2843:18;;2830:32;2871:33;2830:32;2871:33;:::i;:::-;2923:7;-1:-1:-1;2977:2:1;2962:18;;2949:32;;-1:-1:-1;3032:3:1;3017:19;;3004:33;3056:18;3086:14;;;3083:2;;;3113:1;3110;3103:12;3083:2;3136:50;3178:7;3169:6;3158:9;3154:22;3136:50;:::i;:::-;3126:60;;3239:3;3228:9;3224:19;3211:33;3195:49;;3269:2;3259:8;3256:16;3253:2;;;3285:1;3282;3275:12;3253:2;;3308:52;3352:7;3341:8;3330:9;3326:24;3308:52;:::i;:::-;3298:62;;;3379:37;3411:3;3400:9;3396:19;3379:37;:::i;:::-;3369:47;;2510:912;;;;;;;;;;:::o;3427:315::-;3495:6;3503;3556:2;3544:9;3535:7;3531:23;3527:32;3524:2;;;3572:1;3569;3562:12;3524:2;3611:9;3598:23;3630:31;3655:5;3630:31;:::i;:::-;3680:5;3732:2;3717:18;;;;3704:32;;-1:-1:-1;;;3514:228:1:o;3747:480::-;3848:6;3856;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:2;;;3933:1;3930;3923:12;3885:2;3972:9;3959:23;3991:31;4016:5;3991:31;:::i;:::-;4041:5;-1:-1:-1;4093:2:1;4078:18;;4065:32;;-1:-1:-1;4149:2:1;4134:18;;4121:32;4162:33;4121:32;4162:33;:::i;:::-;4214:7;4204:17;;;3875:352;;;;;:::o;4232:277::-;4299:6;4352:2;4340:9;4331:7;4327:23;4323:32;4320:2;;;4368:1;4365;4358:12;4320:2;4400:9;4394:16;4453:5;4446:13;4439:21;4432:5;4429:32;4419:2;;4475:1;4472;4465:12;4795:1015;4972:6;4980;4988;4996;5004;5012;5065:3;5053:9;5044:7;5040:23;5036:33;5033:2;;;5082:1;5079;5072:12;5033:2;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5247:2:1;5232:18;;5219:32;5260:33;5219:32;5260:33;:::i;:::-;5312:7;-1:-1:-1;5366:2:1;5351:18;;5338:32;;-1:-1:-1;5421:2:1;5406:18;;5393:32;5444:18;5474:14;;;5471:2;;;5501:1;5498;5491:12;5471:2;5524:50;5566:7;5557:6;5546:9;5542:22;5524:50;:::i;:::-;5514:60;;5627:3;5616:9;5612:19;5599:33;5583:49;;5657:2;5647:8;5644:16;5641:2;;;5673:1;5670;5663:12;5641:2;;5696:52;5740:7;5729:8;5718:9;5714:24;5696:52;:::i;:::-;5686:62;;;5767:37;5799:3;5788:9;5784:19;5767:37;:::i;:::-;5757:47;;5023:787;;;;;;;;:::o;6378:180::-;6437:6;6490:2;6478:9;6469:7;6465:23;6461:32;6458:2;;;6506:1;6503;6496:12;6458:2;-1:-1:-1;6529:23:1;;6448:110;-1:-1:-1;6448:110:1:o;6563:184::-;6633:6;6686:2;6674:9;6665:7;6661:23;6657:32;6654:2;;;6702:1;6699;6692:12;6654:2;-1:-1:-1;6725:16:1;;6644:103;-1:-1:-1;6644:103:1:o;6752:245::-;6831:6;6839;6892:2;6880:9;6871:7;6867:23;6863:32;6860:2;;;6908:1;6905;6898:12;6860:2;-1:-1:-1;;6931:16:1;;6987:2;6972:18;;;6966:25;6931:16;;6966:25;;-1:-1:-1;6850:147:1:o;8911:383::-;-1:-1:-1;;;;;9177:15:1;;;9159:34;;9229:15;;;;9224:2;9209:18;;9202:43;9276:2;9261:18;;9254:34;;;;9109:2;9094:18;;9076:218::o;14671:597::-;14783:4;14812:2;14841;14830:9;14823:21;14873:6;14867:13;14916:6;14911:2;14900:9;14896:18;14889:34;14941:1;14951:140;14965:6;14962:1;14959:13;14951:140;;;15060:14;;;15056:23;;15050:30;15026:17;;;15045:2;15022:26;15015:66;14980:10;;14951:140;;;15109:6;15106:1;15103:13;15100:2;;;15179:1;15174:2;15165:6;15154:9;15150:22;15146:31;15139:42;15100:2;-1:-1:-1;15252:2:1;15231:15;-1:-1:-1;;15227:29:1;15212:45;;;;15259:2;15208:54;;14792:476;-1:-1:-1;;;14792:476:1:o;15676:346::-;15878:2;15860:21;;;15917:2;15897:18;;;15890:30;-1:-1:-1;;;15951:2:1;15936:18;;15929:52;16013:2;15998:18;;15850:172::o;21604:334::-;21806:2;21788:21;;;21845:2;21825:18;;;21818:30;-1:-1:-1;;;21879:2:1;21864:18;;21857:40;21929:2;21914:18;;21778:160::o;26567:128::-;26607:3;26638:1;26634:6;26631:1;26628:13;26625:2;;;26644:18;;:::i;:::-;-1:-1:-1;26680:9:1;;26615:80::o;26700:120::-;26740:1;26766;26756:2;;26771:18;;:::i;:::-;-1:-1:-1;26805:9:1;;26746:74::o;26825:168::-;26865:7;26931:1;26927;26923:6;26919:14;26916:1;26913:21;26908:1;26901:9;26894:17;26890:45;26887:2;;;26938:18;;:::i;:::-;-1:-1:-1;26978:9:1;;26877:116::o;26998:125::-;27038:4;27066:1;27063;27060:8;27057:2;;;27071:18;;:::i;:::-;-1:-1:-1;27108:9:1;;27047:76::o;27128:380::-;27207:1;27203:12;;;;27250;;;27271:2;;27325:4;27317:6;27313:17;27303:27;;27271:2;27378;27370:6;27367:14;27347:18;27344:38;27341:2;;;27424:10;27419:3;27415:20;27412:1;27405:31;27459:4;27456:1;27449:15;27487:4;27484:1;27477:15;27341:2;;27183:325;;;:::o;27513:135::-;27552:3;-1:-1:-1;;27573:17:1;;27570:2;;;27593:18;;:::i;:::-;-1:-1:-1;27640:1:1;27629:13;;27560:88::o;27653:112::-;27685:1;27711;27701:2;;27716:18;;:::i;:::-;-1:-1:-1;27750:9:1;;27691:74::o;27770:127::-;27831:10;27826:3;27822:20;27819:1;27812:31;27862:4;27859:1;27852:15;27886:4;27883:1;27876:15;27902:127;27963:10;27958:3;27954:20;27951:1;27944:31;27994:4;27991:1;27984:15;28018:4;28015:1;28008:15;28034:127;28095:10;28090:3;28086:20;28083:1;28076:31;28126:4;28123:1;28116:15;28150:4;28147:1;28140:15;28166:127;28227:10;28222:3;28218:20;28215:1;28208:31;28258:4;28255:1;28248:15;28282:4;28279:1;28272:15;28298:127;28359:10;28354:3;28350:20;28347:1;28340:31;28390:4;28387:1;28380:15;28414:4;28411:1;28404:15;28430:131;-1:-1:-1;;;;;28505:31:1;;28495:42;;28485:2;;28551:1;28548;28541:12;28485:2;28475:86;:::o
Swarm Source
ipfs://0a5495c8ff9c90708ed5a6572006ba639f53ca959030d8021949a95fe036f9cd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 100.00% | $1 | 5.8301 | $5.83 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.