More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18310773 | 1 hr ago | 0 ETH | ||||
18310773 | 1 hr ago | 0 ETH | ||||
18310773 | 1 hr ago | 0.06939212 ETH | ||||
18310773 | 1 hr ago | 0 ETH | ||||
18304081 | 5 hrs ago | 0 ETH | ||||
18304081 | 5 hrs ago | 0.09713798 ETH | ||||
18304081 | 5 hrs ago | 0 ETH | ||||
18304081 | 5 hrs ago | 0 ETH | ||||
18304081 | 5 hrs ago | 0 ETH | ||||
18304081 | 5 hrs ago | 0 ETH | ||||
18303987 | 5 hrs ago | 0 ETH | ||||
18303987 | 5 hrs ago | 0.06457865 ETH | ||||
18303987 | 5 hrs ago | 0 ETH | ||||
18303987 | 5 hrs ago | 0 ETH | ||||
18303987 | 5 hrs ago | 0 ETH | ||||
18303987 | 5 hrs ago | 0 ETH | ||||
18303923 | 5 hrs ago | 0 ETH | ||||
18303923 | 5 hrs ago | 0.10804133 ETH | ||||
18303923 | 5 hrs ago | 0 ETH | ||||
18303923 | 5 hrs ago | 0 ETH | ||||
18303923 | 5 hrs ago | 0 ETH | ||||
18303923 | 5 hrs ago | 0 ETH | ||||
18303897 | 5 hrs ago | 0 ETH | ||||
18303897 | 5 hrs ago | 0.03923851 ETH | ||||
18303897 | 5 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
LToken
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2023-07-19 */ // Sources flattened with hardhat v2.11.1 https://hardhat.org // File contracts/interfaces/IWETH.sol // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.6.12; interface IWETH { function approve(address spender, uint256 value) external returns (bool); function transfer(address recipient, uint256 amount) external returns (bool); function deposit() external payable; function withdraw(uint256 amount) external; } // File contracts/library/SafeToken.sol pragma solidity ^0.6.12; interface ERC20Interface { function balanceOf(address user) external view returns (uint256); } library SafeToken { function myBalance(address token) internal view returns (uint256) { return ERC20Interface(token).balanceOf(address(this)); } function balanceOf(address token, address user) internal view returns (uint256) { return ERC20Interface(token).balanceOf(user); } function safeApprove(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeApprove"); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransfer"); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransferFrom"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "!safeTransferETH"); } } // File contracts/library/Constant.sol pragma solidity ^0.6.12; library Constant { uint256 public constant CLOSE_FACTOR_MIN = 5e16; uint256 public constant CLOSE_FACTOR_MAX = 9e17; uint256 public constant COLLATERAL_FACTOR_MAX = 9e17; uint256 public constant LIQUIDATION_THRESHOLD_MAX = 9e17; uint256 public constant LIQUIDATION_BONUS_MAX = 5e17; enum EcoScorePreviewOption { LOCK, CLAIM, EXTEND, LOCK_MORE } enum LoanState { None, Active, Auction, Repaid, Defaulted } struct MarketInfo { bool isListed; uint256 supplyCap; uint256 borrowCap; uint256 collateralFactor; } struct BorrowInfo { uint256 borrow; uint256 interestIndex; } struct LoanData { uint256 loanId; LoanState state; address borrower; address gNft; address nftAsset; uint256 nftTokenId; uint256 borrowAmount; uint256 interestIndex; uint256 bidStartTimestamp; address bidderAddress; uint256 bidPrice; uint256 bidBorrowAmount; uint256 floorPrice; uint256 bidCount; address firstBidderAddress; } struct AccountSnapshot { uint256 gTokenBalance; uint256 borrowBalance; uint256 exchangeRate; } struct AccrueSnapshot { uint256 totalBorrow; uint256 totalReserve; uint256 accInterestIndex; } struct AccrueLoanSnapshot { uint256 totalBorrow; uint256 accInterestIndex; } struct DistributionInfo { uint256 supplySpeed; uint256 borrowSpeed; uint256 totalBoostedSupply; uint256 totalBoostedBorrow; uint256 accPerShareSupply; uint256 accPerShareBorrow; uint256 accruedAt; } struct DistributionAccountInfo { uint256 accuredLAB; // Unclaimed LAB rewards amount uint256 boostedSupply; // effective(boosted) supply balance of user (since last_action) uint256 boostedBorrow; // effective(boosted) borrow balance of user (since last_action) uint256 accPerShareSupply; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action) uint256 accPerShareBorrow; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action) } struct DistributionAPY { uint256 apySupplyLab; uint256 apyBorrowLab; uint256 apyAccountSupplyLab; uint256 apyAccountBorrowLab; } struct RebateCheckpoint { uint256 timestamp; uint256 totalScore; uint256 adminFeeRate; uint256 weeklyLabSpeed; uint256 additionalLabAmount; mapping(address => uint256) marketFees; } struct LockInfo { uint256 timestamp; uint256 amount; uint256 expiry; } } // File contracts/interfaces/IRateModel.sol pragma solidity ^0.6.12; interface IRateModel { function getBorrowRate(uint256 cash, uint256 borrows, uint256 reserves) external view returns (uint256); function getSupplyRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 reserveFactor ) external view returns (uint256); } // File contracts/interfaces/ILendPoolLoan.sol pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface ILendPoolLoan { /* ========== Event ========== */ event LoanCreated( address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, address gNft, uint256 amount ); event LoanUpdated( address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, uint256 amountAdded, uint256 amountTaken ); event LoanRepaid(address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, uint256 amount); event LoanAuctioned( address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, uint256 bidBorrowAmount, address bidder, uint256 price, address previousBidder, uint256 previousPrice, uint256 floorPrice ); event LoanRedeemed( address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, uint256 repayAmount ); event LoanLiquidated( address indexed user, uint256 indexed loanId, address nftAsset, uint256 nftTokenId, uint256 amount ); event AuctionDurationUpdated(uint256 newAuctionDuration); event MinBidFineUpdated(uint256 newMinBidFine); event RedeemFineRateUpdated(uint256 newRedeemFineRate); event RedeemThresholdUpdated(uint256 newRedeemThreshold); event BorrowRateMultiplierUpdated(uint256 borrowRateMultiplier); event AuctionFeeRateUpdated(uint256 auctionFeeRate); function createLoan( address to, address nftAsset, uint256 nftTokenId, address gNft, uint256 amount ) external returns (uint256); function updateLoan(uint256 loanId, uint256 amountAdded, uint256 amountTaken) external; function repayLoan(uint256 loanId, address gNft, uint256 amount) external; function auctionLoan(address bidder, uint256 loanId, uint256 bidPrice, uint256 borrowAmount) external; function redeemLoan(uint256 loanId, uint256 amountTaken) external; function liquidateLoan(address gNft, uint256 loanId, uint256 borrowAmount) external; function initNft(address nftAsset, address gNft) external; function getCollateralLoanId(address nftAsset, uint256 nftTokenId) external view returns (uint256); function getNftCollateralAmount(address nftAsset) external view returns (uint256); function getUserNftCollateralAmount(address user, address nftAsset) external view returns (uint256); function getLoan(uint256 loanId) external view returns (Constant.LoanData memory loanData); function borrowBalanceOf(uint256 loanId) external view returns (uint256); function userBorrowBalance(address user) external view returns (uint256); function marketBorrowBalance(address gNft) external view returns (uint256); function marketAccountBorrowBalance(address gNft, address user) external view returns (uint256); function accrueInterest() external; function totalBorrow() external view returns (uint256); function currentLoanId() external view returns (uint256); function getAccInterestIndex() external view returns (uint256); function auctionDuration() external view returns (uint256); function minBidFine() external view returns (uint256); function redeemFineRate() external view returns (uint256); function redeemThreshold() external view returns (uint256); function auctionFeeRate() external view returns (uint256); function accInterestIndex() external view returns (uint256); } // File contracts/interfaces/IBEP20.sol pragma solidity >=0.4.0; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/interfaces/IValidator.sol pragma solidity ^0.6.12; interface IValidator { function redeemAllowed(address gToken, address redeemer, uint256 redeemAmount) external returns (bool); function borrowAllowed(address gToken, address borrower, uint256 borrowAmount) external returns (bool); function liquidateAllowed( address gTokenBorrowed, address borrower, uint256 repayAmount, uint256 closeFactor ) external returns (bool); function gTokenAmountToSeize( address gTokenBorrowed, address gTokenCollateral, uint256 actualRepayAmount ) external returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount); function getAccountLiquidity( address account ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD); } // File contracts/interfaces/ICore.sol pragma solidity ^0.6.12; interface ICore { /* ========== Event ========== */ event MarketSupply(address user, address gToken, uint256 uAmount); event MarketRedeem(address user, address gToken, uint256 uAmount); event MarketListed(address gToken); event MarketEntered(address gToken, address account); event MarketExited(address gToken, address account); event CloseFactorUpdated(uint256 newCloseFactor); event CollateralFactorUpdated(address gToken, uint256 newCollateralFactor); event LiquidationIncentiveUpdated(uint256 newLiquidationIncentive); event SupplyCapUpdated(address indexed gToken, uint256 newSupplyCap); event BorrowCapUpdated(address indexed gToken, uint256 newBorrowCap); event KeeperUpdated(address newKeeper); event NftCoreUpdated(address newNftCore); event ValidatorUpdated(address newValidator); event LABDistributorUpdated(address newLABDistributor); event RebateDistributorUpdated(address newRebateDistributor); event FlashLoan( address indexed target, address indexed initiator, address indexed asset, uint256 amount, uint256 premium ); function nftCore() external view returns (address); function validator() external view returns (address); function rebateDistributor() external view returns (address); function allMarkets() external view returns (address[] memory); function marketListOf(address account) external view returns (address[] memory); function marketInfoOf(address gToken) external view returns (Constant.MarketInfo memory); function checkMembership(address account, address gToken) external view returns (bool); function accountLiquidityOf( address account ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD); function closeFactor() external view returns (uint256); function liquidationIncentive() external view returns (uint256); function enterMarkets(address[] memory gTokens) external; function exitMarket(address gToken) external; function supply(address gToken, uint256 underlyingAmount) external payable returns (uint256); function redeemToken(address gToken, uint256 gTokenAmount) external returns (uint256 redeemed); function redeemUnderlying(address gToken, uint256 underlyingAmount) external returns (uint256 redeemed); function borrow(address gToken, uint256 amount) external; function nftBorrow(address gToken, address user, uint256 amount) external; function repayBorrow(address gToken, uint256 amount) external payable; function nftRepayBorrow(address gToken, address user, uint256 amount) external payable; function repayBorrowBehalf(address gToken, address borrower, uint256 amount) external payable; function liquidateBorrow( address gTokenBorrowed, address gTokenCollateral, address borrower, uint256 amount ) external payable; function claimLab() external; function claimLab(address market) external; function transferTokens(address spender, address src, address dst, uint256 amount) external; function compoundLab() external; } // File contracts/interfaces/IRebateDistributor.sol pragma solidity ^0.6.12; interface IRebateDistributor { function setKeeper(address _keeper) external; function pause() external; function unpause() external; function updateAdminFeeRate(uint256 newAdminFeeRate) external; function checkpoint() external; function weeklyRebatePool() external view returns (uint256); function weeklyProfitOfVP(uint256 vp) external view returns (uint256); function weeklyProfitOf(address account) external view returns (uint256); function indicativeYearProfit() external view returns (uint256); function accruedRebates(address account) external view returns (uint256, uint256, uint256[] memory); function claimRebates() external returns (uint256, uint256, uint256[] memory); function claimAdminRebates() external returns (uint256, uint256[] memory); function addLABToRebatePool(uint256 amount) external; function addMarketUTokenToRebatePool(address lToken, uint256 uAmount) external payable; } // File contracts/interfaces/ILToken.sol pragma solidity ^0.6.12; interface ILToken { function underlying() external view returns (address); function totalSupply() external view returns (uint256); function accountSnapshot(address account) external view returns (Constant.AccountSnapshot memory); function underlyingBalanceOf(address account) external view returns (uint256); function borrowBalanceOf(address account) external view returns (uint256); function totalBorrow() external view returns (uint256); function _totalBorrow() external view returns (uint256); function totalReserve() external view returns (uint256); function reserveFactor() external view returns (uint256); function lastAccruedTime() external view returns (uint256); function accInterestIndex() external view returns (uint256); function exchangeRate() external view returns (uint256); function getCash() external view returns (uint256); function getRateModel() external view returns (address); function getAccInterestIndex() external view returns (uint256); function accruedAccountSnapshot(address account) external returns (Constant.AccountSnapshot memory); function accruedBorrowBalanceOf(address account) external returns (uint256); function accruedTotalBorrow() external returns (uint256); function accruedExchangeRate() external returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address dst, uint256 amount) external returns (bool); function transferFrom(address src, address dst, uint256 amount) external returns (bool); function supply(address account, uint256 underlyingAmount) external payable returns (uint256); function redeemToken(address account, uint256 gTokenAmount) external returns (uint256); function redeemUnderlying(address account, uint256 underlyingAmount) external returns (uint256); function borrow(address account, uint256 amount) external returns (uint256); function repayBorrow(address account, uint256 amount) external payable returns (uint256); function repayBorrowBehalf(address payer, address borrower, uint256 amount) external payable returns (uint256); function liquidateBorrow( address gTokenCollateral, address liquidator, address borrower, uint256 amount ) external payable returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount); function seize(address liquidator, address borrower, uint256 gTokenAmount) external; function withdrawReserves() external; function transferTokensInternal(address spender, address src, address dst, uint256 amount) external; } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/markets/Market.sol pragma solidity ^0.6.12; abstract contract Market is ILToken, Ownable, ReentrancyGuard { using SafeMath for uint256; /* ========== CONSTANT VARIABLES ========== */ uint256 internal constant RESERVE_FACTOR_MAX = 1e18; uint256 internal constant DUST = 1000; address internal constant ETH = 0x0000000000000000000000000000000000000000; /* ========== STATE VARIABLES ========== */ ICore public core; IRateModel public rateModel; IRebateDistributor public rebateDistributor; address public override underlying; uint256 public override totalSupply; // Total supply of gToken uint256 public override totalReserve; uint256 public override _totalBorrow; mapping(address => uint256) internal accountBalances; mapping(address => Constant.BorrowInfo) internal accountBorrows; uint256 public override reserveFactor; uint256 public override lastAccruedTime; uint256 public override accInterestIndex; /* ========== INITIALIZER ========== */ receive() external payable {} /// @dev Initialization function __GMarket_init() internal { lastAccruedTime = block.timestamp; accInterestIndex = 1e18; } /* ========== MODIFIERS ========== */ /// @dev 아직 처리되지 않은 totalBorrow, totalReserve, accInterestIndex 계산 및 저장 modifier accrue() { if (block.timestamp > lastAccruedTime && address(rateModel) != address(0)) { uint256 borrowRate = rateModel.getBorrowRate(getCashPrior(), _totalBorrow, totalReserve); uint256 interestFactor = borrowRate.mul(block.timestamp.sub(lastAccruedTime)); uint256 pendingInterest = _totalBorrow.mul(interestFactor).div(1e18); _totalBorrow = _totalBorrow.add(pendingInterest); totalReserve = totalReserve.add(pendingInterest.mul(reserveFactor).div(1e18)); accInterestIndex = accInterestIndex.add(interestFactor.mul(accInterestIndex).div(1e18)); lastAccruedTime = block.timestamp; } _; } /// @dev msg.sender 가 core address 인지 검증 modifier onlyCore() { require(msg.sender == address(core), "GToken: only Core Contract"); _; } modifier onlyRebateDistributor() { require(msg.sender == address(rebateDistributor), "GToken: only RebateDistributor"); _; } /* ========== RESTRICTED FUNCTIONS ========== */ /// @notice core address 를 설정 /// @dev ZERO ADDRESS 로 설정할 수 없음 /// 설정 이후에는 다른 주소로 변경할 수 없음 /// @param _core core contract address function setCore(address _core) public onlyOwner { require(_core != address(0), "GMarket: invalid core address"); require(address(core) == address(0), "GMarket: core already set"); core = ICore(_core); } /// @notice underlying asset 의 token 설정 /// @dev ZERO ADDRESS 로 설정할 수 없음 /// 설정 이후에는 다른 주소로 변경할 수 없음 /// @param _underlying Underlying token contract address function setUnderlying(address _underlying) public onlyOwner { require(_underlying != address(0), "GMarket: invalid underlying address"); require(underlying == address(0), "GMarket: set underlying already"); underlying = _underlying; } /// @notice rateModel 설정 /// @param _rateModel 새로운 RateModel contract address function setRateModel(address _rateModel) public accrue onlyOwner { require(_rateModel != address(0), "GMarket: invalid rate model address"); rateModel = IRateModel(_rateModel); } /// @notice reserve factor 변경 /// @dev RESERVE_FACTOR_MAX 를 초과할 수 없음 /// @param _reserveFactor 새로운 reserveFactor 값 function setReserveFactor(uint256 _reserveFactor) public accrue onlyOwner { require(_reserveFactor <= RESERVE_FACTOR_MAX, "GMarket: invalid reserve factor"); reserveFactor = _reserveFactor; } function setRebateDistributor(address _rebateDistributor) public onlyOwner { require(_rebateDistributor != address(0), "GMarket: invalid rebate distributor address"); rebateDistributor = IRebateDistributor(_rebateDistributor); } /* ========== VIEWS ========== */ /// @notice account 의 gToken 에 대한 balance 조회 /// @param account account address function balanceOf(address account) external view override returns (uint256) { return accountBalances[account]; } /// @notice account 의 AccountSnapshot 조회 /// @param account account address function accountSnapshot(address account) external view override returns (Constant.AccountSnapshot memory) { Constant.AccountSnapshot memory snapshot; snapshot.gTokenBalance = accountBalances[account]; snapshot.borrowBalance = borrowBalanceOf(account); snapshot.exchangeRate = exchangeRate(); return snapshot; } /// @notice account 의 supply 된 underlying token 의 amount 조회 /// @dev 원금에 붙은 이자를 포함 /// @param account account address function underlyingBalanceOf(address account) external view override returns (uint256) { return accountBalances[account].mul(exchangeRate()).div(1e18); } /// @notice 계정의 borrow amount 조회 /// @dev 원금에 붙은 이자를 포함 function borrowBalanceOf(address account) public view override returns (uint256) { Constant.AccrueSnapshot memory snapshot = pendingAccrueSnapshot(); Constant.BorrowInfo storage info = accountBorrows[account]; if (info.borrow == 0) return 0; return info.borrow.mul(snapshot.accInterestIndex).div(info.interestIndex); } /// @notice totalBorrow 조회 function totalBorrow() public view override returns (uint256) { Constant.AccrueSnapshot memory snapshot = pendingAccrueSnapshot(); return snapshot.totalBorrow; } /// @notice gToken 과 underlying token 의 교환비율 조회 /// @dev Exchange rate = (Total pure supplies / Total gToken supplies) function exchangeRate() public view override returns (uint256) { if (totalSupply == 0) return 1e18; Constant.AccrueSnapshot memory snapshot = pendingAccrueSnapshot(); return getCashPrior().add(snapshot.totalBorrow).sub(snapshot.totalReserve).mul(1e18).div(totalSupply); } /// @notice contract 가 가지고 있는 underlying token amount 조회 /// @dev underlying token 이 ETH 인 경우 msg.value 값을 빼서 계산함 function getCash() public view override returns (uint256) { return getCashPrior(); } function getRateModel() external view override returns (address) { return address(rateModel); } /// @notice accInterestIndex 조회 function getAccInterestIndex() public view override returns (uint256) { Constant.AccrueSnapshot memory snapshot = pendingAccrueSnapshot(); return snapshot.accInterestIndex; } /* ========== MUTATIVE FUNCTIONS ========== */ /// @notice View account snapshot after accure mutation function accruedAccountSnapshot(address account) external override accrue returns (Constant.AccountSnapshot memory) { Constant.AccountSnapshot memory snapshot; Constant.BorrowInfo storage info = accountBorrows[account]; if (info.interestIndex != 0) { info.borrow = info.borrow.mul(accInterestIndex).div(info.interestIndex); info.interestIndex = accInterestIndex; } snapshot.gTokenBalance = accountBalances[account]; snapshot.borrowBalance = info.borrow; snapshot.exchangeRate = exchangeRate(); return snapshot; } /// @notice View borrow balance amount after accure mutation function accruedBorrowBalanceOf(address account) external override accrue returns (uint256) { Constant.BorrowInfo storage info = accountBorrows[account]; if (info.interestIndex != 0) { info.borrow = info.borrow.mul(accInterestIndex).div(info.interestIndex); info.interestIndex = accInterestIndex; } return info.borrow; } /// @notice View total borrow amount after accrue mutation function accruedTotalBorrow() external override accrue returns (uint256) { return _totalBorrow; } /// @notice View underlying token exchange rate after accure mutation function accruedExchangeRate() external override accrue returns (uint256) { return exchangeRate(); } /* ========== INTERNAL FUNCTIONS ========== */ /// @notice borrow info 업데이트 /// @dev account 의 accountBorrows 를 변경하고, totalSupply 를 변경함 /// @param account borrow 하는 address account /// @param addAmount 추가되는 borrow amount /// @param subAmount 제거되는 borrow amount function updateBorrowInfo(address account, uint256 addAmount, uint256 subAmount) internal { Constant.BorrowInfo storage info = accountBorrows[account]; if (info.interestIndex == 0) { info.interestIndex = accInterestIndex; } info.borrow = info.borrow.mul(accInterestIndex).div(info.interestIndex).add(addAmount).sub(subAmount); info.interestIndex = accInterestIndex; _totalBorrow = _totalBorrow.add(addAmount).sub(subAmount); info.borrow = (info.borrow < DUST) ? 0 : info.borrow; _totalBorrow = (_totalBorrow < DUST) ? 0 : _totalBorrow; } /// @notice supply info 업데이트 /// @dev account 의 accountBalances 를 변경하고, totalSupply 를 변경함 /// @param account supply 하는 address account /// @param addAmount 추가되는 supply amount /// @param subAmount 제거되는 supply amount function updateSupplyInfo(address account, uint256 addAmount, uint256 subAmount) internal { accountBalances[account] = accountBalances[account].add(addAmount).sub(subAmount); totalSupply = totalSupply.add(addAmount).sub(subAmount); totalSupply = (totalSupply < DUST) ? 0 : totalSupply; } /// @notice contract 가 가지고 있는 underlying token amount 조회 /// @dev underlying token 이 ETH 인 경우 msg.value 값을 빼서 계산함 function getCashPrior() internal view returns (uint256) { return underlying == address(ETH) ? address(this).balance.sub(msg.value) : IBEP20(underlying).balanceOf(address(this)); } /// @notice totalBorrow, totlaReserver, accInterestIdx 조회 /// @dev 아직 계산되지 않은 pending interest 더한 값으로 조회 /// 상태가 변겅되거나 저장되지는 않는다 function pendingAccrueSnapshot() internal view returns (Constant.AccrueSnapshot memory) { Constant.AccrueSnapshot memory snapshot; snapshot.totalBorrow = _totalBorrow; snapshot.totalReserve = totalReserve; snapshot.accInterestIndex = accInterestIndex; if (block.timestamp > lastAccruedTime && _totalBorrow > 0) { uint256 borrowRate = rateModel.getBorrowRate(getCashPrior(), _totalBorrow, totalReserve); uint256 interestFactor = borrowRate.mul(block.timestamp.sub(lastAccruedTime)); uint256 pendingInterest = _totalBorrow.mul(interestFactor).div(1e18); snapshot.totalBorrow = _totalBorrow.add(pendingInterest); snapshot.totalReserve = totalReserve.add(pendingInterest.mul(reserveFactor).div(1e18)); snapshot.accInterestIndex = accInterestIndex.add(interestFactor.mul(accInterestIndex).div(1e18)); } return snapshot; } } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File contracts/markets/LToken.sol pragma solidity ^0.6.12; contract LToken is Market { using SafeMath for uint256; using SafeToken for address; /* ========== STATE VARIABLES ========== */ string public name; string public symbol; uint8 public decimals; // initializer bool public initialized; mapping(address => mapping(address => uint256)) private _transferAllowances; /* ========== EVENT ========== */ event Mint(address minter, uint256 mintAmount); event Redeem(address account, uint underlyingAmount, uint gTokenAmount); event Borrow(address account, uint256 ammount, uint256 accountBorrow); event RepayBorrow(address payer, address borrower, uint256 amount, uint256 accountBorrow); event LiquidateBorrow( address liquidator, address borrower, uint256 amount, address gTokenCollateral, uint256 seizeAmount ); event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /* ========== INITIALIZER ========== */ constructor() public {} /// @notice Initialization /// @param _name name /// @param _symbol symbol /// @param _decimals decimals function initialize(string memory _name, string memory _symbol, uint8 _decimals) external onlyOwner { require(initialized == false, "already initialized"); __GMarket_init(); name = _name; symbol = _symbol; decimals = _decimals; initialized = true; } /* ========== VIEWS ========== */ /// @notice View allowance /// @param account Account address /// @param spender Spender address /// @return Allowance amount function allowance(address account, address spender) external view override returns (uint256) { return _transferAllowances[account][spender]; } /// @notice Owner address 조회 function getOwner() external view returns (address) { return owner(); } /* ========== MUTATIVE FUNCTIONS ========== */ function transfer(address dst, uint256 amount) external override accrue nonReentrant returns (bool) { core.transferTokens(msg.sender, msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint256 amount) external override accrue nonReentrant returns (bool) { core.transferTokens(msg.sender, src, dst, amount); return true; } /// @notice account 의 allowance amount 변경 /// @param spender spender address /// @param amount amount function approve(address spender, uint256 amount) external override returns (bool) { _transferAllowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } /* ========== RESTRICTED FUNCTIONS ========== */ /// @notice Update supply information /// @param account Account address to supply /// @param uAmount Underlying token amount to supply /// @return gAmount gToken amount to receive function supply(address account, uint256 uAmount) external payable override accrue onlyCore returns (uint256) { uint256 exchangeRate = exchangeRate(); uAmount = underlying == address(ETH) ? msg.value : uAmount; uAmount = _doTransferIn(account, uAmount); uint256 gAmount = uAmount.mul(1e18).div(exchangeRate); require(gAmount > 0, "LToken: invalid gAmount"); updateSupplyInfo(account, gAmount, 0); emit Mint(account, gAmount); emit Transfer(address(0), account, gAmount); return gAmount; } /// @notice Redeem token by gToken amount /// @param redeemer Redeemer account address /// @param gAmount gToken amount function redeemToken(address redeemer, uint256 gAmount) external override accrue onlyCore returns (uint256) { return _redeem(redeemer, gAmount, 0); } /// @notice Redeem token by underlying token amount /// @param redeemer Redeemer account address /// @param uAmount Underlying token amount function redeemUnderlying(address redeemer, uint256 uAmount) external override accrue onlyCore returns (uint256) { return _redeem(redeemer, 0, uAmount); } /// @notice Update borrow information /// @param account Borrower account address /// @param amount Borrow amount function borrow(address account, uint256 amount) external override accrue onlyCore returns (uint256) { require(getCash() >= amount, "LToken: borrow amount exceeds cash"); updateBorrowInfo(account, amount, 0); _doTransferOut(account, amount); emit Borrow(account, amount, borrowBalanceOf(account)); return amount; } /// @notice Repay own borrowing dept /// @dev Called when repay my own debt only /// @param account Borrower account address /// @param amount Repay amount function repayBorrow(address account, uint256 amount) external payable override accrue onlyCore returns (uint256) { if (amount == uint256(-1)) { amount = borrowBalanceOf(account); } return _repay(account, account, underlying == address(ETH) ? msg.value : amount); } /// @notice Repay others' debt behalf /// @dev Called when repay others' debt behalf /// @param payer Account address who pay for the debt /// @param borrower Account address who borrowing debt /// @param amount Dept amount to repay function repayBorrowBehalf( address payer, address borrower, uint256 amount ) external payable override accrue onlyCore returns (uint256) { return _repay(payer, borrower, underlying == address(ETH) ? msg.value : amount); } /// @notice Force to liquidate others debt /// @param gTokenCollateral gToken address provided as collateral /// @param liquidator Liquidator account address /// @param borrower Borrower account address /// @param amount Collateral amount function liquidateBorrow( address gTokenCollateral, address liquidator, address borrower, uint256 amount ) external payable override accrue onlyCore returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount) { require(borrower != liquidator, "LToken: cannot liquidate yourself"); amount = underlying == address(ETH) ? msg.value : amount; amount = _repay(liquidator, borrower, amount); require(amount > 0 && amount < uint256(-1), "LToken: invalid repay amount"); (seizeGAmount, rebateGAmount, liquidatorGAmount) = IValidator(core.validator()).gTokenAmountToSeize( address(this), gTokenCollateral, amount ); require(ILToken(payable(gTokenCollateral)).balanceOf(borrower) >= seizeGAmount, "LToken: too much seize amount"); emit LiquidateBorrow(liquidator, borrower, amount, gTokenCollateral, seizeGAmount); } function seize(address liquidator, address borrower, uint256 gAmount) external override accrue onlyCore nonReentrant { accountBalances[borrower] = accountBalances[borrower].sub(gAmount); accountBalances[liquidator] = accountBalances[liquidator].add(gAmount); emit Transfer(borrower, liquidator, gAmount); } function withdrawReserves() external override accrue onlyRebateDistributor nonReentrant { if (getCash() >= totalReserve) { uint256 amount = totalReserve; if (totalReserve > 0) { totalReserve = 0; _doTransferOut(address(rebateDistributor), amount); } } } /// @notice Transfer interneal /// @param spender Spender account address /// @param src Source account address /// @param dst Destination account address /// @param amount Transfer amount function transferTokensInternal( address spender, address src, address dst, uint256 amount ) external override onlyCore { require( src != dst && IValidator(core.validator()).redeemAllowed(address(this), src, amount), "LToken: cannot transfer" ); require(amount != 0, "LToken: zero amount"); uint256 _allowance = spender == src ? uint256(-1) : _transferAllowances[src][spender]; uint256 _allowanceNew = _allowance.sub(amount, "LToken: transfer amount exceeds allowance"); accountBalances[src] = accountBalances[src].sub(amount); accountBalances[dst] = accountBalances[dst].add(amount); if (_allowance != uint256(-1)) { _transferAllowances[src][spender] = _allowanceNew; } emit Transfer(src, dst, amount); } /* ========== PRIVATE FUNCTIONS ========== */ /// @notice Transfer in underlying token /// @param from Transfer from address /// @param amount Transfer amount /// @return Transfered amount function _doTransferIn(address from, uint256 amount) private returns (uint256) { if (underlying == address(ETH)) { require(msg.value >= amount, "LToken: value mismatch"); return Math.min(msg.value, amount); } else { uint256 balanceBefore = IBEP20(underlying).balanceOf(address(this)); underlying.safeTransferFrom(from, address(this), amount); uint256 balanceAfter = IBEP20(underlying).balanceOf(address(this)); require(balanceAfter.sub(balanceBefore) <= amount); return balanceAfter.sub(balanceBefore); } } /// @notice Transfer out underlying token /// @param to Transfer target add /// @param amount Transfer amount function _doTransferOut(address to, uint256 amount) private { if (underlying == address(ETH)) { SafeToken.safeTransferETH(to, amount); } else { underlying.safeTransfer(to, amount); } } /// @notice Redeem underlying token /// @dev Use only one of the amount params (gAmountIn or uAmountIn) /// Pass unused parameter to 0 /// @param account Redeemer account /// @param gAmountIn Redeem amount calculated by gToken amount /// @param uAmountIn Redeem amount function _redeem(address account, uint256 gAmountIn, uint256 uAmountIn) private returns (uint256) { require(gAmountIn == 0 || uAmountIn == 0, "LToken: one of gAmountIn or uAmountIn must be zero"); require(totalSupply >= gAmountIn, "LToken: not enough total supply"); require(getCash() >= uAmountIn || uAmountIn == 0, "LToken: not enough underlying"); require(getCash() >= gAmountIn.mul(exchangeRate()).div(1e18) || gAmountIn == 0, "LToken: not enough underlying"); uint gAmountToRedeem = gAmountIn > 0 ? gAmountIn : uAmountIn.mul(1e18).div(exchangeRate()); uint uAmountToRedeem = gAmountIn > 0 ? gAmountIn.mul(exchangeRate()).div(1e18) : uAmountIn; require( IValidator(core.validator()).redeemAllowed(address(this), account, gAmountToRedeem), "LToken: cannot redeem" ); updateSupplyInfo(account, 0, gAmountToRedeem); _doTransferOut(account, uAmountToRedeem); emit Transfer(account, address(0), gAmountToRedeem); emit Redeem(account, uAmountToRedeem, gAmountToRedeem); return uAmountToRedeem; } /// @notice Repay borrowing debt and update borrow information /// @param payer Payer account address /// @param borrower Borrower account address function _repay(address payer, address borrower, uint256 amount) private returns (uint256) { uint256 borrowBalance = borrowBalanceOf(borrower); uint256 repayAmount = Math.min(borrowBalance, amount); repayAmount = _doTransferIn(payer, repayAmount); updateBorrowInfo(borrower, 0, repayAmount); if (underlying == address(ETH)) { uint256 refundAmount = amount > repayAmount ? amount.sub(repayAmount) : 0; if (refundAmount > 0) { _doTransferOut(payer, refundAmount); } } emit RepayBorrow(payer, borrower, repayAmount, borrowBalanceOf(borrower)); return repayAmount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"ammount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrow","type":"uint256"}],"name":"Borrow","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":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"gTokenCollateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizeAmount","type":"uint256"}],"name":"LiquidateBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gTokenAmount","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":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrow","type":"uint256"}],"name":"RepayBorrow","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":"_totalBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accInterestIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountSnapshot","outputs":[{"components":[{"internalType":"uint256","name":"gTokenBalance","type":"uint256"},{"internalType":"uint256","name":"borrowBalance","type":"uint256"},{"internalType":"uint256","name":"exchangeRate","type":"uint256"}],"internalType":"struct Constant.AccountSnapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accruedAccountSnapshot","outputs":[{"components":[{"internalType":"uint256","name":"gTokenBalance","type":"uint256"},{"internalType":"uint256","name":"borrowBalance","type":"uint256"},{"internalType":"uint256","name":"exchangeRate","type":"uint256"}],"internalType":"struct Constant.AccountSnapshot","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accruedBorrowBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accruedExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accruedTotalBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"core","outputs":[{"internalType":"contract ICore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccInterestIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRateModel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastAccruedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gTokenCollateral","type":"address"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidateBorrow","outputs":[{"internalType":"uint256","name":"seizeGAmount","type":"uint256"},{"internalType":"uint256","name":"rebateGAmount","type":"uint256"},{"internalType":"uint256","name":"liquidatorGAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateModel","outputs":[{"internalType":"contract IRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebateDistributor","outputs":[{"internalType":"contract IRebateDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"redeemer","type":"address"},{"internalType":"uint256","name":"gAmount","type":"uint256"}],"name":"redeemToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"redeemer","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"payer","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"reserveFactor","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":"gAmount","type":"uint256"}],"name":"seize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_core","type":"address"}],"name":"setCore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rateModel","type":"address"}],"name":"setRateModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rebateDistributor","type":"address"}],"name":"setRebateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveFactor","type":"uint256"}],"name":"setReserveFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_underlying","type":"address"}],"name":"setUnderlying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserve","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokensInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"underlyingBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060006200001e62000072565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805562000076565b3390565b614cb780620000866000396000f3fe6080604052600436106102e85760003560e01c80638285ef4011610190578063abdb5ea8116100dc578063dd62ed3e11610095578063ecdaff7e1161006f578063ecdaff7e14610818578063f2b9fdb81461082d578063f2f4eb2614610840578063f2fde38b14610855576102ef565b8063dd62ed3e146107b6578063de02d642146107d6578063e61604cf146107f6576102ef565b8063abdb5ea814610719578063b2a02ff11461072c578063bdb2321f1461074c578063c23379da1461076c578063d49187b31461078c578063d88c3f22146107a1576102ef565b806392fa4e8e11610149578063962941781161012357806396294178146106af5780639951c2cf146106cf578063a1088459146106e4578063a9059cbb146106f9576102ef565b806392fa4e8e1461065a578063935a8b841461067a57806395d89b411461069a576102ef565b80638285ef40146105c6578063830cbbbd146105db5780638399c0ba146105fb578063893d20e81461061b5780638b9db037146106305780638da5cb5b14610645576102ef565b80633ba0b9a91161024f57806359341a1a11610208578063715018a6116101e2578063715018a61461055c5780637f9028c8146105715780637ffc93b11461059157806380009630146105a6576102ef565b806359341a1a146105055780636f307dc31461052757806370a082311461053c576102ef565b80633ba0b9a91461047e5780634322b714146104935780634b8a3529146104a85780634c68df67146104c857806352e97efd146104dd57806359086a5e146104f2576102ef565b80631c446983116102a15780631c446983146103d257806323b872dd146103f257806326d5f64114610412578063313ce56714610427578063374c49b4146104495780633b1d21a214610469576102ef565b8063014a296f146102f457806306fdde031461032a578063095ea7b31461034c578063158ef93e146103795780631624f6c61461038e57806318160ddd146103b0576102ef565b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004614127565b610875565b6040516103219190614ba2565b60405180910390f35b34801561033657600080fd5b5061033f6108c3565b6040516103219190614468565b34801561035857600080fd5b5061036c610367366004614227565b610951565b604051610321919061445d565b34801561038557600080fd5b5061036c6109bc565b34801561039a57600080fd5b506103ae6103a9366004614272565b6109ca565b005b3480156103bc57600080fd5b506103c5610a8c565b6040516103219190614bc3565b3480156103de57600080fd5b506103ae6103ed3660046142ec565b610a92565b3480156103fe57600080fd5b5061036c61040d3660046141e7565b610c6f565b34801561041e57600080fd5b506103ae610e60565b34801561043357600080fd5b5061043c611040565b6040516103219190614be2565b34801561045557600080fd5b506103c5610464366004614127565b611049565b34801561047557600080fd5b506103c56110ab565b34801561048a57600080fd5b506103c56110bb565b34801561049f57600080fd5b506103c561112b565b3480156104b457600080fd5b506103c56104c3366004614227565b611131565b3480156104d457600080fd5b506103c5611335565b3480156104e957600080fd5b506103c561133b565b6103c56105003660046141e7565b611341565b34801561051157600080fd5b5061051a6114e5565b6040516103219190614365565b34801561053357600080fd5b5061051a6114f4565b34801561054857600080fd5b506103c5610557366004614127565b611503565b34801561056857600080fd5b506103ae61151e565b34801561057d57600080fd5b506103ae61058c366004614127565b6115a7565b34801561059d57600080fd5b506103c5611780565b3480156105b257600080fd5b506103ae6105c1366004614127565b611786565b3480156105d257600080fd5b506103c5611836565b3480156105e757600080fd5b506103c56105f6366004614227565b61184f565b34801561060757600080fd5b506103c5610616366004614127565b6119e0565b34801561062757600080fd5b5061051a611b81565b34801561063c57600080fd5b506103c5611b8b565b34801561065157600080fd5b5061051a611ce7565b34801561066657600080fd5b50610314610675366004614127565b611cf6565b34801561068657600080fd5b506103c5610695366004614127565b611ed6565b3480156106a657600080fd5b5061033f611f0e565b3480156106bb57600080fd5b506103c56106ca366004614227565b611f69565b3480156106db57600080fd5b506103c56120f3565b3480156106f057600080fd5b5061051a6120f9565b34801561070557600080fd5b5061036c610714366004614227565b612108565b6103c5610727366004614227565b6122f8565b34801561073857600080fd5b506103ae6107473660046141e7565b6124ab565b34801561075857600080fd5b506103ae610767366004614127565b6126f2565b34801561077857600080fd5b506103ae610787366004614197565b6127a2565b34801561079857600080fd5b5061051a612a7d565b3480156107ad57600080fd5b506103c5612a8c565b3480156107c257600080fd5b506103c56107d136600461415f565b612aa8565b3480156107e257600080fd5b506103ae6107f1366004614127565b612ad3565b610809610804366004614197565b612b5a565b60405161032193929190614bcc565b34801561082457600080fd5b506103c5612f56565b6103c561083b366004614227565b6130b1565b34801561084c57600080fd5b5061051a613324565b34801561086157600080fd5b506103ae610870366004614127565b613333565b61087d613ff5565b610885613ff5565b6001600160a01b03831660009081526009602052604090205481526108a983611049565b60208201526108b66110bb565b604082015290505b919050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b505050505081565b3360008181526011602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109aa908690614bc3565b60405180910390a35060015b92915050565b601054610100900460ff1681565b6109d26133f3565b6001600160a01b03166109e3611ce7565b6001600160a01b031614610a125760405162461bcd60e51b8152600401610a09906148ac565b60405180910390fd5b601054610100900460ff1615610a3a5760405162461bcd60e51b8152600401610a099061477a565b610a426133f7565b8251610a5590600e906020860190614016565b508151610a6990600f906020850190614016565b506010805461ff001960ff90931660ff1990911617919091166101001790555050565b60065481565b600c5442118015610aad57506003546001600160a01b031615155b15610c03576003546000906001600160a01b03166315f24053610ace613409565b6008546007546040518463ffffffff1660e01b8152600401610af293929190614bcc565b60206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b429190614304565b90506000610b65610b5e600c54426134a890919063ffffffff16565b83906134d0565b90506000610b90670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b9061350a565b600854909150610ba0908261353c565b600855600b54610bcc90610bc390670de0b6b3a764000090610b8a9085906134d0565b6007549061353c565b600755600d54610bf890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d549061353c565b600d55505042600c55505b610c0b6133f3565b6001600160a01b0316610c1c611ce7565b6001600160a01b031614610c425760405162461bcd60e51b8152600401610a09906148ac565b670de0b6b3a7640000811115610c6a5760405162461bcd60e51b8152600401610a0990614afd565b600b55565b6000600c5442118015610c8c57506003546001600160a01b031615155b15610dc3576003546000906001600160a01b03166315f24053610cad613409565b6008546007546040518463ffffffff1660e01b8152600401610cd193929190614bcc565b60206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190614304565b90506000610d3d610b5e600c54426134a890919063ffffffff16565b90506000610d62670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150610d72908261353c565b600855600b54610d9590610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54610db890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b60026001541415610de65760405162461bcd60e51b8152600401610a0990614b34565b60026001819055546040516368155ec160e01b81526001600160a01b03909116906368155ec190610e21903390889088908890600401614379565b600060405180830381600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505060018080559695505050505050565b600c5442118015610e7b57506003546001600160a01b031615155b15610fb2576003546000906001600160a01b03166315f24053610e9c613409565b6008546007546040518463ffffffff1660e01b8152600401610ec093929190614bcc565b60206040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f109190614304565b90506000610f2c610b5e600c54426134a890919063ffffffff16565b90506000610f51670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150610f61908261353c565b600855600b54610f8490610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54610fa790610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6004546001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610a09906147d6565b60026001541415610fff5760405162461bcd60e51b8152600401610a0990614b34565b600260015560075461100f6110ab565b1061103a576007548015611038576000600755600454611038906001600160a01b031682613561565b505b60018055565b60105460ff1681565b6000611053613ff5565b61105b61359b565b6001600160a01b0384166000908152600a60205260409020805491925090611088576000925050506108be565b6001810154604083015182546110a39291610b8a91906134d0565b949350505050565b60006110b5613409565b90505b90565b6000600654600014156110d75750670de0b6b3a76400006110b8565b6110df613ff5565b6110e761359b565b9050611125600654610b8a670de0b6b3a764000061111f85602001516111198760000151611113613409565b9061353c565b906134a8565b906134d0565b91505090565b600b5481565b6000600c544211801561114e57506003546001600160a01b031615155b15611285576003546000906001600160a01b03166315f2405361116f613409565b6008546007546040518463ffffffff1660e01b815260040161119393929190614bcc565b60206040518083038186803b1580156111ab57600080fd5b505afa1580156111bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e39190614304565b905060006111ff610b5e600c54426134a890919063ffffffff16565b90506000611224670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611234908261353c565b600855600b5461125790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461127a90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146112af5760405162461bcd60e51b8152600401610a0990614a49565b816112b86110ab565b10156112d65760405162461bcd60e51b8152600401610a09906148e1565b6112e28383600061370d565b6112ec8383613561565b7fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af838361131886611049565b6040516113279392919061443c565b60405180910390a150919050565b60075481565b60085481565b6000600c544211801561135e57506003546001600160a01b031615155b15611495576003546000906001600160a01b03166315f2405361137f613409565b6008546007546040518463ffffffff1660e01b81526004016113a393929190614bcc565b60206040518083038186803b1580156113bb57600080fd5b505afa1580156113cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f39190614304565b9050600061140f610b5e600c54426134a890919063ffffffff16565b90506000611434670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611444908261353c565b600855600b5461146790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461148a90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146114bf5760405162461bcd60e51b8152600401610a0990614a49565b6005546110a390859085906001600160a01b0316156114de57846114e0565b345b6137b5565b6004546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b031660009081526009602052604090205490565b6115266133f3565b6001600160a01b0316611537611ce7565b6001600160a01b03161461155d5760405162461bcd60e51b8152600401610a09906148ac565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c54421180156115c257506003546001600160a01b031615155b156116f9576003546000906001600160a01b03166315f240536115e3613409565b6008546007546040518463ffffffff1660e01b815260040161160793929190614bcc565b60206040518083038186803b15801561161f57600080fd5b505afa158015611633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116579190614304565b90506000611673610b5e600c54426134a890919063ffffffff16565b90506000611698670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506116a8908261353c565b600855600b546116cb90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546116ee90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6117016133f3565b6001600160a01b0316611712611ce7565b6001600160a01b0316146117385760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b03811661175e5760405162461bcd60e51b8152600401610a0990614991565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b61178e6133f3565b6001600160a01b031661179f611ce7565b6001600160a01b0316146117c55760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166117eb5760405162461bcd60e51b8152600401610a099061454f565b6002546001600160a01b0316156118145760405162461bcd60e51b8152600401610a09906145bd565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000611840613ff5565b61184861359b565b5191505090565b6000600c544211801561186c57506003546001600160a01b031615155b156119a3576003546000906001600160a01b03166315f2405361188d613409565b6008546007546040518463ffffffff1660e01b81526004016118b193929190614bcc565b60206040518083038186803b1580156118c957600080fd5b505afa1580156118dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119019190614304565b9050600061191d610b5e600c54426134a890919063ffffffff16565b90506000611942670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611952908261353c565b600855600b5461197590610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461199890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146119cd5760405162461bcd60e51b8152600401610a0990614a49565b6119d983836000613875565b9392505050565b6000600c54421180156119fd57506003546001600160a01b031615155b15611b34576003546000906001600160a01b03166315f24053611a1e613409565b6008546007546040518463ffffffff1660e01b8152600401611a4293929190614bcc565b60206040518083038186803b158015611a5a57600080fd5b505afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614304565b90506000611aae610b5e600c54426134a890919063ffffffff16565b90506000611ad3670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611ae3908261353c565b600855600b54611b0690610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611b2990610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6001600160a01b0382166000908152600a60205260409020600181015415611b7a576001810154600d548254611b6f9291610b8a91906134d0565b8155600d5460018201555b5492915050565b60006110b5611ce7565b6000600c5442118015611ba857506003546001600160a01b031615155b15611cdf576003546000906001600160a01b03166315f24053611bc9613409565b6008546007546040518463ffffffff1660e01b8152600401611bed93929190614bcc565b60206040518083038186803b158015611c0557600080fd5b505afa158015611c19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3d9190614304565b90506000611c59610b5e600c54426134a890919063ffffffff16565b90506000611c7e670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611c8e908261353c565b600855600b54611cb190610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611cd490610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6110b56110bb565b6000546001600160a01b031690565b611cfe613ff5565b600c5442118015611d1957506003546001600160a01b031615155b15611e50576003546000906001600160a01b03166315f24053611d3a613409565b6008546007546040518463ffffffff1660e01b8152600401611d5e93929190614bcc565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190614304565b90506000611dca610b5e600c54426134a890919063ffffffff16565b90506000611def670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611dff908261353c565b600855600b54611e2290610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611e4590610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b611e58613ff5565b6001600160a01b0383166000908152600a60205260409020600181015415611e9e576001810154600d548254611e939291610b8a91906134d0565b8155600d5460018201555b6001600160a01b0384166000908152600960209081526040909120548352815490830152611eca6110bb565b60408301525092915050565b60006109b6670de0b6b3a7640000610b8a611eef6110bb565b6001600160a01b038616600090815260096020526040902054906134d0565b600f805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109495780601f1061091e57610100808354040283529160200191610949565b6000600c5442118015611f8657506003546001600160a01b031615155b156120bd576003546000906001600160a01b03166315f24053611fa7613409565b6008546007546040518463ffffffff1660e01b8152600401611fcb93929190614bcc565b60206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201b9190614304565b90506000612037610b5e600c54426134a890919063ffffffff16565b9050600061205c670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b60085490915061206c908261353c565b600855600b5461208f90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546120b290610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146120e75760405162461bcd60e51b8152600401610a0990614a49565b6119d983600084613875565b600d5481565b6003546001600160a01b031681565b6000600c544211801561212557506003546001600160a01b031615155b1561225c576003546000906001600160a01b03166315f24053612146613409565b6008546007546040518463ffffffff1660e01b815260040161216a93929190614bcc565b60206040518083038186803b15801561218257600080fd5b505afa158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba9190614304565b905060006121d6610b5e600c54426134a890919063ffffffff16565b905060006121fb670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b60085490915061220b908261353c565b600855600b5461222e90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461225190610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002600154141561227f5760405162461bcd60e51b8152600401610a0990614b34565b60026001819055546040516368155ec160e01b81526001600160a01b03909116906368155ec1906122ba903390819088908890600401614379565b600060405180830381600087803b1580156122d457600080fd5b505af11580156122e8573d6000803e3d6000fd5b5050600180805595945050505050565b6000600c544211801561231557506003546001600160a01b031615155b1561244c576003546000906001600160a01b03166315f24053612336613409565b6008546007546040518463ffffffff1660e01b815260040161235a93929190614bcc565b60206040518083038186803b15801561237257600080fd5b505afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa9190614304565b905060006123c6610b5e600c54426134a890919063ffffffff16565b905060006123eb670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506123fb908261353c565b600855600b5461241e90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461244190610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146124765760405162461bcd60e51b8152600401610a0990614a49565b60001982141561248c5761248983611049565b91505b6005546119d990849081906001600160a01b0316156114de57846114e0565b600c54421180156124c657506003546001600160a01b031615155b156125fd576003546000906001600160a01b03166315f240536124e7613409565b6008546007546040518463ffffffff1660e01b815260040161250b93929190614bcc565b60206040518083038186803b15801561252357600080fd5b505afa158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190614304565b90506000612577610b5e600c54426134a890919063ffffffff16565b9050600061259c670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506125ac908261353c565b600855600b546125cf90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546125f290610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146126275760405162461bcd60e51b8152600401610a0990614a49565b6002600154141561264a5760405162461bcd60e51b8152600401610a0990614b34565b60026001556001600160a01b03821660009081526009602052604090205461267290826134a8565b6001600160a01b0380841660009081526009602052604080822093909355908516815220546126a1908261353c565b6001600160a01b038085166000818152600960205260409081902093909355915190841690600080516020614c62833981519152906126e1908590614bc3565b60405180910390a350506001805550565b6126fa6133f3565b6001600160a01b031661270b611ce7565b6001600160a01b0316146127315760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166127575760405162461bcd60e51b8152600401610a0990614692565b6005546001600160a01b0316156127805760405162461bcd60e51b8152600401610a099061470c565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146127cc5760405162461bcd60e51b8152600401610a0990614a49565b816001600160a01b0316836001600160a01b0316141580156128f05750600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286f9190614143565b6001600160a01b031663eabe7d913085846040518463ffffffff1660e01b815260040161289e939291906143a3565b602060405180830381600087803b1580156128b857600080fd5b505af11580156128cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f09190614252565b61290c5760405162461bcd60e51b8152600401610a09906145f4565b806129295760405162461bcd60e51b8152600401610a0990614522565b6000836001600160a01b0316856001600160a01b03161461296f576001600160a01b03808516600090815260116020908152604080832093891683529290522054612973565b6000195b9050600061299c83604051806060016040528060298152602001614c3960299139849190613b41565b6001600160a01b0386166000908152600960205260409020549091506129c290846134a8565b6001600160a01b0380871660009081526009602052604080822093909355908616815220546129f1908461353c565b6001600160a01b0385166000908152600960205260409020556000198214612a3c576001600160a01b038086166000908152601160209081526040808320938a168352929052208190555b836001600160a01b0316856001600160a01b0316600080516020614c6283398151915285604051612a6d9190614bc3565b60405180910390a3505050505050565b6003546001600160a01b031690565b6000612a96613ff5565b612a9e61359b565b6040015191505090565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b612adb6133f3565b6001600160a01b0316612aec611ce7565b6001600160a01b031614612b125760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b038116612b385760405162461bcd60e51b8152600401610a09906149d4565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000600c5442118015612b7a57506003546001600160a01b031615155b15612cb1576003546000906001600160a01b03166315f24053612b9b613409565b6008546007546040518463ffffffff1660e01b8152600401612bbf93929190614bcc565b60206040518083038186803b158015612bd757600080fd5b505afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f9190614304565b90506000612c2b610b5e600c54426134a890919063ffffffff16565b90506000612c50670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150612c60908261353c565b600855600b54612c8390610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54612ca690610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b03163314612cdb5760405162461bcd60e51b8152600401610a0990614a49565b856001600160a01b0316856001600160a01b03161415612d0d5760405162461bcd60e51b8152600401610a099061449b565b6005546001600160a01b031615612d245783612d26565b345b9350612d338686866137b5565b9350600084118015612d46575060001984105b612d625760405162461bcd60e51b8152600401610a0990614b6b565b600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612db057600080fd5b505afa158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190614143565b6001600160a01b0316631ed4a1743089876040518463ffffffff1660e01b8152600401612e17939291906143a3565b606060405180830381600087803b158015612e3157600080fd5b505af1158015612e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e69919061431c565b6040516370a0823160e01b8152929550909350915083906001600160a01b038916906370a0823190612e9f908990600401614365565b60206040518083038186803b158015612eb757600080fd5b505afa158015612ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eef9190614304565b1015612f0d5760405162461bcd60e51b8152600401610a099061484e565b7f298637f684da70674f26509b10f07ec2fbc77a335ab1e7d6215a4b2484d8bb528686868a87604051612f449594939291906143c7565b60405180910390a19450945094915050565b6000600c5442118015612f7357506003546001600160a01b031615155b156130aa576003546000906001600160a01b03166315f24053612f94613409565b6008546007546040518463ffffffff1660e01b8152600401612fb893929190614bcc565b60206040518083038186803b158015612fd057600080fd5b505afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614304565b90506000613024610b5e600c54426134a890919063ffffffff16565b90506000613049670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150613059908261353c565b600855600b5461307c90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461309f90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b5060085490565b6000600c54421180156130ce57506003546001600160a01b031615155b15613205576003546000906001600160a01b03166315f240536130ef613409565b6008546007546040518463ffffffff1660e01b815260040161311393929190614bcc565b60206040518083038186803b15801561312b57600080fd5b505afa15801561313f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131639190614304565b9050600061317f610b5e600c54426134a890919063ffffffff16565b905060006131a4670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506131b4908261353c565b600855600b546131d790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546131fa90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b0316331461322f5760405162461bcd60e51b8152600401610a0990614a49565b60006132396110bb565b6005549091506001600160a01b0316156132535782613255565b345b92506132618484613b6d565b9250600061327b82610b8a86670de0b6b3a76400006134d0565b90506000811161329d5760405162461bcd60e51b8152600401610a099061495a565b6132a985826000613cf9565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688585826040516132da929190614423565b60405180910390a1846001600160a01b031660006001600160a01b0316600080516020614c62833981519152836040516133149190614bc3565b60405180910390a3949350505050565b6002546001600160a01b031681565b61333b6133f3565b6001600160a01b031661334c611ce7565b6001600160a01b0316146133725760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166133985760405162461bcd60e51b8152600401610a09906144dc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b42600c55670de0b6b3a7640000600d55565b6005546000906001600160a01b0316156134a2576005546040516370a0823160e01b81526001600160a01b03909116906370a082319061344d903090600401614365565b60206040518083038186803b15801561346557600080fd5b505afa158015613479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349d9190614304565b6110b5565b6110b547345b6000828211156134ca5760405162461bcd60e51b8152600401610a099061465b565b50900390565b6000826134df575060006109b6565b828202828482816134ec57fe5b04146119d95760405162461bcd60e51b8152600401610a099061480d565b600080821161352b5760405162461bcd60e51b8152600401610a09906146d5565b81838161353457fe5b049392505050565b6000828201838110156119d95760405162461bcd60e51b8152600401610a0990614586565b6005546001600160a01b03166135805761357b8282613d6e565b613597565b600554613597906001600160a01b03168383613e00565b5050565b6135a3613ff5565b6135ab613ff5565b60085481526007546020820152600d546040820152600c54421180156135d357506000600854115b156110b5576003546000906001600160a01b03166315f240536135f4613409565b6008546007546040518463ffffffff1660e01b815260040161361893929190614bcc565b60206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136689190614304565b90506000613684610b5e600c54426134a890919063ffffffff16565b905060006136a9670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506136b9908261353c565b8452600b546136db90610bc390670de0b6b3a764000090610b8a9085906134d0565b6020850152600d5461370090610bef90670de0b6b3a764000090610b8a9086906134d0565b6040850152505050905090565b6001600160a01b0383166000908152600a60205260409020600181015461373757600d5460018201555b61376082611119856111138560010154610b8a600d5488600001546134d090919063ffffffff16565b8155600d54600182015560085461377d908390611119908661353c565b60085580546103e811613791578054613794565b60005b81556008546103e8116137a9576008546137ac565b60005b60085550505050565b6000806137c184611049565b905060006137cf8285613eee565b90506137db8682613b6d565b90506137e98560008361370d565b6005546001600160a01b0316613827576000818511613809576000613813565b61381385836134a8565b90508015613825576138258782613561565b505b7fa9a154237a69922f8860321d1fec1624a5dbe8a8af89a3dd3d7a759f6c8080d886868361385489611049565b60405161386494939291906143fa565b60405180910390a195945050505050565b6000821580613882575081155b61389e5760405162461bcd60e51b8152600401610a0990614aab565b8260065410156138c05760405162461bcd60e51b8152600401610a0990614743565b816138c96110ab565b1015806138d4575081155b6138f05760405162461bcd60e51b8152600401610a0990614923565b61390e670de0b6b3a7640000610b8a6139076110bb565b86906134d0565b6139166110ab565b101580613921575082155b61393d5760405162461bcd60e51b8152600401610a0990614923565b6000808411613968576139636139516110bb565b610b8a85670de0b6b3a76400006134d0565b61396a565b835b9050600080851161397b5783613999565b613999670de0b6b3a7640000610b8a6139926110bb565b88906134d0565b9050600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156139e957600080fd5b505afa1580156139fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a219190614143565b6001600160a01b031663eabe7d913088856040518463ffffffff1660e01b8152600401613a50939291906143a3565b602060405180830381600087803b158015613a6a57600080fd5b505af1158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190614252565b613abe5760405162461bcd60e51b8152600401610a09906147a7565b613aca86600084613cf9565b613ad48682613561565b60006001600160a01b0316866001600160a01b0316600080516020614c6283398151915284604051613b069190614bc3565b60405180910390a37fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9298682846040516138649392919061443c565b60008184841115613b655760405162461bcd60e51b8152600401610a099190614468565b505050900390565b6005546000906001600160a01b0316613bb15781341015613ba05760405162461bcd60e51b8152600401610a099061462b565b613baa3483613eee565b90506109b6565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613be2903090600401614365565b60206040518083038186803b158015613bfa57600080fd5b505afa158015613c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c329190614304565b600554909150613c4d906001600160a01b0316853086613f04565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613c7e903090600401614365565b60206040518083038186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cce9190614304565b905083613cdb82846134a8565b1115613ce657600080fd5b613cf081836134a8565b925050506109b6565b6001600160a01b038316600090815260096020526040902054613d22908290611119908561353c565b6001600160a01b038416600090815260096020526040902055600654613d4e908290611119908561353c565b60068190556103e811613d6357600654613d66565b60005b600655505050565b604080516000808252602082019092526001600160a01b038416908390604051613d989190614349565b60006040518083038185875af1925050503d8060008114613dd5576040519150601f19603f3d011682016040523d82523d6000602084013e613dda565b606091505b5050905080613dfb5760405162461bcd60e51b8152600401610a0990614a1f565b505050565b60006060846001600160a01b031663a9059cbb8585604051602401613e26929190614423565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613e5f9190614349565b6000604051808303816000865af19150503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150818015613ecb575080511580613ecb575080806020019051810190613ecb9190614252565b613ee75760405162461bcd60e51b8152600401610a0990614885565b5050505050565b6000818310613efd57816119d9565b5090919050565b60006060856001600160a01b03166323b872dd868686604051602401613f2c939291906143a3565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613f659190614349565b6000604051808303816000865af19150503d8060008114613fa2576040519150601f19603f3d011682016040523d82523d6000602084013e613fa7565b606091505b5091509150818015613fd1575080511580613fd1575080806020019051810190613fd19190614252565b613fed5760405162461bcd60e51b8152600401610a0990614a80565b505050505050565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061405757805160ff1916838001178555614084565b82800160010185558215614084579182015b82811115614084578251825591602001919060010190614069565b50614090929150614094565b5090565b5b808211156140905760008155600101614095565b600082601f8301126140b9578081fd5b813567ffffffffffffffff808211156140d0578283fd5b604051601f8301601f1916810160200182811182821017156140f0578485fd5b60405282815292508284830160200186101561410b57600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215614138578081fd5b81356119d981614c20565b600060208284031215614154578081fd5b81516119d981614c20565b60008060408385031215614171578081fd5b823561417c81614c20565b9150602083013561418c81614c20565b809150509250929050565b600080600080608085870312156141ac578182fd5b84356141b781614c20565b935060208501356141c781614c20565b925060408501356141d781614c20565b9396929550929360600135925050565b6000806000606084860312156141fb578283fd5b833561420681614c20565b9250602084013561421681614c20565b929592945050506040919091013590565b60008060408385031215614239578182fd5b823561424481614c20565b946020939093013593505050565b600060208284031215614263578081fd5b815180151581146119d9578182fd5b600080600060608486031215614286578283fd5b833567ffffffffffffffff8082111561429d578485fd5b6142a9878388016140a9565b945060208601359150808211156142be578384fd5b506142cb868287016140a9565b925050604084013560ff811681146142e1578182fd5b809150509250925092565b6000602082840312156142fd578081fd5b5035919050565b600060208284031215614315578081fd5b5051919050565b600080600060608486031215614330578283fd5b8351925060208401519150604084015190509250925092565b6000825161435b818460208701614bf0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039586168152938516602085015260408401929092529092166060820152608081019190915260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b6000602082528251806020840152614487816040850160208701614bf0565b601f01601f19169190910160400192915050565b60208082526021908201527f4c546f6b656e3a2063616e6e6f74206c697175696461746520796f757273656c6040820152603360f91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526013908201527213151bdad95b8e881e995c9bc8185b5bdd5b9d606a1b604082015260600190565b6020808252601d908201527f474d61726b65743a20696e76616c696420636f72652061646472657373000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526019908201527f474d61726b65743a20636f726520616c72656164792073657400000000000000604082015260600190565b60208082526017908201527f4c546f6b656e3a2063616e6e6f74207472616e73666572000000000000000000604082015260600190565b602080825260169082015275098a8ded6cadc7440ecc2d8eaca40dad2e6dac2e8c6d60531b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526023908201527f474d61726b65743a20696e76616c696420756e6465726c79696e67206164647260408201526265737360e81b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601f908201527f474d61726b65743a2073657420756e6465726c79696e6720616c726561647900604082015260600190565b6020808252601f908201527f4c546f6b656e3a206e6f7420656e6f75676820746f74616c20737570706c7900604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b6020808252601590820152744c546f6b656e3a2063616e6e6f742072656465656d60581b604082015260600190565b6020808252601e908201527f47546f6b656e3a206f6e6c79205265626174654469737472696275746f720000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f4c546f6b656e3a20746f6f206d756368207365697a6520616d6f756e74000000604082015260600190565b6020808252600d908201526c10b9b0b332aa3930b739b332b960991b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4c546f6b656e3a20626f72726f7720616d6f756e7420657863656564732063616040820152610e6d60f31b606082015260800190565b6020808252601d908201527f4c546f6b656e3a206e6f7420656e6f75676820756e6465726c79696e67000000604082015260600190565b60208082526017908201527f4c546f6b656e3a20696e76616c69642067416d6f756e74000000000000000000604082015260600190565b60208082526023908201527f474d61726b65743a20696e76616c69642072617465206d6f64656c206164647260408201526265737360e81b606082015260800190565b6020808252602b908201527f474d61726b65743a20696e76616c69642072656261746520646973747269627560408201526a746f72206164647265737360a81b606082015260800190565b60208082526010908201526f042e6c2cccaa8e4c2dce6cccae48aa8960831b604082015260600190565b6020808252601a908201527f47546f6b656e3a206f6e6c7920436f726520436f6e7472616374000000000000604082015260600190565b60208082526011908201527021736166655472616e7366657246726f6d60781b604082015260600190565b60208082526032908201527f4c546f6b656e3a206f6e65206f662067416d6f756e74496e206f722075416d6f604082015271756e74496e206d757374206265207a65726f60701b606082015260800190565b6020808252601f908201527f474d61726b65743a20696e76616c6964207265736572766520666163746f7200604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601c908201527f4c546f6b656e3a20696e76616c696420726570617920616d6f756e7400000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60005b83811015614c0b578181015183820152602001614bf3565b83811115614c1a576000848401525b50505050565b6001600160a01b0381168114614c3557600080fd5b5056fe4c546f6b656e3a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b9533ae8ddf3214370c6c33cf4a3b9c55b5ac65cc7a96fd93fe88da8e454105464736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c80638285ef4011610190578063abdb5ea8116100dc578063dd62ed3e11610095578063ecdaff7e1161006f578063ecdaff7e14610818578063f2b9fdb81461082d578063f2f4eb2614610840578063f2fde38b14610855576102ef565b8063dd62ed3e146107b6578063de02d642146107d6578063e61604cf146107f6576102ef565b8063abdb5ea814610719578063b2a02ff11461072c578063bdb2321f1461074c578063c23379da1461076c578063d49187b31461078c578063d88c3f22146107a1576102ef565b806392fa4e8e11610149578063962941781161012357806396294178146106af5780639951c2cf146106cf578063a1088459146106e4578063a9059cbb146106f9576102ef565b806392fa4e8e1461065a578063935a8b841461067a57806395d89b411461069a576102ef565b80638285ef40146105c6578063830cbbbd146105db5780638399c0ba146105fb578063893d20e81461061b5780638b9db037146106305780638da5cb5b14610645576102ef565b80633ba0b9a91161024f57806359341a1a11610208578063715018a6116101e2578063715018a61461055c5780637f9028c8146105715780637ffc93b11461059157806380009630146105a6576102ef565b806359341a1a146105055780636f307dc31461052757806370a082311461053c576102ef565b80633ba0b9a91461047e5780634322b714146104935780634b8a3529146104a85780634c68df67146104c857806352e97efd146104dd57806359086a5e146104f2576102ef565b80631c446983116102a15780631c446983146103d257806323b872dd146103f257806326d5f64114610412578063313ce56714610427578063374c49b4146104495780633b1d21a214610469576102ef565b8063014a296f146102f457806306fdde031461032a578063095ea7b31461034c578063158ef93e146103795780631624f6c61461038e57806318160ddd146103b0576102ef565b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004614127565b610875565b6040516103219190614ba2565b60405180910390f35b34801561033657600080fd5b5061033f6108c3565b6040516103219190614468565b34801561035857600080fd5b5061036c610367366004614227565b610951565b604051610321919061445d565b34801561038557600080fd5b5061036c6109bc565b34801561039a57600080fd5b506103ae6103a9366004614272565b6109ca565b005b3480156103bc57600080fd5b506103c5610a8c565b6040516103219190614bc3565b3480156103de57600080fd5b506103ae6103ed3660046142ec565b610a92565b3480156103fe57600080fd5b5061036c61040d3660046141e7565b610c6f565b34801561041e57600080fd5b506103ae610e60565b34801561043357600080fd5b5061043c611040565b6040516103219190614be2565b34801561045557600080fd5b506103c5610464366004614127565b611049565b34801561047557600080fd5b506103c56110ab565b34801561048a57600080fd5b506103c56110bb565b34801561049f57600080fd5b506103c561112b565b3480156104b457600080fd5b506103c56104c3366004614227565b611131565b3480156104d457600080fd5b506103c5611335565b3480156104e957600080fd5b506103c561133b565b6103c56105003660046141e7565b611341565b34801561051157600080fd5b5061051a6114e5565b6040516103219190614365565b34801561053357600080fd5b5061051a6114f4565b34801561054857600080fd5b506103c5610557366004614127565b611503565b34801561056857600080fd5b506103ae61151e565b34801561057d57600080fd5b506103ae61058c366004614127565b6115a7565b34801561059d57600080fd5b506103c5611780565b3480156105b257600080fd5b506103ae6105c1366004614127565b611786565b3480156105d257600080fd5b506103c5611836565b3480156105e757600080fd5b506103c56105f6366004614227565b61184f565b34801561060757600080fd5b506103c5610616366004614127565b6119e0565b34801561062757600080fd5b5061051a611b81565b34801561063c57600080fd5b506103c5611b8b565b34801561065157600080fd5b5061051a611ce7565b34801561066657600080fd5b50610314610675366004614127565b611cf6565b34801561068657600080fd5b506103c5610695366004614127565b611ed6565b3480156106a657600080fd5b5061033f611f0e565b3480156106bb57600080fd5b506103c56106ca366004614227565b611f69565b3480156106db57600080fd5b506103c56120f3565b3480156106f057600080fd5b5061051a6120f9565b34801561070557600080fd5b5061036c610714366004614227565b612108565b6103c5610727366004614227565b6122f8565b34801561073857600080fd5b506103ae6107473660046141e7565b6124ab565b34801561075857600080fd5b506103ae610767366004614127565b6126f2565b34801561077857600080fd5b506103ae610787366004614197565b6127a2565b34801561079857600080fd5b5061051a612a7d565b3480156107ad57600080fd5b506103c5612a8c565b3480156107c257600080fd5b506103c56107d136600461415f565b612aa8565b3480156107e257600080fd5b506103ae6107f1366004614127565b612ad3565b610809610804366004614197565b612b5a565b60405161032193929190614bcc565b34801561082457600080fd5b506103c5612f56565b6103c561083b366004614227565b6130b1565b34801561084c57600080fd5b5061051a613324565b34801561086157600080fd5b506103ae610870366004614127565b613333565b61087d613ff5565b610885613ff5565b6001600160a01b03831660009081526009602052604090205481526108a983611049565b60208201526108b66110bb565b604082015290505b919050565b600e805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b505050505081565b3360008181526011602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109aa908690614bc3565b60405180910390a35060015b92915050565b601054610100900460ff1681565b6109d26133f3565b6001600160a01b03166109e3611ce7565b6001600160a01b031614610a125760405162461bcd60e51b8152600401610a09906148ac565b60405180910390fd5b601054610100900460ff1615610a3a5760405162461bcd60e51b8152600401610a099061477a565b610a426133f7565b8251610a5590600e906020860190614016565b508151610a6990600f906020850190614016565b506010805461ff001960ff90931660ff1990911617919091166101001790555050565b60065481565b600c5442118015610aad57506003546001600160a01b031615155b15610c03576003546000906001600160a01b03166315f24053610ace613409565b6008546007546040518463ffffffff1660e01b8152600401610af293929190614bcc565b60206040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b429190614304565b90506000610b65610b5e600c54426134a890919063ffffffff16565b83906134d0565b90506000610b90670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b9061350a565b600854909150610ba0908261353c565b600855600b54610bcc90610bc390670de0b6b3a764000090610b8a9085906134d0565b6007549061353c565b600755600d54610bf890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d549061353c565b600d55505042600c55505b610c0b6133f3565b6001600160a01b0316610c1c611ce7565b6001600160a01b031614610c425760405162461bcd60e51b8152600401610a09906148ac565b670de0b6b3a7640000811115610c6a5760405162461bcd60e51b8152600401610a0990614afd565b600b55565b6000600c5442118015610c8c57506003546001600160a01b031615155b15610dc3576003546000906001600160a01b03166315f24053610cad613409565b6008546007546040518463ffffffff1660e01b8152600401610cd193929190614bcc565b60206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190614304565b90506000610d3d610b5e600c54426134a890919063ffffffff16565b90506000610d62670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150610d72908261353c565b600855600b54610d9590610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54610db890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b60026001541415610de65760405162461bcd60e51b8152600401610a0990614b34565b60026001819055546040516368155ec160e01b81526001600160a01b03909116906368155ec190610e21903390889088908890600401614379565b600060405180830381600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505060018080559695505050505050565b600c5442118015610e7b57506003546001600160a01b031615155b15610fb2576003546000906001600160a01b03166315f24053610e9c613409565b6008546007546040518463ffffffff1660e01b8152600401610ec093929190614bcc565b60206040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f109190614304565b90506000610f2c610b5e600c54426134a890919063ffffffff16565b90506000610f51670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150610f61908261353c565b600855600b54610f8490610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54610fa790610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6004546001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610a09906147d6565b60026001541415610fff5760405162461bcd60e51b8152600401610a0990614b34565b600260015560075461100f6110ab565b1061103a576007548015611038576000600755600454611038906001600160a01b031682613561565b505b60018055565b60105460ff1681565b6000611053613ff5565b61105b61359b565b6001600160a01b0384166000908152600a60205260409020805491925090611088576000925050506108be565b6001810154604083015182546110a39291610b8a91906134d0565b949350505050565b60006110b5613409565b90505b90565b6000600654600014156110d75750670de0b6b3a76400006110b8565b6110df613ff5565b6110e761359b565b9050611125600654610b8a670de0b6b3a764000061111f85602001516111198760000151611113613409565b9061353c565b906134a8565b906134d0565b91505090565b600b5481565b6000600c544211801561114e57506003546001600160a01b031615155b15611285576003546000906001600160a01b03166315f2405361116f613409565b6008546007546040518463ffffffff1660e01b815260040161119393929190614bcc565b60206040518083038186803b1580156111ab57600080fd5b505afa1580156111bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e39190614304565b905060006111ff610b5e600c54426134a890919063ffffffff16565b90506000611224670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611234908261353c565b600855600b5461125790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461127a90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146112af5760405162461bcd60e51b8152600401610a0990614a49565b816112b86110ab565b10156112d65760405162461bcd60e51b8152600401610a09906148e1565b6112e28383600061370d565b6112ec8383613561565b7fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af838361131886611049565b6040516113279392919061443c565b60405180910390a150919050565b60075481565b60085481565b6000600c544211801561135e57506003546001600160a01b031615155b15611495576003546000906001600160a01b03166315f2405361137f613409565b6008546007546040518463ffffffff1660e01b81526004016113a393929190614bcc565b60206040518083038186803b1580156113bb57600080fd5b505afa1580156113cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f39190614304565b9050600061140f610b5e600c54426134a890919063ffffffff16565b90506000611434670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611444908261353c565b600855600b5461146790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461148a90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146114bf5760405162461bcd60e51b8152600401610a0990614a49565b6005546110a390859085906001600160a01b0316156114de57846114e0565b345b6137b5565b6004546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b031660009081526009602052604090205490565b6115266133f3565b6001600160a01b0316611537611ce7565b6001600160a01b03161461155d5760405162461bcd60e51b8152600401610a09906148ac565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c54421180156115c257506003546001600160a01b031615155b156116f9576003546000906001600160a01b03166315f240536115e3613409565b6008546007546040518463ffffffff1660e01b815260040161160793929190614bcc565b60206040518083038186803b15801561161f57600080fd5b505afa158015611633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116579190614304565b90506000611673610b5e600c54426134a890919063ffffffff16565b90506000611698670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506116a8908261353c565b600855600b546116cb90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546116ee90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6117016133f3565b6001600160a01b0316611712611ce7565b6001600160a01b0316146117385760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b03811661175e5760405162461bcd60e51b8152600401610a0990614991565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b61178e6133f3565b6001600160a01b031661179f611ce7565b6001600160a01b0316146117c55760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166117eb5760405162461bcd60e51b8152600401610a099061454f565b6002546001600160a01b0316156118145760405162461bcd60e51b8152600401610a09906145bd565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000611840613ff5565b61184861359b565b5191505090565b6000600c544211801561186c57506003546001600160a01b031615155b156119a3576003546000906001600160a01b03166315f2405361188d613409565b6008546007546040518463ffffffff1660e01b81526004016118b193929190614bcc565b60206040518083038186803b1580156118c957600080fd5b505afa1580156118dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119019190614304565b9050600061191d610b5e600c54426134a890919063ffffffff16565b90506000611942670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611952908261353c565b600855600b5461197590610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461199890610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146119cd5760405162461bcd60e51b8152600401610a0990614a49565b6119d983836000613875565b9392505050565b6000600c54421180156119fd57506003546001600160a01b031615155b15611b34576003546000906001600160a01b03166315f24053611a1e613409565b6008546007546040518463ffffffff1660e01b8152600401611a4293929190614bcc565b60206040518083038186803b158015611a5a57600080fd5b505afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190614304565b90506000611aae610b5e600c54426134a890919063ffffffff16565b90506000611ad3670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611ae3908261353c565b600855600b54611b0690610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611b2990610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6001600160a01b0382166000908152600a60205260409020600181015415611b7a576001810154600d548254611b6f9291610b8a91906134d0565b8155600d5460018201555b5492915050565b60006110b5611ce7565b6000600c5442118015611ba857506003546001600160a01b031615155b15611cdf576003546000906001600160a01b03166315f24053611bc9613409565b6008546007546040518463ffffffff1660e01b8152600401611bed93929190614bcc565b60206040518083038186803b158015611c0557600080fd5b505afa158015611c19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3d9190614304565b90506000611c59610b5e600c54426134a890919063ffffffff16565b90506000611c7e670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611c8e908261353c565b600855600b54611cb190610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611cd490610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6110b56110bb565b6000546001600160a01b031690565b611cfe613ff5565b600c5442118015611d1957506003546001600160a01b031615155b15611e50576003546000906001600160a01b03166315f24053611d3a613409565b6008546007546040518463ffffffff1660e01b8152600401611d5e93929190614bcc565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190614304565b90506000611dca610b5e600c54426134a890919063ffffffff16565b90506000611def670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150611dff908261353c565b600855600b54611e2290610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54611e4590610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b611e58613ff5565b6001600160a01b0383166000908152600a60205260409020600181015415611e9e576001810154600d548254611e939291610b8a91906134d0565b8155600d5460018201555b6001600160a01b0384166000908152600960209081526040909120548352815490830152611eca6110bb565b60408301525092915050565b60006109b6670de0b6b3a7640000610b8a611eef6110bb565b6001600160a01b038616600090815260096020526040902054906134d0565b600f805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109495780601f1061091e57610100808354040283529160200191610949565b6000600c5442118015611f8657506003546001600160a01b031615155b156120bd576003546000906001600160a01b03166315f24053611fa7613409565b6008546007546040518463ffffffff1660e01b8152600401611fcb93929190614bcc565b60206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201b9190614304565b90506000612037610b5e600c54426134a890919063ffffffff16565b9050600061205c670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b60085490915061206c908261353c565b600855600b5461208f90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546120b290610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146120e75760405162461bcd60e51b8152600401610a0990614a49565b6119d983600084613875565b600d5481565b6003546001600160a01b031681565b6000600c544211801561212557506003546001600160a01b031615155b1561225c576003546000906001600160a01b03166315f24053612146613409565b6008546007546040518463ffffffff1660e01b815260040161216a93929190614bcc565b60206040518083038186803b15801561218257600080fd5b505afa158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba9190614304565b905060006121d6610b5e600c54426134a890919063ffffffff16565b905060006121fb670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b60085490915061220b908261353c565b600855600b5461222e90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461225190610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002600154141561227f5760405162461bcd60e51b8152600401610a0990614b34565b60026001819055546040516368155ec160e01b81526001600160a01b03909116906368155ec1906122ba903390819088908890600401614379565b600060405180830381600087803b1580156122d457600080fd5b505af11580156122e8573d6000803e3d6000fd5b5050600180805595945050505050565b6000600c544211801561231557506003546001600160a01b031615155b1561244c576003546000906001600160a01b03166315f24053612336613409565b6008546007546040518463ffffffff1660e01b815260040161235a93929190614bcc565b60206040518083038186803b15801561237257600080fd5b505afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa9190614304565b905060006123c6610b5e600c54426134a890919063ffffffff16565b905060006123eb670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506123fb908261353c565b600855600b5461241e90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461244190610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146124765760405162461bcd60e51b8152600401610a0990614a49565b60001982141561248c5761248983611049565b91505b6005546119d990849081906001600160a01b0316156114de57846114e0565b600c54421180156124c657506003546001600160a01b031615155b156125fd576003546000906001600160a01b03166315f240536124e7613409565b6008546007546040518463ffffffff1660e01b815260040161250b93929190614bcc565b60206040518083038186803b15801561252357600080fd5b505afa158015612537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255b9190614304565b90506000612577610b5e600c54426134a890919063ffffffff16565b9050600061259c670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506125ac908261353c565b600855600b546125cf90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546125f290610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b031633146126275760405162461bcd60e51b8152600401610a0990614a49565b6002600154141561264a5760405162461bcd60e51b8152600401610a0990614b34565b60026001556001600160a01b03821660009081526009602052604090205461267290826134a8565b6001600160a01b0380841660009081526009602052604080822093909355908516815220546126a1908261353c565b6001600160a01b038085166000818152600960205260409081902093909355915190841690600080516020614c62833981519152906126e1908590614bc3565b60405180910390a350506001805550565b6126fa6133f3565b6001600160a01b031661270b611ce7565b6001600160a01b0316146127315760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166127575760405162461bcd60e51b8152600401610a0990614692565b6005546001600160a01b0316156127805760405162461bcd60e51b8152600401610a099061470c565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146127cc5760405162461bcd60e51b8152600401610a0990614a49565b816001600160a01b0316836001600160a01b0316141580156128f05750600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286f9190614143565b6001600160a01b031663eabe7d913085846040518463ffffffff1660e01b815260040161289e939291906143a3565b602060405180830381600087803b1580156128b857600080fd5b505af11580156128cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f09190614252565b61290c5760405162461bcd60e51b8152600401610a09906145f4565b806129295760405162461bcd60e51b8152600401610a0990614522565b6000836001600160a01b0316856001600160a01b03161461296f576001600160a01b03808516600090815260116020908152604080832093891683529290522054612973565b6000195b9050600061299c83604051806060016040528060298152602001614c3960299139849190613b41565b6001600160a01b0386166000908152600960205260409020549091506129c290846134a8565b6001600160a01b0380871660009081526009602052604080822093909355908616815220546129f1908461353c565b6001600160a01b0385166000908152600960205260409020556000198214612a3c576001600160a01b038086166000908152601160209081526040808320938a168352929052208190555b836001600160a01b0316856001600160a01b0316600080516020614c6283398151915285604051612a6d9190614bc3565b60405180910390a3505050505050565b6003546001600160a01b031690565b6000612a96613ff5565b612a9e61359b565b6040015191505090565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b612adb6133f3565b6001600160a01b0316612aec611ce7565b6001600160a01b031614612b125760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b038116612b385760405162461bcd60e51b8152600401610a09906149d4565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000600c5442118015612b7a57506003546001600160a01b031615155b15612cb1576003546000906001600160a01b03166315f24053612b9b613409565b6008546007546040518463ffffffff1660e01b8152600401612bbf93929190614bcc565b60206040518083038186803b158015612bd757600080fd5b505afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f9190614304565b90506000612c2b610b5e600c54426134a890919063ffffffff16565b90506000612c50670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150612c60908261353c565b600855600b54612c8390610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d54612ca690610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b03163314612cdb5760405162461bcd60e51b8152600401610a0990614a49565b856001600160a01b0316856001600160a01b03161415612d0d5760405162461bcd60e51b8152600401610a099061449b565b6005546001600160a01b031615612d245783612d26565b345b9350612d338686866137b5565b9350600084118015612d46575060001984105b612d625760405162461bcd60e51b8152600401610a0990614b6b565b600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612db057600080fd5b505afa158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190614143565b6001600160a01b0316631ed4a1743089876040518463ffffffff1660e01b8152600401612e17939291906143a3565b606060405180830381600087803b158015612e3157600080fd5b505af1158015612e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e69919061431c565b6040516370a0823160e01b8152929550909350915083906001600160a01b038916906370a0823190612e9f908990600401614365565b60206040518083038186803b158015612eb757600080fd5b505afa158015612ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eef9190614304565b1015612f0d5760405162461bcd60e51b8152600401610a099061484e565b7f298637f684da70674f26509b10f07ec2fbc77a335ab1e7d6215a4b2484d8bb528686868a87604051612f449594939291906143c7565b60405180910390a19450945094915050565b6000600c5442118015612f7357506003546001600160a01b031615155b156130aa576003546000906001600160a01b03166315f24053612f94613409565b6008546007546040518463ffffffff1660e01b8152600401612fb893929190614bcc565b60206040518083038186803b158015612fd057600080fd5b505afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614304565b90506000613024610b5e600c54426134a890919063ffffffff16565b90506000613049670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b600854909150613059908261353c565b600855600b5461307c90610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d5461309f90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b5060085490565b6000600c54421180156130ce57506003546001600160a01b031615155b15613205576003546000906001600160a01b03166315f240536130ef613409565b6008546007546040518463ffffffff1660e01b815260040161311393929190614bcc565b60206040518083038186803b15801561312b57600080fd5b505afa15801561313f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131639190614304565b9050600061317f610b5e600c54426134a890919063ffffffff16565b905060006131a4670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506131b4908261353c565b600855600b546131d790610bc390670de0b6b3a764000090610b8a9085906134d0565b600755600d546131fa90610bef90670de0b6b3a764000090610b8a9086906134d0565b600d55505042600c55505b6002546001600160a01b0316331461322f5760405162461bcd60e51b8152600401610a0990614a49565b60006132396110bb565b6005549091506001600160a01b0316156132535782613255565b345b92506132618484613b6d565b9250600061327b82610b8a86670de0b6b3a76400006134d0565b90506000811161329d5760405162461bcd60e51b8152600401610a099061495a565b6132a985826000613cf9565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688585826040516132da929190614423565b60405180910390a1846001600160a01b031660006001600160a01b0316600080516020614c62833981519152836040516133149190614bc3565b60405180910390a3949350505050565b6002546001600160a01b031681565b61333b6133f3565b6001600160a01b031661334c611ce7565b6001600160a01b0316146133725760405162461bcd60e51b8152600401610a09906148ac565b6001600160a01b0381166133985760405162461bcd60e51b8152600401610a09906144dc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b42600c55670de0b6b3a7640000600d55565b6005546000906001600160a01b0316156134a2576005546040516370a0823160e01b81526001600160a01b03909116906370a082319061344d903090600401614365565b60206040518083038186803b15801561346557600080fd5b505afa158015613479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349d9190614304565b6110b5565b6110b547345b6000828211156134ca5760405162461bcd60e51b8152600401610a099061465b565b50900390565b6000826134df575060006109b6565b828202828482816134ec57fe5b04146119d95760405162461bcd60e51b8152600401610a099061480d565b600080821161352b5760405162461bcd60e51b8152600401610a09906146d5565b81838161353457fe5b049392505050565b6000828201838110156119d95760405162461bcd60e51b8152600401610a0990614586565b6005546001600160a01b03166135805761357b8282613d6e565b613597565b600554613597906001600160a01b03168383613e00565b5050565b6135a3613ff5565b6135ab613ff5565b60085481526007546020820152600d546040820152600c54421180156135d357506000600854115b156110b5576003546000906001600160a01b03166315f240536135f4613409565b6008546007546040518463ffffffff1660e01b815260040161361893929190614bcc565b60206040518083038186803b15801561363057600080fd5b505afa158015613644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136689190614304565b90506000613684610b5e600c54426134a890919063ffffffff16565b905060006136a9670de0b6b3a7640000610b8a846008546134d090919063ffffffff16565b6008549091506136b9908261353c565b8452600b546136db90610bc390670de0b6b3a764000090610b8a9085906134d0565b6020850152600d5461370090610bef90670de0b6b3a764000090610b8a9086906134d0565b6040850152505050905090565b6001600160a01b0383166000908152600a60205260409020600181015461373757600d5460018201555b61376082611119856111138560010154610b8a600d5488600001546134d090919063ffffffff16565b8155600d54600182015560085461377d908390611119908661353c565b60085580546103e811613791578054613794565b60005b81556008546103e8116137a9576008546137ac565b60005b60085550505050565b6000806137c184611049565b905060006137cf8285613eee565b90506137db8682613b6d565b90506137e98560008361370d565b6005546001600160a01b0316613827576000818511613809576000613813565b61381385836134a8565b90508015613825576138258782613561565b505b7fa9a154237a69922f8860321d1fec1624a5dbe8a8af89a3dd3d7a759f6c8080d886868361385489611049565b60405161386494939291906143fa565b60405180910390a195945050505050565b6000821580613882575081155b61389e5760405162461bcd60e51b8152600401610a0990614aab565b8260065410156138c05760405162461bcd60e51b8152600401610a0990614743565b816138c96110ab565b1015806138d4575081155b6138f05760405162461bcd60e51b8152600401610a0990614923565b61390e670de0b6b3a7640000610b8a6139076110bb565b86906134d0565b6139166110ab565b101580613921575082155b61393d5760405162461bcd60e51b8152600401610a0990614923565b6000808411613968576139636139516110bb565b610b8a85670de0b6b3a76400006134d0565b61396a565b835b9050600080851161397b5783613999565b613999670de0b6b3a7640000610b8a6139926110bb565b88906134d0565b9050600260009054906101000a90046001600160a01b03166001600160a01b0316633a5381b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156139e957600080fd5b505afa1580156139fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a219190614143565b6001600160a01b031663eabe7d913088856040518463ffffffff1660e01b8152600401613a50939291906143a3565b602060405180830381600087803b158015613a6a57600080fd5b505af1158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190614252565b613abe5760405162461bcd60e51b8152600401610a09906147a7565b613aca86600084613cf9565b613ad48682613561565b60006001600160a01b0316866001600160a01b0316600080516020614c6283398151915284604051613b069190614bc3565b60405180910390a37fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9298682846040516138649392919061443c565b60008184841115613b655760405162461bcd60e51b8152600401610a099190614468565b505050900390565b6005546000906001600160a01b0316613bb15781341015613ba05760405162461bcd60e51b8152600401610a099061462b565b613baa3483613eee565b90506109b6565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613be2903090600401614365565b60206040518083038186803b158015613bfa57600080fd5b505afa158015613c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c329190614304565b600554909150613c4d906001600160a01b0316853086613f04565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613c7e903090600401614365565b60206040518083038186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cce9190614304565b905083613cdb82846134a8565b1115613ce657600080fd5b613cf081836134a8565b925050506109b6565b6001600160a01b038316600090815260096020526040902054613d22908290611119908561353c565b6001600160a01b038416600090815260096020526040902055600654613d4e908290611119908561353c565b60068190556103e811613d6357600654613d66565b60005b600655505050565b604080516000808252602082019092526001600160a01b038416908390604051613d989190614349565b60006040518083038185875af1925050503d8060008114613dd5576040519150601f19603f3d011682016040523d82523d6000602084013e613dda565b606091505b5050905080613dfb5760405162461bcd60e51b8152600401610a0990614a1f565b505050565b60006060846001600160a01b031663a9059cbb8585604051602401613e26929190614423565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613e5f9190614349565b6000604051808303816000865af19150503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150818015613ecb575080511580613ecb575080806020019051810190613ecb9190614252565b613ee75760405162461bcd60e51b8152600401610a0990614885565b5050505050565b6000818310613efd57816119d9565b5090919050565b60006060856001600160a01b03166323b872dd868686604051602401613f2c939291906143a3565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051613f659190614349565b6000604051808303816000865af19150503d8060008114613fa2576040519150601f19603f3d011682016040523d82523d6000602084013e613fa7565b606091505b5091509150818015613fd1575080511580613fd1575080806020019051810190613fd19190614252565b613fed5760405162461bcd60e51b8152600401610a0990614a80565b505050505050565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061405757805160ff1916838001178555614084565b82800160010185558215614084579182015b82811115614084578251825591602001919060010190614069565b50614090929150614094565b5090565b5b808211156140905760008155600101614095565b600082601f8301126140b9578081fd5b813567ffffffffffffffff808211156140d0578283fd5b604051601f8301601f1916810160200182811182821017156140f0578485fd5b60405282815292508284830160200186101561410b57600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215614138578081fd5b81356119d981614c20565b600060208284031215614154578081fd5b81516119d981614c20565b60008060408385031215614171578081fd5b823561417c81614c20565b9150602083013561418c81614c20565b809150509250929050565b600080600080608085870312156141ac578182fd5b84356141b781614c20565b935060208501356141c781614c20565b925060408501356141d781614c20565b9396929550929360600135925050565b6000806000606084860312156141fb578283fd5b833561420681614c20565b9250602084013561421681614c20565b929592945050506040919091013590565b60008060408385031215614239578182fd5b823561424481614c20565b946020939093013593505050565b600060208284031215614263578081fd5b815180151581146119d9578182fd5b600080600060608486031215614286578283fd5b833567ffffffffffffffff8082111561429d578485fd5b6142a9878388016140a9565b945060208601359150808211156142be578384fd5b506142cb868287016140a9565b925050604084013560ff811681146142e1578182fd5b809150509250925092565b6000602082840312156142fd578081fd5b5035919050565b600060208284031215614315578081fd5b5051919050565b600080600060608486031215614330578283fd5b8351925060208401519150604084015190509250925092565b6000825161435b818460208701614bf0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039586168152938516602085015260408401929092529092166060820152608081019190915260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b6000602082528251806020840152614487816040850160208701614bf0565b601f01601f19169190910160400192915050565b60208082526021908201527f4c546f6b656e3a2063616e6e6f74206c697175696461746520796f757273656c6040820152603360f91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526013908201527213151bdad95b8e881e995c9bc8185b5bdd5b9d606a1b604082015260600190565b6020808252601d908201527f474d61726b65743a20696e76616c696420636f72652061646472657373000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526019908201527f474d61726b65743a20636f726520616c72656164792073657400000000000000604082015260600190565b60208082526017908201527f4c546f6b656e3a2063616e6e6f74207472616e73666572000000000000000000604082015260600190565b602080825260169082015275098a8ded6cadc7440ecc2d8eaca40dad2e6dac2e8c6d60531b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526023908201527f474d61726b65743a20696e76616c696420756e6465726c79696e67206164647260408201526265737360e81b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601f908201527f474d61726b65743a2073657420756e6465726c79696e6720616c726561647900604082015260600190565b6020808252601f908201527f4c546f6b656e3a206e6f7420656e6f75676820746f74616c20737570706c7900604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b6020808252601590820152744c546f6b656e3a2063616e6e6f742072656465656d60581b604082015260600190565b6020808252601e908201527f47546f6b656e3a206f6e6c79205265626174654469737472696275746f720000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f4c546f6b656e3a20746f6f206d756368207365697a6520616d6f756e74000000604082015260600190565b6020808252600d908201526c10b9b0b332aa3930b739b332b960991b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4c546f6b656e3a20626f72726f7720616d6f756e7420657863656564732063616040820152610e6d60f31b606082015260800190565b6020808252601d908201527f4c546f6b656e3a206e6f7420656e6f75676820756e6465726c79696e67000000604082015260600190565b60208082526017908201527f4c546f6b656e3a20696e76616c69642067416d6f756e74000000000000000000604082015260600190565b60208082526023908201527f474d61726b65743a20696e76616c69642072617465206d6f64656c206164647260408201526265737360e81b606082015260800190565b6020808252602b908201527f474d61726b65743a20696e76616c69642072656261746520646973747269627560408201526a746f72206164647265737360a81b606082015260800190565b60208082526010908201526f042e6c2cccaa8e4c2dce6cccae48aa8960831b604082015260600190565b6020808252601a908201527f47546f6b656e3a206f6e6c7920436f726520436f6e7472616374000000000000604082015260600190565b60208082526011908201527021736166655472616e7366657246726f6d60781b604082015260600190565b60208082526032908201527f4c546f6b656e3a206f6e65206f662067416d6f756e74496e206f722075416d6f604082015271756e74496e206d757374206265207a65726f60701b606082015260800190565b6020808252601f908201527f474d61726b65743a20696e76616c6964207265736572766520666163746f7200604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601c908201527f4c546f6b656e3a20696e76616c696420726570617920616d6f756e7400000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60005b83811015614c0b578181015183820152602001614bf3565b83811115614c1a576000848401525b50505050565b6001600160a01b0381168114614c3557600080fd5b5056fe4c546f6b656e3a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b9533ae8ddf3214370c6c33cf4a3b9c55b5ac65cc7a96fd93fe88da8e454105464736f6c634300060c0033
Deployed Bytecode Sourcemap
45897:11745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38139:339;;;;;;;;;;-1:-1:-1;38139:339:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46042:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48406:212::-;;;;;;;;;;-1:-1:-1;48406:212:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46136:23::-;;;;;;;;;;;;;:::i;47096:284::-;;;;;;;;;;-1:-1:-1;47096:284:0;;;;;:::i;:::-;;:::i;:::-;;34160:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37330:204::-;;;;;;;;;;-1:-1:-1;37330:204:0;;;;;:::i;:::-;;:::i;48086:197::-;;;;;;;;;;-1:-1:-1;48086:197:0;;;;;:::i;:::-;;:::i;53008:307::-;;;;;;;;;;;;;:::i;46090:21::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38900:343::-;;;;;;;;;;-1:-1:-1;38900:343:0;;;;;:::i;:::-;;:::i;40057:92::-;;;;;;;;;;;;;:::i;39604:289::-;;;;;;;;;;;;;:::i;34437:37::-;;;;;;;;;;;;;:::i;50147:344::-;;;;;;;;;;-1:-1:-1;50147:344:0;;;;;:::i;:::-;;:::i;34226:36::-;;;;;;;;;;;;;:::i;34267:::-;;;;;;;;;;;;;:::i;51209:248::-;;;;;;:::i;:::-;;:::i;34071:43::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34119:34::-;;;;;;;;;;;;;:::i;37924:121::-;;;;;;;;;;-1:-1:-1;37924:121:0;;;;;:::i;:::-;;:::i;30286:148::-;;;;;;;;;;;;;:::i;36982:192::-;;;;;;;;;;-1:-1:-1;36982:192:0;;;;;:::i;:::-;;:::i;34479:39::-;;;;;;;;;;;;;:::i;36173:221::-;;;;;;;;;;-1:-1:-1;36173:221:0;;;;;:::i;:::-;;:::i;39283:174::-;;;;;;;;;;;;;:::i;49544:157::-;;;;;;;;;;-1:-1:-1;49544:157:0;;;;;:::i;:::-;;:::i;41248:357::-;;;;;;;;;;-1:-1:-1;41248:357:0;;;;;:::i;:::-;;:::i;47756:79::-;;;;;;;;;;;;;:::i;41857:108::-;;;;;;;;;;;;;:::i;29635:87::-;;;;;;;;;;;;;:::i;40607:571::-;;;;;;;;;;-1:-1:-1;40607:571:0;;;;;:::i;:::-;;:::i;38641:161::-;;;;;;;;;;-1:-1:-1;38641:161:0;;;;;:::i;:::-;;:::i;46065:20::-;;;;;;;;;;;;;:::i;49856:162::-;;;;;;;;;;-1:-1:-1;49856:162:0;;;;;:::i;:::-;;:::i;34523:40::-;;;;;;;;;;;;;:::i;34039:27::-;;;;;;;;;;;;;:::i;47893:187::-;;;;;;;;;;-1:-1:-1;47893:187:0;;;;;:::i;:::-;;:::i;50665:290::-;;;;;;:::i;:::-;;:::i;52676:326::-;;;;;;;;;;-1:-1:-1;52676:326:0;;;;;:::i;:::-;;:::i;36629:253::-;;;;;;;;;;-1:-1:-1;36629:253:0;;;;;:::i;:::-;;:::i;53525:806::-;;;;;;;;;;-1:-1:-1;53525:806:0;;;;;:::i;:::-;;:::i;40155:103::-;;;;;;;;;;;;;:::i;40303:187::-;;;;;;;;;;;;;:::i;47563:151::-;;;;;;;;;;-1:-1:-1;47563:151:0;;;;;:::i;:::-;;:::i;37540:241::-;;;;;;;;;;-1:-1:-1;37540:241:0;;;;;:::i;:::-;;:::i;51717:953::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;41673:105::-;;;;;;;;;;;;;:::i;48871:538::-;;;;;;:::i;:::-;;:::i;34017:17::-;;;;;;;;;;;;;:::i;30589:244::-;;;;;;;;;;-1:-1:-1;30589:244:0;;;;;:::i;:::-;;:::i;38139:339::-;38213:31;;:::i;:::-;38253:40;;:::i;:::-;-1:-1:-1;;;;;38325:24:0;;;;;;:15;:24;;;;;;38300:49;;38381:24;38341:7;38381:15;:24::i;:::-;38356:22;;;:49;38436:14;:12;:14::i;:::-;38412:21;;;:38;:8;-1:-1:-1;38139:339:0;;;;:::o;46042:18::-;;;;;;;;;;;;;;;-1:-1:-1;;46042:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48406:212::-;48516:10;48483:4;48496:31;;;:19;:31;;;;;;;;-1:-1:-1;;;;;48496:40:0;;;;;;;;;;:49;;;48557:37;48483:4;;48496:40;;48557:37;;;;48539:6;;48557:37;:::i;:::-;;;;;;;;-1:-1:-1;48608:4:0;48406:212;;;;;:::o;46136:23::-;;;;;;;;;:::o;47096:284::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;;;;;;;;;47211:11:::1;::::0;::::1;::::0;::::1;;;:20;47203:52;;;;-1:-1:-1::0;;;47203:52:0::1;;;;;;;:::i;:::-;47262:16;:14;:16::i;:::-;47287:12:::0;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;47306:16:0;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;47329:8:0::1;:20:::0;;-1:-1:-1;;47329:20:0::1;::::0;;::::1;-1:-1:-1::0;;47329:20:0;;::::1;;47356:18:::0;;;::::1;47329:20;47356:18;::::0;;-1:-1:-1;;47096:284:0:o;34160:35::-;;;;:::o;37330:204::-;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;:::-;35169:10;;:14;:52::i;:::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:::-;:36;;:42::i;:::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;:44::-;35381:12;;;:16;:62::i;:::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;:46::-;35471:16;;;:20;:68::i;:::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;29866:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;29855:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;29855:23:0::1;;29847:68;;;;-1:-1:-1::0;;;29847:68:0::1;;;;;;;:::i;:::-;33834:4:::2;37419:14;:36;;37411:80;;;;-1:-1:-1::0;;;37411:80:0::2;;;;;;;:::i;:::-;37498:13;:30:::0;37330:204::o;48086:197::-;48197:4;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;32596:1:::1;33202:7;;:19;;33194:63;;;;-1:-1:-1::0;;;33194:63:0::1;;;;;;;:::i;:::-;32596:1;33335:7;:18:::0;;;48210:4;:49:::2;::::0;-1:-1:-1;;;48210:49:0;;-1:-1:-1;;;;;48210:4:0;;::::2;::::0;:19:::2;::::0;:49:::2;::::0;48230:10:::2;::::0;48242:3;;48247;;48252:6;;48210:49:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;48273:4:0::2;33514:22:::0;;;48273:4;48086:197;-1:-1:-1;;;;;;48086:197:0:o;53008:307::-;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35845:17:::1;::::0;-1:-1:-1;;;;;35845:17:0::1;35823:10;:40;35815:83;;;;-1:-1:-1::0;;;35815:83:0::1;;;;;;;:::i;:::-;32596:1:::2;33202:7;;:19;;33194:63;;;;-1:-1:-1::0;;;33194:63:0::2;;;;;;;:::i;:::-;32596:1;33335:7;:18:::0;53120:12:::3;::::0;53107:9:::3;:7;:9::i;:::-;:25;53103:207;;53160:12;::::0;53187:16;;53183:120:::3;;53231:1;53216:12;:16:::0;53266:17:::3;::::0;53243:50:::3;::::0;-1:-1:-1;;;;;53266:17:0::3;53286:6:::0;53243:14:::3;:50::i;:::-;53103:207;;32552:1:::2;33514:22:::0;;53008:307::o;46090:21::-;;;;;;:::o;38900:343::-;38972:7;38988:39;;:::i;:::-;39030:23;:21;:23::i;:::-;-1:-1:-1;;;;;39095:23:0;;39060:32;39095:23;;;:14;:23;;;;;39131:11;;38988:65;;-1:-1:-1;39095:23:0;39127:30;;39156:1;39149:8;;;;;;39127:30;39218:18;;;;39187:25;;;;39171:11;;:66;;39218:18;39171:42;;:11;:15;:42::i;:66::-;39164:73;38900:343;-1:-1:-1;;;;38900:343:0:o;40057:92::-;40106:7;40129:14;:12;:14::i;:::-;40122:21;;40057:92;;:::o;39604:289::-;39658:7;39678:11;;39693:1;39678:16;39674:33;;;-1:-1:-1;39703:4:0;39696:11;;39674:33;39714:39;;:::i;:::-;39756:23;:21;:23::i;:::-;39714:65;;39793:94;39875:11;;39793:77;39865:4;39793:67;39838:8;:21;;;39793:40;39812:8;:20;;;39793:14;:12;:14::i;:::-;:18;;:40::i;:::-;:44;;:67::i;:::-;:71;;:77::i;:94::-;39786:101;;;39604:289;:::o;34437:37::-;;;;:::o;50147:344::-;50239:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;50276:6:::2;50263:9;:7;:9::i;:::-;:19;;50255:66;;;;-1:-1:-1::0;;;50255:66:0::2;;;;;;;:::i;:::-;50328:36;50345:7;50354:6;50362:1;50328:16;:36::i;:::-;50371:31;50386:7;50395:6;50371:14;:31::i;:::-;50416:49;50423:7;50432:6;50440:24;50456:7;50440:15;:24::i;:::-;50416:49;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;50479:6:0;50147:344;-1:-1:-1;50147:344:0:o;34226:36::-;;;;:::o;34267:::-;;;;:::o;51209:248::-;51356:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;51403:10:::2;::::0;51379:72:::2;::::0;51386:5;;51393:8;;-1:-1:-1;;;;;51403:10:0::2;:26:::0;:47:::2;;51444:6;51403:47;;;51432:9;51403:47;51379:6;:72::i;34071:43::-:0;;;-1:-1:-1;;;;;34071:43:0;;:::o;34119:34::-;;;-1:-1:-1;;;;;34119:34:0;;:::o;37924:121::-;-1:-1:-1;;;;;38015:24:0;37992:7;38015:24;;;:15;:24;;;;;;;37924:121::o;30286:148::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;30393:1:::1;30377:6:::0;;30356:40:::1;::::0;-1:-1:-1;;;;;30377:6:0;;::::1;::::0;30356:40:::1;::::0;30393:1;;30356:40:::1;30424:1;30407:19:::0;;-1:-1:-1;;;;;;30407:19:0::1;::::0;;30286:148::o;36982:192::-;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;29866:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;29855:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;29855:23:0::1;;29847:68;;;;-1:-1:-1::0;;;29847:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37063:24:0;::::2;37055:72;;;;-1:-1:-1::0;;;37055:72:0::2;;;;;;;:::i;:::-;37134:9;:34:::0;;-1:-1:-1;;;;;;37134:34:0::2;-1:-1:-1::0;;;;;37134:34:0;;;::::2;::::0;;;::::2;::::0;;36982:192::o;34479:39::-;;;;:::o;36173:221::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36237:19:0;::::1;36229:61;;;;-1:-1:-1::0;;;36229:61:0::1;;;;;;;:::i;:::-;36313:4;::::0;-1:-1:-1;;;;;36313:4:0::1;36305:27:::0;36297:65:::1;;;;-1:-1:-1::0;;;36297:65:0::1;;;;;;;:::i;:::-;36369:4;:19:::0;;-1:-1:-1;;;;;;36369:19:0::1;-1:-1:-1::0;;;;;36369:19:0;;;::::1;::::0;;;::::1;::::0;;36173:221::o;39283:174::-;39336:7;39352:39;;:::i;:::-;39394:23;:21;:23::i;:::-;39431:20;;-1:-1:-1;;39283:174:0;:::o;49544:157::-;49643:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;49666:29:::2;49674:8;49684:7;49693:1;49666:7;:29::i;:::-;49659:36:::0;49544:157;-1:-1:-1;;;49544:157:0:o;41248:357::-;41331:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;-1:-1:-1;;;;;41382:23:0;::::1;41347:32;41382:23:::0;;;:14:::1;:23;::::0;;;;41416:18:::1;::::0;::::1;::::0;:23;41412:163:::1;;41502:18;::::0;::::1;::::0;41480:16:::1;::::0;41464:11;;:57:::1;::::0;41502:18;41464:33:::1;::::0;:11;:15:::1;:33::i;:57::-;41450:71:::0;;41551:16:::1;::::0;41530:18:::1;::::0;::::1;:37:::0;41412:163:::1;41588:11:::0;;41248:357;-1:-1:-1;;41248:357:0:o;47756:79::-;47799:7;47822;:5;:7::i;41857:108::-;41922:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;41945:14:::1;:12;:14::i;29635:87::-:0;29681:7;29708:6;-1:-1:-1;;;;;29708:6:0;29635:87;:::o;40607:571::-;40690:31;;:::i;:::-;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;40730:40:::1;;:::i;:::-;-1:-1:-1::0;;;;;40812:23:0;::::1;40777:32;40812:23:::0;;;:14:::1;:23;::::0;;;;40846:18:::1;::::0;::::1;::::0;:23;40842:163:::1;;40932:18;::::0;::::1;::::0;40910:16:::1;::::0;40894:11;;:57:::1;::::0;40932:18;40894:33:::1;::::0;:11;:15:::1;:33::i;:57::-;40880:71:::0;;40981:16:::1;::::0;40960:18:::1;::::0;::::1;:37:::0;40842:163:::1;-1:-1:-1::0;;;;;41038:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;;;;41013:49;;41094:11;;41069:22;;::::1;:36:::0;41136:14:::1;:12;:14::i;:::-;41112:21;::::0;::::1;:38:::0;-1:-1:-1;41112:21:0;40607:571;-1:-1:-1;;40607:571:0:o;38641:161::-;38719:7;38742:54;38791:4;38742:44;38771:14;:12;:14::i;:::-;-1:-1:-1;;;;;38742:24:0;;;;;;:15;:24;;;;;;;:28;:44::i;46065:20::-;;;;;;;;;;;;;;;-1:-1:-1;;46065:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49856:162;49960:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;49983:29:::2;49991:8;50001:1;50004:7;49983;:29::i;34523:40::-:0;;;;:::o;34039:27::-;;;-1:-1:-1;;;;;34039:27:0;;:::o;47893:187::-;47987:4;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;32596:1:::1;33202:7;;:19;;33194:63;;;;-1:-1:-1::0;;;33194:63:0::1;;;;;;;:::i;:::-;32596:1;33335:7;:18:::0;;;48000:4;:56:::2;::::0;-1:-1:-1;;;48000:56:0;;-1:-1:-1;;;;;48000:4:0;;::::2;::::0;:19:::2;::::0;:56:::2;::::0;48020:10:::2;::::0;;;48044:3;;48049:6;;48000:56:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;48070:4:0::2;33514:22:::0;;;48070:4;47893:187;-1:-1:-1;;;;;47893:187:0:o;50665:290::-;50770:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;50790:6:0::2;:21;50786:77;;;50831:24;50847:7;50831:15;:24::i;:::-;50822:33;;50786:77;50901:10;::::0;50876:73:::2;::::0;50883:7;;;;-1:-1:-1;;;;;50901:10:0::2;:26:::0;:47:::2;;50942:6;50901:47;;52676:326:::0;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;32596:1:::2;33202:7;;:19;;33194:63;;;;-1:-1:-1::0;;;33194:63:0::2;;;;;;;:::i;:::-;32596:1;33335:7;:18:::0;-1:-1:-1;;;;;52828:25:0;::::3;;::::0;;;:15:::3;:25;::::0;;;;;:38:::3;::::0;52858:7;52828:29:::3;:38::i;:::-;-1:-1:-1::0;;;;;52800:25:0;;::::3;;::::0;;;:15:::3;:25;::::0;;;;;:66;;;;52903:27;;::::3;::::0;;;;:40:::3;::::0;52935:7;52903:31:::3;:40::i;:::-;-1:-1:-1::0;;;;;52873:27:0;;::::3;;::::0;;;:15:::3;:27;::::0;;;;;;:70;;;;52957:39;;;;::::3;::::0;-1:-1:-1;;;;;;;;;;;52957:39:0;::::3;::::0;52988:7;;52957:39:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;32552:1:0::2;33514:22:::0;;-1:-1:-1;52676:326:0:o;36629:253::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36705:25:0;::::1;36697:73;;;;-1:-1:-1::0;;;36697:73:0::1;;;;;;;:::i;:::-;36785:10;::::0;-1:-1:-1;;;;;36785:10:0::1;:24:::0;36777:68:::1;;;;-1:-1:-1::0;;;36777:68:0::1;;;;;;;:::i;:::-;36852:10;:24:::0;;-1:-1:-1;;;;;;36852:24:0::1;-1:-1:-1::0;;;;;36852:24:0;;;::::1;::::0;;;::::1;::::0;;36629:253::o;53525:806::-;35719:4;;-1:-1:-1;;;;;35719:4:0;35697:10;:27;35689:66;;;;-1:-1:-1;;;35689:66:0;;;;;;;:::i;:::-;53698:3:::1;-1:-1:-1::0;;;;;53691:10:0::1;:3;-1:-1:-1::0;;;;;53691:10:0::1;;;:84;;;;;53716:4;;;;;;;;;-1:-1:-1::0;;;;;53716:4:0::1;-1:-1:-1::0;;;;;53716:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53705:42:0::1;;53756:4;53763:3;53768:6;53705:70;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53675:141;;;;-1:-1:-1::0;;;53675:141:0::1;;;;;;;:::i;:::-;53831:11:::0;53823:43:::1;;;;-1:-1:-1::0;;;53823:43:0::1;;;;;;;:::i;:::-;53873:18;53905:3;-1:-1:-1::0;;;;;53894:14:0::1;:7;-1:-1:-1::0;;;;;53894:14:0::1;;:64;;-1:-1:-1::0;;;;;53925:24:0;;::::1;;::::0;;;:19:::1;:24;::::0;;;;;;;:33;;::::1;::::0;;;;;;;53894:64:::1;;;-1:-1:-1::0;;53894:64:0::1;53873:85;;53965:21;53989:67;54004:6;53989:67;;;;;;;;;;;;;;;;;:10:::0;;:67;:14:::1;:67::i;:::-;-1:-1:-1::0;;;;;54088:20:0;::::1;;::::0;;;:15:::1;:20;::::0;;;;;53965:91;;-1:-1:-1;54088:32:0::1;::::0;54113:6;54088:24:::1;:32::i;:::-;-1:-1:-1::0;;;;;54065:20:0;;::::1;;::::0;;;:15:::1;:20;::::0;;;;;:55;;;;54150:20;;::::1;::::0;;;;:32:::1;::::0;54175:6;54150:24:::1;:32::i;:::-;-1:-1:-1::0;;;;;54127:20:0;::::1;;::::0;;;:15:::1;:20;::::0;;;;:55;-1:-1:-1;;54195:25:0;::::1;54191:97;;-1:-1:-1::0;;;;;54231:24:0;;::::1;;::::0;;;:19:::1;:24;::::0;;;;;;;:33;;::::1;::::0;;;;;;:49;;;54191:97:::1;54313:3;-1:-1:-1::0;;;;;54299:26:0::1;54308:3;-1:-1:-1::0;;;;;54299:26:0::1;-1:-1:-1::0;;;;;;;;;;;54318:6:0::1;54299:26;;;;;;:::i;:::-;;;;;;;;35762:1;;53525:806:::0;;;;:::o;40155:103::-;40242:9;;-1:-1:-1;;;;;40242:9:0;40155:103;:::o;40303:187::-;40364:7;40380:39;;:::i;:::-;40422:23;:21;:23::i;:::-;40459:25;;;;-1:-1:-1;;40303:187:0;:::o;47563:151::-;-1:-1:-1;;;;;47671:28:0;;;47648:7;47671:28;;;:19;:28;;;;;;;;:37;;;;;;;;;;;;;47563:151::o;37540:241::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37630:32:0;::::1;37622:88;;;;-1:-1:-1::0;;;37622:88:0::1;;;;;;;:::i;:::-;37717:17;:58:::0;;-1:-1:-1;;;;;;37717:58:0::1;-1:-1:-1::0;;;;;37717:58:0;;;::::1;::::0;;;::::1;::::0;;37540:241::o;51717:953::-;51928:20;51950:21;51973:25;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;52030:10:::2;-1:-1:-1::0;;;;;52018:22:0::2;:8;-1:-1:-1::0;;;;;52018:22:0::2;;;52010:68;;;;-1:-1:-1::0;;;52010:68:0::2;;;;;;;:::i;:::-;52094:10;::::0;-1:-1:-1;;;;;52094:10:0::2;:26:::0;:47:::2;;52135:6;52094:47;;;52123:9;52094:47;52085:56;;52157:36;52164:10;52176:8;52186:6;52157;:36::i;:::-;52148:45;;52217:1;52208:6;:10;:34;;;;;-1:-1:-1::0;;52222:6:0::2;:20;52208:34;52200:75;;;;-1:-1:-1::0;;;52200:75:0::2;;;;;;;:::i;:::-;52346:4;;;;;;;;;-1:-1:-1::0;;;;;52346:4:0::2;-1:-1:-1::0;;;;;52346:14:0::2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52335:48:0::2;;52400:4;52414:16;52439:6;52335:117;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52469:54;::::0;-1:-1:-1;;;52469:54:0;;52284:168;;-1:-1:-1;52284:168:0;;-1:-1:-1;52284:168:0;-1:-1:-1;52284:168:0;;-1:-1:-1;;;;;52469:44:0;::::2;::::0;::::2;::::0;:54:::2;::::0;52514:8;;52469:54:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;52461:112;;;;-1:-1:-1::0;;;52461:112:0::2;;;;;;;:::i;:::-;52587:77;52603:10;52615:8;52625:6;52633:16;52651:12;52587:77;;;;;;;;;;:::i;:::-;;;;;;;;51717:953:::0;;;;;;;;:::o;41673:105::-;41737:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;-1:-1:-1;41760:12:0::1;::::0;41673:105;:::o;48871:538::-;48972:7;34985:15;;34967;:33;:69;;;;-1:-1:-1;35012:9:0;;-1:-1:-1;;;;;35012:9:0;35004:32;;34967:69;34963:626;;;35068:9;;35047:18;;-1:-1:-1;;;;;35068:9:0;:23;35092:14;:12;:14::i;:::-;35108:12;;35122;;35068:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35047:88;;35144:22;35169:52;35184:36;35204:15;;35184;:19;;:36;;;;:::i;35169:52::-;35144:77;;35230:23;35256:42;35293:4;35256:32;35273:14;35256:12;;:16;;:32;;;;:::i;:42::-;35324:12;;35230:68;;-1:-1:-1;35324:33:0;;35230:68;35324:16;:33::i;:::-;35309:12;:48;35418:13;;35381:62;;35398:44;;35437:4;;35398:34;;:15;;:19;:34::i;35381:62::-;35366:12;:77;35511:16;;35471:68;;35492:46;;35533:4;;35492:36;;:14;;:18;:36::i;35471:68::-;35452:16;:87;-1:-1:-1;;35566:15:0;35548;:33;-1:-1:-1;34963:626:0;35719:4:::1;::::0;-1:-1:-1;;;;;35719:4:0::1;35697:10;:27;35689:66;;;;-1:-1:-1::0;;;35689:66:0::1;;;;;;;:::i;:::-;48988:20:::2;49011:14;:12;:14::i;:::-;49042:10;::::0;48988:37;;-1:-1:-1;;;;;;49042:10:0::2;:26:::0;:48:::2;;49083:7;49042:48;;;49071:9;49042:48;49032:58;;49107:31;49121:7;49130;49107:13;:31::i;:::-;49097:41:::0;-1:-1:-1;49145:15:0::2;49163:35;49185:12:::0;49163:17:::2;49097:41:::0;49175:4:::2;49163:11;:17::i;:35::-;49145:53;;49223:1;49213:7;:11;49205:47;;;;-1:-1:-1::0;;;49205:47:0::2;;;;;;;:::i;:::-;49259:37;49276:7;49285;49294:1;49259:16;:37::i;:::-;49310:22;49315:7;49324;49310:22;;;;;;;:::i;:::-;;;;;;;;49365:7;-1:-1:-1::0;;;;;49344:38:0::2;49361:1;-1:-1:-1::0;;;;;49344:38:0::2;-1:-1:-1::0;;;;;;;;;;;49374:7:0::2;49344:38;;;;;;:::i;:::-;;;;;;;;49396:7:::0;48871:538;-1:-1:-1;;;;48871:538:0:o;34017:17::-;;;-1:-1:-1;;;;;34017:17:0;;:::o;30589:244::-;29866:12;:10;:12::i;:::-;-1:-1:-1;;;;;29855:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;29855:23:0;;29847:68;;;;-1:-1:-1;;;29847:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30678:22:0;::::1;30670:73;;;;-1:-1:-1::0;;;30670:73:0::1;;;;;;;:::i;:::-;30780:6;::::0;;30759:38:::1;::::0;-1:-1:-1;;;;;30759:38:0;;::::1;::::0;30780:6;::::1;::::0;30759:38:::1;::::0;::::1;30808:6;:17:::0;;-1:-1:-1;;;;;;30808:17:0::1;-1:-1:-1::0;;;;;30808:17:0;;;::::1;::::0;;;::::1;::::0;;30589:244::o;28166:106::-;28254:10;28166:106;:::o;34677:111::-;34737:15;34719;:33;34778:4;34759:16;:23;34677:111::o;43646:194::-;43723:10;;43693:7;;-1:-1:-1;;;;;43723:10:0;:26;:111;;43798:10;;43791:43;;-1:-1:-1;;;43791:43:0;;-1:-1:-1;;;;;43798:10:0;;;;43791:28;;:43;;43828:4;;43791:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43723:111;;;43752:36;:21;43778:9;23321:158;23379:7;23412:1;23407;:6;;23399:49;;;;-1:-1:-1;;;23399:49:0;;;;;;;:::i;:::-;-1:-1:-1;23466:5:0;;;23321:158::o;23738:220::-;23796:7;23820:6;23816:20;;-1:-1:-1;23835:1:0;23828:8;;23816:20;23859:5;;;23863:1;23859;:5;:1;23883:5;;;;;:10;23875:56;;;;-1:-1:-1;;;23875:56:0;;;;;;;:::i;24436:153::-;24494:7;24526:1;24522;:5;24514:44;;;;-1:-1:-1;;;24514:44:0;;;;;;;:::i;:::-;24580:1;24576;:5;;;;;;;24436:153;-1:-1:-1;;;24436:153:0:o;22859:179::-;22917:7;22949:5;;;22973:6;;;;22965:46;;;;-1:-1:-1;;;22965:46:0;;;;;;;:::i;55241:216::-;55312:10;;-1:-1:-1;;;;;55312:10:0;55308:144;;55349:37;55375:2;55379:6;55349:25;:37::i;:::-;55308:144;;;55409:10;;:35;;-1:-1:-1;;;;;55409:10:0;55433:2;55437:6;55409:23;:35::i;:::-;55241:216;;:::o;44055:900::-;44111:30;;:::i;:::-;44150:39;;:::i;:::-;44219:12;;44196:35;;44262:12;;44238:21;;;:36;44309:16;;44281:25;;;:44;44356:15;;44338;:33;:53;;;;;44390:1;44375:12;;:16;44338:53;44334:594;;;44423:9;;44402:18;;-1:-1:-1;;;;;44423:9:0;:23;44447:14;:12;:14::i;:::-;44463:12;;44477;;44423:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44402:88;;44499:22;44524:52;44539:36;44559:15;;44539;:19;;:36;;;;:::i;44524:52::-;44499:77;;44585:23;44611:42;44648:4;44611:32;44628:14;44611:12;;:16;;:32;;;;:::i;:42::-;44687:12;;44585:68;;-1:-1:-1;44687:33:0;;44585:68;44687:16;:33::i;:::-;44664:56;;44790:13;;44753:62;;44770:44;;44809:4;;44770:34;;:15;;:19;:34::i;44753:62::-;44729:21;;;:86;44892:16;;44852:68;;44873:46;;44914:4;;44873:36;;:14;;:18;:36::i;44852:68::-;44824:25;;;:96;-1:-1:-1;;;44941:8:0;-1:-1:-1;44055:900:0;:::o;42300:591::-;-1:-1:-1;;;;;42432:23:0;;42397:32;42432:23;;;:14;:23;;;;;42466:18;;;;42462:83;;42521:16;;42500:18;;;:37;42462:83;42567:87;42644:9;42567:72;42629:9;42567:57;42605:4;:18;;;42567:33;42583:16;;42567:4;:11;;;:15;;:33;;;;:::i;:87::-;42553:101;;42682:16;;42661:18;;;:37;42720:12;;:42;;42752:9;;42720:27;;42737:9;42720:16;:27::i;:42::-;42705:12;:57;42786:11;;33876:4;-1:-1:-1;42785:38:0;;42812:11;;42785:38;;;42808:1;42785:38;42771:52;;42846:12;;33876:4;-1:-1:-1;42845:40:0;;42873:12;;42845:40;;;42869:1;42845:40;42830:12;:55;-1:-1:-1;;;;42300:591:0:o;57000:639::-;57082:7;57098:21;57122:25;57138:8;57122:15;:25::i;:::-;57098:49;;57154:19;57176:31;57185:13;57200:6;57176:8;:31::i;:::-;57154:53;;57228:33;57242:5;57249:11;57228:13;:33::i;:::-;57214:47;;57268:42;57285:8;57295:1;57298:11;57268:16;:42::i;:::-;57323:10;;-1:-1:-1;;;;;57323:10:0;57319:208;;57360:20;57392:11;57383:6;:20;:50;;57432:1;57383:50;;;57406:23;:6;57417:11;57406:10;:23::i;:::-;57360:73;-1:-1:-1;57446:16:0;;57442:78;;57475:35;57490:5;57497:12;57475:14;:35::i;:::-;57319:208;;57540:68;57552:5;57559:8;57569:11;57582:25;57598:8;57582:15;:25::i;:::-;57540:68;;;;;;;;;:::i;:::-;;;;;;;;57622:11;57000:639;-1:-1:-1;;;;;57000:639:0:o;55755:1083::-;55844:7;55868:14;;;:32;;-1:-1:-1;55886:14:0;;55868:32;55860:95;;;;-1:-1:-1;;;55860:95:0;;;;;;;:::i;:::-;55985:9;55970:11;;:24;;55962:68;;;;-1:-1:-1;;;55962:68:0;;;;;;;:::i;:::-;56058:9;56045;:7;:9::i;:::-;:22;;:40;;;-1:-1:-1;56071:14:0;;56045:40;56037:82;;;;-1:-1:-1;;;56037:82:0;;;;;;;:::i;:::-;56147:39;56181:4;56147:29;56161:14;:12;:14::i;:::-;56147:9;;:13;:29::i;:39::-;56134:9;:7;:9::i;:::-;:52;;:70;;;-1:-1:-1;56190:14:0;;56134:70;56126:112;;;;-1:-1:-1;;;56126:112:0;;;;;;;:::i;:::-;56247:20;56282:1;56270:9;:13;:67;;56298:39;56322:14;:12;:14::i;:::-;56298:19;:9;56312:4;56298:13;:19::i;:39::-;56270:67;;;56286:9;56270:67;56247:90;;56344:20;56379:1;56367:9;:13;:67;;56425:9;56367:67;;;56383:39;56417:4;56383:29;56397:14;:12;:14::i;:::-;56383:9;;:13;:29::i;:39::-;56344:90;;56470:4;;;;;;;;;-1:-1:-1;;;;;56470:4:0;-1:-1:-1;;;;;56470:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56459:42:0;;56510:4;56517:7;56526:15;56459:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56443:138;;;;-1:-1:-1;;;56443:138:0;;;;;;;:::i;:::-;56590:45;56607:7;56616:1;56619:15;56590:16;:45::i;:::-;56642:40;56657:7;56666:15;56642:14;:40::i;:::-;56722:1;-1:-1:-1;;;;;56696:46:0;56705:7;-1:-1:-1;;;;;56696:46:0;-1:-1:-1;;;;;;;;;;;56726:15:0;56696:46;;;;;;:::i;:::-;;;;;;;;56754:49;56761:7;56770:15;56787;56754:49;;;;;;;;:::i;25686:166::-;25772:7;25808:12;25800:6;;;;25792:29;;;;-1:-1:-1;;;25792:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;25839:5:0;;;25686:166::o;54543:573::-;54633:10;;54613:7;;-1:-1:-1;;;;;54633:10:0;54629:482;;54691:6;54678:9;:19;;54670:54;;;;-1:-1:-1;;;54670:54:0;;;;;;;:::i;:::-;54740:27;54749:9;54760:6;54740:8;:27::i;:::-;54733:34;;;;54629:482;54821:10;;54814:43;;-1:-1:-1;;;54814:43:0;;54790:21;;-1:-1:-1;;;;;54821:10:0;;54814:28;;:43;;54851:4;;54814:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54866:10;;54790:67;;-1:-1:-1;54866:56:0;;-1:-1:-1;;;;;54866:10:0;54894:4;54908;54915:6;54866:27;:56::i;:::-;54961:10;;54954:43;;-1:-1:-1;;;54954:43:0;;54931:20;;-1:-1:-1;;;;;54961:10:0;;54954:28;;:43;;54991:4;;54954:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54931:66;-1:-1:-1;55049:6:0;55014:31;54931:66;55031:13;55014:16;:31::i;:::-;:41;;55006:50;;;;;;55072:31;:12;55089:13;55072:16;:31::i;:::-;55065:38;;;;;;43175:307;-1:-1:-1;;;;;43299:24:0;;;;;;:15;:24;;;;;;:54;;43343:9;;43299:39;;43328:9;43299:28;:39::i;:54::-;-1:-1:-1;;;;;43272:24:0;;;;;;:15;:24;;;;;:81;43374:11;;:41;;43405:9;;43374:26;;43390:9;43374:15;:26::i;:41::-;43360:11;:55;;;33876:4;-1:-1:-1;43438:38:0;;43465:11;;43438:38;;;43461:1;43438:38;43424:11;:52;-1:-1:-1;;;43175:307:0:o;1980:171::-;2089:12;;;2049;2089;;;;;;;;;-1:-1:-1;;;;;2067:7:0;;;2082:5;;2067:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2048:54;;;2117:7;2109:36;;;;-1:-1:-1;;;2109:36:0;;;;;;;:::i;:::-;1980:171;;;:::o;1264:332::-;1408:12;1422:17;1443:5;-1:-1:-1;;;;;1443:10:0;1477;1489:2;1493:5;1454:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1454:45:0;;;;;;;;;;;1443:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1407:93;;;;1515:7;:57;;;;-1:-1:-1;1527:11:0;;:16;;:44;;;1558:4;1547:24;;;;;;;;;;;;:::i;:::-;1507:83;;;;-1:-1:-1;;;1507:83:0;;;;;;;:::i;:::-;1264:332;;;;;:::o;45402:106::-;45460:7;45491:1;45487;:5;:13;;45499:1;45487:13;;;-1:-1:-1;45495:1:0;;45402:106;-1:-1:-1;45402:106:0:o;1602:372::-;1776:12;1790:17;1811:5;-1:-1:-1;;;;;1811:10:0;1845;1857:4;1863:2;1867:5;1822:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1822:51:0;;;;;;;;;;;1811:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1775:99;;;;1889:7;:57;;;;-1:-1:-1;1901:11:0;;:16;;:44;;;1932:4;1921:24;;;;;;;;;;;;:::i;:::-;1881:87;;;;-1:-1:-1;;;1881:87:0;;;;;;;:::i;:::-;1602:372;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;419:442;;521:3;514:4;506:6;502:17;498:27;488:2;;-1:-1;;529:12;488:2;576:6;563:20;40910:18;;40902:6;40899:30;40896:2;;;-1:-1;;40932:12;40896:2;40565;40559:9;41005;40986:17;;-1:-1;;40982:33;40591:17;;41073:4;40591:17;40651:34;;;40687:22;;;40648:62;40645:2;;;-1:-1;;40713:12;40645:2;40565;40732:22;669:21;;;589:74;-1:-1;589:74;769:16;;;41073:4;769:16;766:25;-1:-1;763:2;;;804:1;;794:12;763:2;43529:6;41073:4;711:6;707:17;41073:4;745:5;741:16;43506:30;43585:1;41073:4;43576:6;745:5;43567:16;;43560:27;;;;481:380;;;;:::o;1280:241::-;;1384:2;1372:9;1363:7;1359:23;1355:32;1352:2;;;-1:-1;;1390:12;1352:2;85:6;72:20;97:33;124:5;97:33;:::i;1528:263::-;;1643:2;1631:9;1622:7;1618:23;1614:32;1611:2;;;-1:-1;;1649:12;1611:2;226:6;220:13;238:33;265:5;238:33;:::i;1798:366::-;;;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;-1:-1;;1925:12;1887:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1977:63;-1:-1;2077:2;2116:22;;72:20;97:33;72:20;97:33;:::i;:::-;2085:63;;;;1881:283;;;;;:::o;2171:617::-;;;;;2326:3;2314:9;2305:7;2301:23;2297:33;2294:2;;;-1:-1;;2333:12;2294:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2385:63;-1:-1;2485:2;2524:22;;72:20;97:33;72:20;97:33;:::i;:::-;2493:63;-1:-1;2593:2;2632:22;;72:20;97:33;72:20;97:33;:::i;:::-;2288:500;;;;-1:-1;2601:63;;2701:2;2740:22;936:20;;-1:-1;;2288:500::o;2795:491::-;;;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;-1:-1;;2939:12;2901:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2991:63;-1:-1;3091:2;3130:22;;72:20;97:33;72:20;97:33;:::i;:::-;2895:391;;3099:63;;-1:-1;;;3199:2;3238:22;;;;936:20;;2895:391::o;3293:366::-;;;3414:2;3402:9;3393:7;3389:23;3385:32;3382:2;;;-1:-1;;3420:12;3382:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3472:63;3572:2;3611:22;;;;936:20;;-1:-1;;;3376:283::o;3666:257::-;;3778:2;3766:9;3757:7;3753:23;3749:32;3746:2;;;-1:-1;;3784:12;3746:2;364:6;358:13;44188:5;41841:13;41834:21;44166:5;44163:32;44153:2;;-1:-1;;44199:12;3930:699;;;;4086:2;4074:9;4065:7;4061:23;4057:32;4054:2;;;-1:-1;;4092:12;4054:2;4150:17;4137:31;4188:18;;4180:6;4177:30;4174:2;;;-1:-1;;4210:12;4174:2;4240:63;4295:7;4286:6;4275:9;4271:22;4240:63;:::i;:::-;4230:73;;4368:2;4357:9;4353:18;4340:32;4326:46;;4188:18;4384:6;4381:30;4378:2;;;-1:-1;;4414:12;4378:2;;4444:63;4499:7;4490:6;4479:9;4475:22;4444:63;:::i;:::-;4434:73;;;4544:2;4585:9;4581:22;1212:20;42145:4;44432:5;42134:16;44409:5;44406:33;44396:2;;-1:-1;;44443:12;44396:2;4552:61;;;;4048:581;;;;;:::o;4636:241::-;;4740:2;4728:9;4719:7;4715:23;4711:32;4708:2;;;-1:-1;;4746:12;4708:2;-1:-1;936:20;;4702:175;-1:-1;4702:175::o;4884:263::-;;4999:2;4987:9;4978:7;4974:23;4970:32;4967:2;;;-1:-1;;5005:12;4967:2;-1:-1;1084:13;;4961:186;-1:-1;4961:186::o;5154:535::-;;;;5303:2;5291:9;5282:7;5278:23;5274:32;5271:2;;;-1:-1;;5309:12;5271:2;1090:6;1084:13;5361:74;;5472:2;5526:9;5522:22;1084:13;5480:74;;5591:2;5645:9;5641:22;1084:13;5599:74;;5265:424;;;;;:::o;19497:271::-;;6236:5;41182:12;6347:52;6392:6;6387:3;6380:4;6373:5;6369:16;6347:52;:::i;:::-;6411:16;;;;;19631:137;-1:-1;;19631:137::o;19775:222::-;-1:-1;;;;;41929:54;;;;5916:37;;19902:2;19887:18;;19873:124::o;20249:588::-;-1:-1;;;;;41929:54;;;5775:58;;41929:54;;;20657:2;20642:18;;5775:58;41929:54;;20740:2;20725:18;;5916:37;20823:2;20808:18;;19214:37;;;;20476:3;20461:19;;20447:390::o;21423:460::-;-1:-1;;;;;41929:54;;;5775:58;;41929:54;;;;21786:2;21771:18;;5916:37;21869:2;21854:18;;19214:37;;;;21614:2;21599:18;;21585:298::o;22341:668::-;-1:-1;;;;;41929:54;;;5916:37;;41929:54;;;22745:2;22730:18;;5916:37;22828:2;22813:18;;19214:37;;;;41929:54;;;22911:2;22896:18;;5916:37;22994:3;22979:19;;19214:37;;;;22580:3;22565:19;;22551:458::o;23016:556::-;-1:-1;;;;;41929:54;;;5916:37;;41929:54;;;;23392:2;23377:18;;5916:37;23475:2;23460:18;;19214:37;23558:2;23543:18;;19214:37;;;;23227:3;23212:19;;23198:374::o;23579:333::-;-1:-1;;;;;41929:54;;;;5916:37;;23898:2;23883:18;;19214:37;23734:2;23719:18;;23705:207::o;23919:444::-;-1:-1;;;;;41929:54;;;;5916:37;;24266:2;24251:18;;19214:37;;;;24349:2;24334:18;;19214:37;24102:2;24087:18;;24073:290::o;24370:210::-;41841:13;;41834:21;6030:34;;24491:2;24476:18;;24462:118::o;25392:310::-;;25539:2;25560:17;25553:47;7101:5;41182:12;41621:6;25539:2;25528:9;25524:18;41609:19;7195:52;7240:6;41649:14;25528:9;41649:14;25539:2;7221:5;7217:16;7195:52;:::i;:::-;41005:9;43946:14;-1:-1;;43942:28;7259:39;;;;41649:14;7259:39;;25510:192;-1:-1;;25510:192::o;25709:416::-;25909:2;25923:47;;;7535:2;25894:18;;;41609:19;7571:34;41649:14;;;7551:55;-1:-1;;;7626:12;;;7619:25;7663:12;;;25880:245::o;26132:416::-;26332:2;26346:47;;;7914:2;26317:18;;;41609:19;7950:34;41649:14;;;7930:55;-1:-1;;;8005:12;;;7998:30;8047:12;;;26303:245::o;26555:416::-;26755:2;26769:47;;;8298:2;26740:18;;;41609:19;-1:-1;;;41649:14;;;8314:42;8375:12;;;26726:245::o;26978:416::-;27178:2;27192:47;;;8626:2;27163:18;;;41609:19;8662:31;41649:14;;;8642:52;8713:12;;;27149:245::o;27401:416::-;27601:2;27615:47;;;8964:2;27586:18;;;41609:19;9000:29;41649:14;;;8980:50;9049:12;;;27572:245::o;27824:416::-;28024:2;28038:47;;;9300:2;28009:18;;;41609:19;9336:27;41649:14;;;9316:48;9383:12;;;27995:245::o;28247:416::-;28447:2;28461:47;;;9634:2;28432:18;;;41609:19;9670:25;41649:14;;;9650:46;9715:12;;;28418:245::o;28670:416::-;28870:2;28884:47;;;9966:2;28855:18;;;41609:19;-1:-1;;;41649:14;;;9982:45;10046:12;;;28841:245::o;29093:416::-;29293:2;29307:47;;;10297:2;29278:18;;;41609:19;10333:32;41649:14;;;10313:53;10385:12;;;29264:245::o;29516:416::-;29716:2;29730:47;;;10636:2;29701:18;;;41609:19;10672:34;41649:14;;;10652:55;-1:-1;;;10727:12;;;10720:27;10766:12;;;29687:245::o;29939:416::-;30139:2;30153:47;;;11017:2;30124:18;;;41609:19;11053:28;41649:14;;;11033:49;11101:12;;;30110:245::o;30362:416::-;30562:2;30576:47;;;11352:2;30547:18;;;41609:19;11388:33;41649:14;;;11368:54;11441:12;;;30533:245::o;30785:416::-;30985:2;30999:47;;;11692:2;30970:18;;;41609:19;11728:33;41649:14;;;11708:54;11781:12;;;30956:245::o;31208:416::-;31408:2;31422:47;;;12032:2;31393:18;;;41609:19;-1:-1;;;41649:14;;;12048:42;12109:12;;;31379:245::o;31631:416::-;31831:2;31845:47;;;12360:2;31816:18;;;41609:19;-1:-1;;;41649:14;;;12376:44;12439:12;;;31802:245::o;32054:416::-;32254:2;32268:47;;;12690:2;32239:18;;;41609:19;12726:32;41649:14;;;12706:53;12778:12;;;32225:245::o;32477:416::-;32677:2;32691:47;;;13029:2;32662:18;;;41609:19;13065:34;41649:14;;;13045:55;-1:-1;;;13120:12;;;13113:25;13157:12;;;32648:245::o;32900:416::-;33100:2;33114:47;;;13408:2;33085:18;;;41609:19;13444:31;41649:14;;;13424:52;13495:12;;;33071:245::o;33323:416::-;33523:2;33537:47;;;13746:2;33508:18;;;41609:19;-1:-1;;;41649:14;;;13762:36;13817:12;;;33494:245::o;33746:416::-;33946:2;33960:47;;;33931:18;;;41609:19;14104:34;41649:14;;;14084:55;14158:12;;;33917:245::o;34169:416::-;34369:2;34383:47;;;14409:2;34354:18;;;41609:19;14445:34;41649:14;;;14425:55;-1:-1;;;14500:12;;;14493:26;14538:12;;;34340:245::o;34592:416::-;34792:2;34806:47;;;14789:2;34777:18;;;41609:19;14825:31;41649:14;;;14805:52;14876:12;;;34763:245::o;35015:416::-;35215:2;35229:47;;;15127:2;35200:18;;;41609:19;15163:25;41649:14;;;15143:46;15208:12;;;35186:245::o;35438:416::-;35638:2;35652:47;;;15459:2;35623:18;;;41609:19;15495:34;41649:14;;;15475:55;-1:-1;;;15550:12;;;15543:27;15589:12;;;35609:245::o;35861:416::-;36061:2;36075:47;;;15840:2;36046:18;;;41609:19;15876:34;41649:14;;;15856:55;-1:-1;;;15931:12;;;15924:35;15978:12;;;36032:245::o;36284:416::-;36484:2;36498:47;;;16229:2;36469:18;;;41609:19;-1:-1;;;41649:14;;;16245:39;16303:12;;;36455:245::o;36707:416::-;36907:2;36921:47;;;16554:2;36892:18;;;41609:19;16590:28;41649:14;;;16570:49;16638:12;;;36878:245::o;37130:416::-;37330:2;37344:47;;;16889:2;37315:18;;;41609:19;-1:-1;;;41649:14;;;16905:40;16964:12;;;37301:245::o;37553:416::-;37753:2;37767:47;;;17215:2;37738:18;;;41609:19;17251:34;41649:14;;;17231:55;-1:-1;;;17306:12;;;17299:42;17360:12;;;37724:245::o;37976:416::-;38176:2;38190:47;;;17611:2;38161:18;;;41609:19;17647:33;41649:14;;;17627:54;17700:12;;;38147:245::o;38399:416::-;38599:2;38613:47;;;17951:2;38584:18;;;41609:19;17987:33;41649:14;;;17967:54;18040:12;;;38570:245::o;38822:416::-;39022:2;39036:47;;;18291:2;39007:18;;;41609:19;18327:30;41649:14;;;18307:51;18377:12;;;38993:245::o;39245:350::-;18708:23;;19214:37;;18888:4;18877:16;;;18871:23;18948:14;;;19214:37;19050:4;19039:16;;;19033:23;19110:14;;;19214:37;;;;39436:2;39421:18;;39407:188::o;39602:222::-;19214:37;;;39729:2;39714:18;;39700:124::o;39831:444::-;19214:37;;;40178:2;40163:18;;19214:37;;;;40261:2;40246:18;;19214:37;40014:2;39999:18;;39985:290::o;40282:214::-;42145:4;42134:16;;;;19450:35;;40405:2;40390:18;;40376:120::o;43602:268::-;43667:1;43674:101;43688:6;43685:1;43682:13;43674:101;;;43755:11;;;43749:18;43736:11;;;43729:39;43710:2;43703:10;43674:101;;;43790:6;43787:1;43784:13;43781:2;;;43667:1;43846:6;43841:3;43837:16;43830:27;43781:2;;43651:219;;;:::o;43983:117::-;-1:-1;;;;;41929:54;;44042:35;;44032:2;;44091:1;;44081:12;44032:2;44026:74;:::o
Swarm Source
ipfs://b9533ae8ddf3214370c6c33cf4a3b9c55b5ac65cc7a96fd93fe88da8e4541054
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
LINEA | 100.00% | $1,793.83 | 87.3582 | $156,705.62 |
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.