Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 15283231 | 1286 days ago | IN | 0 ETH | 0.00082763 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Bank
Compiler Version
v0.5.14+commit.01f1aaa4
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-08-05
*/
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.5.14;
interface IGlobalConfig {
function constants() external view returns (address);
function tokenInfoRegistry() external view returns (ITokenRegistry);
function chainLink() external view returns (address);
function bank() external view returns (IBank);
function savingAccount() external view returns (ISavingAccount);
function accounts() external view returns (IAccounts);
function maxReserveRatio() external view returns (uint256);
function midReserveRatio() external view returns (uint256);
function minReserveRatio() external view returns (uint256);
function rateCurveSlope() external view returns (uint256);
function rateCurveConstant() external view returns (uint256);
function compoundSupplyRateWeights() external view returns (uint256);
function compoundBorrowRateWeights() external view returns (uint256);
function deFinerCommunityFund() external view returns (address);
function deFinerRate() external view returns (uint256);
function liquidationThreshold() external view returns (uint);
function liquidationDiscountRatio() external view returns (uint);
function owner() external view returns (address);
}
interface ITokenRegistry {
function getTokenDecimals(address) external view returns (uint8);
function getCToken(address) external view returns (address);
function depositeMiningSpeeds(address) external view returns (uint256);
function borrowMiningSpeeds(address) external view returns (uint256);
function isSupportedOnCompound(address) external view returns (bool);
function getTokens() external view returns (address[] memory);
function getTokenInfoFromAddress(address _token) external view returns (uint8, uint256, uint256, uint256);
function getTokenInfoFromIndex(uint index) external view returns (address, uint256, uint256, uint256);
function getTokenIndex(address _token) external view returns (uint8);
function addressFromIndex(uint index) external view returns(address);
function isTokenExist(address _token) external view returns (bool isExist);
function isTokenEnabled(address _token) external view returns (bool);
}
interface IAccounts {
function deposit(address, address, uint256) external;
function borrow(address, address, uint256) external;
function getBorrowPrincipal(address, address) external view returns (uint256);
function withdraw(address, address, uint256) external returns (uint256);
function repay(address, address, uint256) external returns (uint256);
}
interface ISavingAccount {
function toCompound(address, uint256) external;
function fromCompound(address, uint256) external;
}
interface IBank {
function newRateIndexCheckpoint(address) external;
function deposit(address _to, address _token, uint256 _amount) external;
function withdraw(address _from, address _token, uint256 _amount) external returns(uint);
function borrow(address _from, address _token, uint256 _amount) external;
function repay(address _to, address _token, uint256 _amount) external returns(uint);
function getDepositAccruedRate(address _token, uint _depositRateRecordStart) external view returns (uint256);
function getBorrowAccruedRate(address _token, uint _borrowRateRecordStart) external view returns (uint256);
function depositeRateIndex(address _token, uint _blockNum) external view returns (uint);
function borrowRateIndex(address _token, uint _blockNum) external view returns (uint);
function depositeRateIndexNow(address _token) external view returns(uint);
function borrowRateIndexNow(address _token) external view returns(uint);
function updateMining(address _token) external;
function updateDepositFINIndex(address _token) external;
function updateBorrowFINIndex(address _token) external;
function depositFINRateIndex(address, uint) external view returns (uint);
function borrowFINRateIndex(address, uint) external view returns (uint);
}
interface ICToken {
function supplyRatePerBlock() external view returns (uint);
function borrowRatePerBlock() external view returns (uint);
function mint(uint mintAmount) external returns (uint);
function redeemUnderlying(uint redeemAmount) external returns (uint);
function redeem(uint redeemAmount) external returns (uint);
function exchangeRateStore() external view returns (uint);
function exchangeRateCurrent() external returns (uint);
function balanceOf(address owner) external view returns (uint256);
function balanceOfUnderlying(address owner) external returns (uint);
}
interface ICETH{
function mint() external payable;
}
interface IController {
function fastForward(uint blocks) external returns (uint);
function getBlockNumber() external view returns (uint);
}
/**
* @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, 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) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message 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.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract Constant {
enum ActionType { DepositAction, WithdrawAction, BorrowAction, RepayAction, LiquidateRepayAction }
address public constant ETH_ADDR = 0x000000000000000000000000000000000000000E;
uint256 public constant INT_UNIT = 10 ** uint256(18);
uint256 public constant ACCURACY = 10 ** 18;
// OKExChain blocks per year as per 3 sec per block
uint256 public constant BLOCKS_PER_YEAR = 2102400;
}
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
contract Bank is Constant, Initializable{
using SafeMath for uint256;
mapping(address => uint256) public totalLoans; // amount of lended tokens
mapping(address => uint256) public totalReserve; // amount of tokens in reservation
mapping(address => uint256) public totalCompound; // amount of tokens in compound
// Token => block-num => rate
mapping(address => mapping(uint => uint)) public depositeRateIndex; // the index curve of deposit rate
// Token => block-num => rate
mapping(address => mapping(uint => uint)) public borrowRateIndex; // the index curve of borrow rate
// token address => block number
mapping(address => uint) public lastCheckpoint; // last checkpoint on the index curve
// cToken address => rate
mapping(address => uint) public lastCTokenExchangeRate; // last compound cToken exchange rate
mapping(address => ThirdPartyPool) compoundPool; // the compound pool
IGlobalConfig globalConfig; // global configuration contract address
mapping(address => mapping(uint => uint)) public depositFINRateIndex;
mapping(address => mapping(uint => uint)) public borrowFINRateIndex;
mapping(address => uint) public lastDepositFINRateCheckpoint;
mapping(address => uint) public lastBorrowFINRateCheckpoint;
modifier onlyAuthorized() {
require(msg.sender == address(globalConfig.savingAccount()) || msg.sender == address(globalConfig.accounts()),
"Only authorized to call from DeFiner internal contracts.");
_;
}
struct ThirdPartyPool {
bool supported; // if the token is supported by the third party platforms such as Compound
uint capitalRatio; // the ratio of the capital in third party to the total asset
uint depositRatePerBlock; // the deposit rate of the token in third party
uint borrowRatePerBlock; // the borrow rate of the token in third party
}
event UpdateIndex(address indexed token, uint256 depositeRateIndex, uint256 borrowRateIndex);
event UpdateDepositFINIndex(address indexed _token, uint256 depositFINRateIndex);
event UpdateBorrowFINIndex(address indexed _token, uint256 borrowFINRateIndex);
/**
* Initialize the Bank
* @param _globalConfig the global configuration contract
*/
function initialize(
IGlobalConfig _globalConfig
) public initializer {
globalConfig = _globalConfig;
}
/**
* Total amount of the token in Saving account
* @param _token token address
*/
function getTotalDepositStore(address _token) public view returns(uint) {
address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
// totalLoans[_token] = U totalReserve[_token] = R
return totalCompound[cToken].add(totalLoans[_token]).add(totalReserve[_token]); // return totalAmount = C + U + R
}
/**
* Update total amount of token in Compound as the cToken price changed
* @param _token token address
*/
function updateTotalCompound(address _token) internal {
address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
if(cToken != address(0)) {
totalCompound[cToken] = ICToken(cToken).balanceOfUnderlying(address(globalConfig.savingAccount()));
}
}
/**
* Update the total reservation. Before run this function, make sure that totalCompound has been updated
* by calling updateTotalCompound. Otherwise, totalCompound may not equal to the exact amount of the
* token in Compound.
* @param _token token address
* @param _action indicate if user's operation is deposit or withdraw, and borrow or repay.
* @return the actuall amount deposit/withdraw from the saving pool
*/
function updateTotalReserve(address _token, uint _amount, ActionType _action) internal returns(uint256 compoundAmount){
address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
uint totalAmount = getTotalDepositStore(_token);
if (_action == ActionType.DepositAction || _action == ActionType.RepayAction) {
// Total amount of token after deposit or repay
if (_action == ActionType.DepositAction)
totalAmount = totalAmount.add(_amount);
else
totalLoans[_token] = totalLoans[_token].sub(_amount);
// Expected total amount of token in reservation after deposit or repay
uint totalReserveBeforeAdjust = totalReserve[_token].add(_amount);
if (cToken != address(0) &&
totalReserveBeforeAdjust > totalAmount.mul(globalConfig.maxReserveRatio()).div(100)) {
uint toCompoundAmount = totalReserveBeforeAdjust.sub(totalAmount.mul(globalConfig.midReserveRatio()).div(100));
//toCompound(_token, toCompoundAmount);
compoundAmount = toCompoundAmount;
totalCompound[cToken] = totalCompound[cToken].add(toCompoundAmount);
totalReserve[_token] = totalReserve[_token].add(_amount).sub(toCompoundAmount);
}
else {
totalReserve[_token] = totalReserve[_token].add(_amount);
}
} else if(_action == ActionType.LiquidateRepayAction) {
// When liquidation is called the `totalLoans` amount should be reduced.
// We dont need to update other variables as all the amounts are adjusted internally,
// hence does not require updation of `totalReserve` / `totalCompound`
totalLoans[_token] = totalLoans[_token].sub(_amount);
} else {
// The lack of liquidity exception happens when the pool doesn't have enough tokens for borrow/withdraw
// It happens when part of the token has lended to the other accounts.
// However in case of withdrawAll, even if the token has no loan, this requirment may still false because
// of the precision loss in the rate calcuation. So we put a logic here to deal with this case: in case
// of withdrawAll and there is no loans for the token, we just adjust the balance in bank contract to the
// to the balance of that individual account.
if(_action == ActionType.WithdrawAction) {
if(totalLoans[_token] != 0)
require(getPoolAmount(_token) >= _amount, "Lack of liquidity when withdraw.");
else if (getPoolAmount(_token) < _amount)
totalReserve[_token] = _amount.sub(totalCompound[cToken]);
totalAmount = getTotalDepositStore(_token);
}
else
require(getPoolAmount(_token) >= _amount, "Lack of liquidity when borrow.");
// Total amount of token after withdraw or borrow
if (_action == ActionType.WithdrawAction)
totalAmount = totalAmount.sub(_amount);
else
totalLoans[_token] = totalLoans[_token].add(_amount);
// Expected total amount of token in reservation after deposit or repay
uint totalReserveBeforeAdjust = totalReserve[_token] > _amount ? totalReserve[_token].sub(_amount) : 0;
// Trigger fromCompound if the new reservation ratio is less than 10%
if(cToken != address(0) &&
(totalAmount == 0 || totalReserveBeforeAdjust < totalAmount.mul(globalConfig.minReserveRatio()).div(100))) {
uint totalAvailable = totalReserve[_token].add(totalCompound[cToken]).sub(_amount);
if (totalAvailable < totalAmount.mul(globalConfig.midReserveRatio()).div(100)){
// Withdraw all the tokens from Compound
compoundAmount = totalCompound[cToken];
totalCompound[cToken] = 0;
totalReserve[_token] = totalAvailable;
} else {
// Withdraw partial tokens from Compound
uint totalInCompound = totalAvailable.sub(totalAmount.mul(globalConfig.midReserveRatio()).div(100));
compoundAmount = totalCompound[cToken].sub(totalInCompound);
totalCompound[cToken] = totalInCompound;
totalReserve[_token] = totalAvailable.sub(totalInCompound);
}
}
else {
totalReserve[_token] = totalReserve[_token].sub(_amount);
}
}
return compoundAmount;
}
function update(address _token, uint _amount, ActionType _action) public onlyAuthorized returns(uint256 compoundAmount) {
updateTotalCompound(_token);
// updateTotalLoan(_token);
compoundAmount = updateTotalReserve(_token, _amount, _action);
return compoundAmount;
}
/**
* The function is called in Bank.deposit(), Bank.withdraw() and Accounts.claim() functions.
* The function should be called AFTER the newRateIndexCheckpoint function so that the account balances are
* accurate, and BEFORE the account balance acutally updated due to deposit/withdraw activities.
*/
function updateDepositFINIndex(address _token) public onlyAuthorized{
uint currentBlock = getBlockNumber();
uint deltaBlock;
// If it is the first deposit FIN rate checkpoint, set the deltaBlock value be 0 so that the first
// point on depositFINRateIndex is zero.
deltaBlock = lastDepositFINRateCheckpoint[_token] == 0 ? 0 : currentBlock.sub(lastDepositFINRateCheckpoint[_token]);
// If the totalDeposit of the token is zero, no FIN token should be mined and the FINRateIndex is unchanged.
depositFINRateIndex[_token][currentBlock] = depositFINRateIndex[_token][lastDepositFINRateCheckpoint[_token]].add(
getTotalDepositStore(_token) == 0 ? 0 : depositeRateIndex[_token][lastCheckpoint[_token]]
.mul(deltaBlock)
.mul(globalConfig.tokenInfoRegistry().depositeMiningSpeeds(_token))
.div(getTotalDepositStore(_token)));
lastDepositFINRateCheckpoint[_token] = currentBlock;
emit UpdateDepositFINIndex(_token, depositFINRateIndex[_token][currentBlock]);
}
function updateBorrowFINIndex(address _token) public onlyAuthorized{
uint currentBlock = getBlockNumber();
uint deltaBlock;
// If it is the first borrow FIN rate checkpoint, set the deltaBlock value be 0 so that the first
// point on borrowFINRateIndex is zero.
deltaBlock = lastBorrowFINRateCheckpoint[_token] == 0 ? 0 : currentBlock.sub(lastBorrowFINRateCheckpoint[_token]);
// If the totalBorrow of the token is zero, no FIN token should be mined and the FINRateIndex is unchanged.
borrowFINRateIndex[_token][currentBlock] = borrowFINRateIndex[_token][lastBorrowFINRateCheckpoint[_token]].add(
totalLoans[_token] == 0 ? 0 : borrowRateIndex[_token][lastCheckpoint[_token]]
.mul(deltaBlock)
.mul(globalConfig.tokenInfoRegistry().borrowMiningSpeeds(_token))
.div(totalLoans[_token]));
lastBorrowFINRateCheckpoint[_token] = currentBlock;
emit UpdateBorrowFINIndex(_token, borrowFINRateIndex[_token][currentBlock]);
}
function updateMining(address _token) public onlyAuthorized{
newRateIndexCheckpoint(_token);
updateTotalCompound(_token);
}
/**
* Get the borrowing interest rate.
* @param _token token address
* @return the borrow rate for the current block
*/
function getBorrowRatePerBlock(address _token) public view returns(uint) {
uint256 capitalUtilizationRatio = getCapitalUtilizationRatio(_token);
// rateCurveConstant = <'3 * (10)^16'_rateCurveConstant_configurable>
uint256 rateCurveConstant = globalConfig.rateCurveConstant();
// compoundSupply = Compound Supply Rate * <'0.4'_supplyRateWeights_configurable>
uint256 compoundSupply = compoundPool[_token].depositRatePerBlock.mul(globalConfig.compoundSupplyRateWeights());
// compoundBorrow = Compound Borrow Rate * <'0.6'_borrowRateWeights_configurable>
uint256 compoundBorrow = compoundPool[_token].borrowRatePerBlock.mul(globalConfig.compoundBorrowRateWeights());
// nonUtilizedCapRatio = (1 - U) // Non utilized capital ratio
uint256 nonUtilizedCapRatio = INT_UNIT.sub(capitalUtilizationRatio);
bool isSupportedOnCompound = globalConfig.tokenInfoRegistry().isSupportedOnCompound(_token);
if(isSupportedOnCompound) {
uint256 compoundSupplyPlusBorrow = compoundSupply.add(compoundBorrow).div(10);
uint256 rateConstant;
// if the token is supported in third party (like Compound), check if U = 1
if(capitalUtilizationRatio > ((10**18) - (2 * 10**16))) { // > 0.98
// if U = 1, borrowing rate = compoundSupply + compoundBorrow + ((rateCurveConstant * 100) / BLOCKS_PER_YEAR)
rateConstant = rateCurveConstant.mul(50).div(BLOCKS_PER_YEAR);
return compoundSupplyPlusBorrow.add(rateConstant);
} else {
// if U != 1, borrowing rate = compoundSupply + compoundBorrow + ((rateCurveConstant / (1 - U)) / BLOCKS_PER_YEAR)
rateConstant = rateCurveConstant.mul(10**18).div(nonUtilizedCapRatio).div(BLOCKS_PER_YEAR);
return compoundSupplyPlusBorrow.add(rateConstant);
}
} else {
// If the token is NOT supported by the third party, check if U = 1
if(capitalUtilizationRatio > ((10**18) - (2 * 10**16))) { // > 0.98
// if U = 1, borrowing rate = rateCurveConstant * 100
return rateCurveConstant.mul(50).div(BLOCKS_PER_YEAR);
} else {
// if 0 < U < 1, borrowing rate = 3% / (1 - U)
return rateCurveConstant.mul(10**18).div(nonUtilizedCapRatio).div(BLOCKS_PER_YEAR);
}
}
}
/**
* Get Deposit Rate. Deposit APR = (Borrow APR * Utilization Rate (U) + Compound Supply Rate *
* Capital Compound Ratio (C) )* (1- DeFiner Community Fund Ratio (D)). The scaling is 10 ** 18
* @param _token token address
* @return deposite rate of blocks before the current block
*/
function getDepositRatePerBlock(address _token) public view returns(uint) {
uint256 borrowRatePerBlock = getBorrowRatePerBlock(_token);
uint256 capitalUtilRatio = getCapitalUtilizationRatio(_token);
if(!globalConfig.tokenInfoRegistry().isSupportedOnCompound(_token))
return borrowRatePerBlock.mul(capitalUtilRatio).div(INT_UNIT);
return borrowRatePerBlock.mul(capitalUtilRatio).add(compoundPool[_token].depositRatePerBlock
.mul(compoundPool[_token].capitalRatio)).div(INT_UNIT);
}
/**
* Get capital utilization. Capital Utilization Rate (U )= total loan outstanding / Total market deposit
* @param _token token address
* @return Capital utilization ratio `U`.
* Valid range: 0 ≤ U ≤ 10^18
*/
function getCapitalUtilizationRatio(address _token) public view returns(uint) {
uint256 totalDepositsNow = getTotalDepositStore(_token);
if(totalDepositsNow == 0) {
return 0;
} else {
return totalLoans[_token].mul(INT_UNIT).div(totalDepositsNow);
}
}
/**
* Ratio of the capital in Compound
* @param _token token address
*/
function getCapitalCompoundRatio(address _token) public view returns(uint) {
address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
if(totalCompound[cToken] == 0 ) {
return 0;
} else {
return uint(totalCompound[cToken].mul(INT_UNIT).div(getTotalDepositStore(_token)));
}
}
/**
* It's a utility function. Get the cummulative deposit rate in a block interval ending in current block
* @param _token token address
* @param _depositRateRecordStart the start block of the interval
* @dev This function should always be called after current block is set as a new rateIndex point.
*/
function getDepositAccruedRate(address _token, uint _depositRateRecordStart) external view returns (uint256) {
uint256 depositRate = depositeRateIndex[_token][_depositRateRecordStart];
require(depositRate != 0, "_depositRateRecordStart is not a check point on index curve.");
return depositeRateIndexNow(_token).mul(INT_UNIT).div(depositRate);
}
/**
* Get the cummulative borrow rate in a block interval ending in current block
* @param _token token address
* @param _borrowRateRecordStart the start block of the interval
* @dev This function should always be called after current block is set as a new rateIndex point.
*/
function getBorrowAccruedRate(address _token, uint _borrowRateRecordStart) external view returns (uint256) {
uint256 borrowRate = borrowRateIndex[_token][_borrowRateRecordStart];
require(borrowRate != 0, "_borrowRateRecordStart is not a check point on index curve.");
return borrowRateIndexNow(_token).mul(INT_UNIT).div(borrowRate);
}
/**
* Set a new rate index checkpoint.
* @param _token token address
* @dev The rate set at the checkpoint is the rate from the last checkpoint to this checkpoint
*/
function newRateIndexCheckpoint(address _token) public onlyAuthorized {
// return if the rate check point already exists
uint blockNumber = getBlockNumber();
if (blockNumber == lastCheckpoint[_token])
return;
uint256 UNIT = INT_UNIT;
address cToken = globalConfig.tokenInfoRegistry().getCToken(_token);
// If it is the first check point, initialize the rate index
uint256 previousCheckpoint = lastCheckpoint[_token];
if (lastCheckpoint[_token] == 0) {
if(cToken == address(0)) {
compoundPool[_token].supported = false;
borrowRateIndex[_token][blockNumber] = UNIT;
depositeRateIndex[_token][blockNumber] = UNIT;
// Update the last checkpoint
lastCheckpoint[_token] = blockNumber;
}
else {
compoundPool[_token].supported = true;
uint cTokenExchangeRate = ICToken(cToken).exchangeRateCurrent();
// Get the curretn cToken exchange rate in Compound, which is need to calculate DeFiner's rate
compoundPool[_token].capitalRatio = getCapitalCompoundRatio(_token);
compoundPool[_token].borrowRatePerBlock = ICToken(cToken).borrowRatePerBlock(); // initial value
compoundPool[_token].depositRatePerBlock = ICToken(cToken).supplyRatePerBlock(); // initial value
borrowRateIndex[_token][blockNumber] = UNIT;
depositeRateIndex[_token][blockNumber] = UNIT;
// Update the last checkpoint
lastCheckpoint[_token] = blockNumber;
lastCTokenExchangeRate[cToken] = cTokenExchangeRate;
}
} else {
if(cToken == address(0)) {
compoundPool[_token].supported = false;
borrowRateIndex[_token][blockNumber] = borrowRateIndexNow(_token);
depositeRateIndex[_token][blockNumber] = depositeRateIndexNow(_token);
// Update the last checkpoint
lastCheckpoint[_token] = blockNumber;
} else {
compoundPool[_token].supported = true;
uint cTokenExchangeRate = ICToken(cToken).exchangeRateCurrent();
// Get the curretn cToken exchange rate in Compound, which is need to calculate DeFiner's rate
compoundPool[_token].capitalRatio = getCapitalCompoundRatio(_token);
compoundPool[_token].borrowRatePerBlock = ICToken(cToken).borrowRatePerBlock();
compoundPool[_token].depositRatePerBlock = cTokenExchangeRate.mul(UNIT).div(lastCTokenExchangeRate[cToken])
.sub(UNIT).div(blockNumber.sub(lastCheckpoint[_token]));
borrowRateIndex[_token][blockNumber] = borrowRateIndexNow(_token);
depositeRateIndex[_token][blockNumber] = depositeRateIndexNow(_token);
// Update the last checkpoint
lastCheckpoint[_token] = blockNumber;
lastCTokenExchangeRate[cToken] = cTokenExchangeRate;
}
}
// Update the total loan
if(borrowRateIndex[_token][blockNumber] != UNIT) {
totalLoans[_token] = totalLoans[_token].mul(borrowRateIndex[_token][blockNumber])
.div(borrowRateIndex[_token][previousCheckpoint]);
}
emit UpdateIndex(_token, depositeRateIndex[_token][getBlockNumber()], borrowRateIndex[_token][getBlockNumber()]);
}
/**
* Calculate a token deposite rate of current block
* @param _token token address
* @dev This is an looking forward estimation from last checkpoint and not the exactly rate that the user will pay or earn.
*/
function depositeRateIndexNow(address _token) public view returns(uint) {
uint256 lcp = lastCheckpoint[_token];
// If this is the first checkpoint, set the index be 1.
if(lcp == 0)
return INT_UNIT;
uint256 lastDepositeRateIndex = depositeRateIndex[_token][lcp];
uint256 depositRatePerBlock = getDepositRatePerBlock(_token);
// newIndex = oldIndex*(1+r*delta_block). If delta_block = 0, i.e. the last checkpoint is current block, index doesn't change.
return lastDepositeRateIndex.mul(getBlockNumber().sub(lcp).mul(depositRatePerBlock).add(INT_UNIT)).div(INT_UNIT);
}
/**
* Calculate a token borrow rate of current block
* @param _token token address
*/
function borrowRateIndexNow(address _token) public view returns(uint) {
uint256 lcp = lastCheckpoint[_token];
// If this is the first checkpoint, set the index be 1.
if(lcp == 0)
return INT_UNIT;
uint256 lastBorrowRateIndex = borrowRateIndex[_token][lcp];
uint256 borrowRatePerBlock = getBorrowRatePerBlock(_token);
return lastBorrowRateIndex.mul(getBlockNumber().sub(lcp).mul(borrowRatePerBlock).add(INT_UNIT)).div(INT_UNIT);
}
/**
* Get the state of the given token
* @param _token token address
*/
function getTokenState(address _token) public view returns (uint256 deposits, uint256 loans, uint256 reserveBalance, uint256 remainingAssets){
return (
getTotalDepositStore(_token),
totalLoans[_token],
totalReserve[_token],
totalReserve[_token].add(totalCompound[globalConfig.tokenInfoRegistry().getCToken(_token)])
);
}
function getPoolAmount(address _token) public view returns(uint) {
return totalReserve[_token].add(totalCompound[globalConfig.tokenInfoRegistry().getCToken(_token)]);
}
function deposit(address _to, address _token, uint256 _amount) external onlyAuthorized {
require(_amount != 0, "Amount is zero");
// Add a new checkpoint on the index curve.
newRateIndexCheckpoint(_token);
updateDepositFINIndex(_token);
// Update tokenInfo. Add the _amount to principal, and update the last deposit block in tokenInfo
globalConfig.accounts().deposit(_to, _token, _amount);
// Update the amount of tokens in compound and loans, i.e. derive the new values
// of C (Compound Ratio) and U (Utilization Ratio).
uint compoundAmount = update(_token, _amount, ActionType.DepositAction);
if(compoundAmount > 0) {
globalConfig.savingAccount().toCompound(_token, compoundAmount);
}
}
function borrow(address _from, address _token, uint256 _amount) external onlyAuthorized {
// Add a new checkpoint on the index curve.
newRateIndexCheckpoint(_token);
updateBorrowFINIndex(_token);
// Update tokenInfo for the user
globalConfig.accounts().borrow(_from, _token, _amount);
// Update pool balance
// Update the amount of tokens in compound and loans, i.e. derive the new values
// of C (Compound Ratio) and U (Utilization Ratio).
uint compoundAmount = update(_token, _amount, ActionType.BorrowAction);
if(compoundAmount > 0) {
globalConfig.savingAccount().fromCompound(_token, compoundAmount);
}
}
function repay(address _to, address _token, uint256 _amount) external onlyAuthorized returns(uint) {
// Add a new checkpoint on the index curve.
newRateIndexCheckpoint(_token);
updateBorrowFINIndex(_token);
// Sanity check
require(globalConfig.accounts().getBorrowPrincipal(_to, _token) > 0,
"Token BorrowPrincipal must be greater than 0. To deposit balance, please use deposit button."
);
// Update tokenInfo
uint256 remain = globalConfig.accounts().repay(_to, _token, _amount);
// Update the amount of tokens in compound and loans, i.e. derive the new values
// of C (Compound Ratio) and U (Utilization Ratio).
uint compoundAmount = update(_token, _amount.sub(remain), ActionType.RepayAction);
if(compoundAmount > 0) {
globalConfig.savingAccount().toCompound(_token, compoundAmount);
}
// Return actual amount repaid
return _amount.sub(remain);
}
/**
* Withdraw a token from an address
* @param _from address to be withdrawn from
* @param _token token address
* @param _amount amount to be withdrawn
* @return The actually amount withdrawed, which will be the amount requested minus the commission fee.
*/
function withdraw(address _from, address _token, uint256 _amount) external onlyAuthorized returns(uint) {
require(_amount != 0, "Amount is zero");
// Add a new checkpoint on the index curve.
newRateIndexCheckpoint(_token);
updateDepositFINIndex(_token);
// Withdraw from the account
uint amount = globalConfig.accounts().withdraw(_from, _token, _amount);
// Update pool balance
// Update the amount of tokens in compound and loans, i.e. derive the new values
// of C (Compound Ratio) and U (Utilization Ratio).
uint compoundAmount = update(_token, amount, ActionType.WithdrawAction);
// Check if there are enough tokens in the pool.
if(compoundAmount > 0) {
globalConfig.savingAccount().fromCompound(_token, compoundAmount);
}
return amount;
}
/**
* Get current block number
* @return the current block number
*/
function getBlockNumber() private view returns (uint) {
return block.number;
}
function version() public pure returns(string memory) {
return "v1.2.0";
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowFINRateIndex","type":"uint256"}],"name":"UpdateBorrowFINIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositFINRateIndex","type":"uint256"}],"name":"UpdateDepositFINIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositeRateIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowRateIndex","type":"uint256"}],"name":"UpdateIndex","type":"event"},{"constant":true,"inputs":[],"name":"ACCURACY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BLOCKS_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INT_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowFINRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"borrowRateIndexNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositFINRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositeRateIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"depositeRateIndexNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_borrowRateRecordStart","type":"uint256"}],"name":"getBorrowAccruedRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getBorrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCapitalCompoundRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCapitalUtilizationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_depositRateRecordStart","type":"uint256"}],"name":"getDepositAccruedRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getDepositRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getPoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTokenState","outputs":[{"internalType":"uint256","name":"deposits","type":"uint256"},{"internalType":"uint256","name":"loans","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"remainingAssets","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTotalDepositStore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGlobalConfig","name":"_globalConfig","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBorrowFINRateCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCTokenExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDepositFINRateCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"newRateIndexCheckpoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalLoans","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"enum Constant.ActionType","name":"_action","type":"uint8"}],"name":"update","outputs":[{"internalType":"uint256","name":"compoundAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateBorrowFINIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateDepositFINIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50614881806100206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636dae2fa511610130578063d2796a93116100b8578063de34b0f41161007c578063de34b0f4146107b2578063e0b5a664146107d8578063e9ace6d9146107fe578063f487196614610824578063fbcd9b051461074e57610227565b8063d2796a9314610720578063d37db1d214610746578063d8c2d84c1461074e578063d8d7891714610756578063d9caed121461077c57610227565b80637aa473d1116100ff5780637aa473d11461064c5780638340f54914610678578063945eb764146106ae578063c4d66de8146106d4578063c9ca7d31146106fa57610227565b80636dae2fa5146105b65780636e5d84ba146105dc57806374a23843146106025780637753f47b1461062857610227565b80634cb9792b116101b357806354fd4d501161018257806354fd4d501461048657806356697310146105035780635a80c4971461052f5780635f85ca471461055b57806362e4a78c1461058157610227565b80634cb9792b146103dc5780634d770570146104025780634e7e36e2146104285780635224372c1461044e57610227565b80631ff4443c116101fa5780631ff4443c1461031257806329aa42181461033e5780632d6cb68114610364578063343340f41461039057806337a58b15146103b657610227565b80630603c2221461022c5780630b3eb9701461026a5780630b574443146102b65780631da649cf146102dc575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561084a565b60408051918252519081900360200190f35b6102906004803603602081101561028057600080fd5b50356001600160a01b0316610867565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610258600480360360208110156102cc57600080fd5b50356001600160a01b03166109c9565b610258600480360360608110156102f257600080fd5b506001600160a01b03813581169160208101359091169060400135610a93565b6102586004803603604081101561032857600080fd5b506001600160a01b038135169060200135610f31565b6102586004803603602081101561035457600080fd5b50356001600160a01b0316610f4e565b6102586004803603604081101561037a57600080fd5b506001600160a01b038135169060200135610f60565b610258600480360360208110156103a657600080fd5b50356001600160a01b0316610fe3565b610258600480360360208110156103cc57600080fd5b50356001600160a01b0316610ff5565b610258600480360360208110156103f257600080fd5b50356001600160a01b0316611007565b6102586004803603602081101561041857600080fd5b50356001600160a01b0316611019565b6102586004803603602081101561043e57600080fd5b50356001600160a01b0316611075565b6104846004803603606081101561046457600080fd5b506001600160a01b03813581169160208101359091169060400135611087565b005b61048e6113d2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c85781810151838201526020016104b0565b50505050905090810190601f1680156104f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561051957600080fd5b506001600160a01b0381351690602001356113f2565b6102586004803603604081101561054557600080fd5b506001600160a01b03813516906020013561140f565b6104846004803603602081101561057157600080fd5b50356001600160a01b0316611488565b6102586004803603606081101561059757600080fd5b5080356001600160a01b0316906020810135906040013560ff166115e9565b610258600480360360208110156105cc57600080fd5b50356001600160a01b0316611748565b610258600480360360208110156105f257600080fd5b50356001600160a01b03166118d1565b6102586004803603602081101561061857600080fd5b50356001600160a01b0316611a17565b610630611a29565b604080516001600160a01b039092168252519081900360200190f35b6102586004803603604081101561066257600080fd5b506001600160a01b038135169060200135611a2e565b6104846004803603606081101561068e57600080fd5b506001600160a01b03813581169160208101359091169060400135611a4b565b610258600480360360208110156106c457600080fd5b50356001600160a01b0316611dba565b610484600480360360208110156106ea57600080fd5b50356001600160a01b0316611eed565b6102586004803603602081101561071057600080fd5b50356001600160a01b0316611fab565b6104846004803603602081101561073657600080fd5b50356001600160a01b0316612371565b61025861274a565b610258612751565b6102586004803603602081101561076c57600080fd5b50356001600160a01b031661275d565b6102586004803603606081101561079257600080fd5b506001600160a01b038135811691602081013590911690604001356127ba565b610484600480360360208110156107c857600080fd5b50356001600160a01b0316612b50565b610484600480360360208110156107ee57600080fd5b50356001600160a01b031661345a565b6102586004803603602081101561081457600080fd5b50356001600160a01b03166137f9565b6102586004803603602081101561083a57600080fd5b50356001600160a01b031661380b565b603d60209081526000928352604080842090915290825290205481565b600080600080610876856118d1565b6001600160a01b038087166000908152603360209081526040808320546034835281842054603b548351639895880f60e01b81529351929691956109ba9560359591949290931692639895880f92600480840193829003018186803b1580156108de57600080fd5b505afa1580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b505160408051637e5a4eb960e01b81526001600160a01b038e8116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561095457600080fd5b505afa158015610968573d6000803e3d6000fd5b505050506040513d602081101561097e57600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918d16815260349093529120549063ffffffff61396516565b93509350935093509193509193565b6001600160a01b038116600090815260386020526040812054806109f85750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260376020908152604080832084845290915281205490610a2685611fab565b9050610a88670de0b6b3a7640000610a7c610a6f82610a6386610a578a610a4b6139bf565b9063ffffffff6139c316565b9063ffffffff613a0516565b9063ffffffff61396516565b859063ffffffff613a0516565b9063ffffffff613a5e16565b93505050505b919050565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b158015610ad857600080fd5b505afa158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b50516001600160a01b0316331480610b9b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6357600080fd5b505afa158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b50516001600160a01b031633145b610bd65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b610bdf83612b50565b610be883612371565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610c2d57600080fd5b505afa158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b505160408051638224b89960e01b81526001600160a01b038881166004830152878116602483015291519190921691638224b899916044808301926020929190829003018186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d6020811015610cd557600080fd5b505111610d135760405162461bcd60e51b815260040180806020018281038252605c81526020018061472f605c913960600191505060405180910390fd5b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d6020811015610d8257600080fd5b505160408051631da649cf60e01b81526001600160a01b03888116600483015287811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b505190506000610e2a85610e23868563ffffffff6139c316565b60036115e9565b90508015610f1757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d6020811015610eaa57600080fd5b505160408051638280e5a960e01b81526001600160a01b0388811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b158015610efe57600080fd5b505af1158015610f12573d6000803e3d6000fd5b505050505b610f27848363ffffffff6139c316565b9695505050505050565b603660209081526000928352604080842090915290825290205481565b603f6020526000908152604090205481565b6001600160a01b038216600090815260376020908152604080832084845290915281205480610fc05760405162461bcd60e51b815260040180806020018281038252603b815260200180614812603b913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a57886109c9565b9150505b92915050565b60336020526000908152604090205481565b60356020526000908152604090205481565b603e6020526000908152604090205481565b600080611025836118d1565b905080611036576000915050610a8e565b6001600160a01b03831660009081526033602052604090205461106d908290610a7c90670de0b6b3a764000063ffffffff613a0516565b915050610a8e565b60346020526000908152604090205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b03163314806111985750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b50516001600160a01b031633145b6111d35760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6111dc82612b50565b6111e582612371565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516314890dcb60e21b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691635224372c91606480830192600092919082900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b5050505060006112df838360026115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133557600080fd5b505afa158015611349573d6000803e3d6000fd5b505050506040513d602081101561135f57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038681166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603c60209081526000928352604080842090915290825290205481565b6001600160a01b03821660009081526036602090815260408083208484529091528120548061146f5760405162461bcd60e51b815260040180806020018281038252603c8152602001806146f3603c913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a578861275d565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50516001600160a01b03163314806115995750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b50516001600160a01b031633145b6115d45760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6115dd81612b50565b6115e681613aa0565b50565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d602081101561165857600080fd5b50516001600160a01b03163314806116f15750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d60208110156116e357600080fd5b50516001600160a01b031633145b61172c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b61173584613aa0565b611740848484613cb1565b949350505050565b60008061175483611fab565b9050600061176184611019565b9050603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b505160408051630e525ed960e21b81526001600160a01b038781166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d602081101561185157600080fd5b505161187c57611873670de0b6b3a7640000610a7c848463ffffffff613a0516565b92505050610a8e565b6001600160a01b0384166000908152603a60205260409020600181015460029091015461174091670de0b6b3a764000091610a7c916118c1919063ffffffff613a0516565b610a63868663ffffffff613a0516565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561199857600080fd5b505afa1580156119ac573d6000803e3d6000fd5b505050506040513d60208110156119c257600080fd5b50516001600160a01b0380851660009081526034602090815260408083205460338352818420549486168452603590925290912054929350611a10929091610a63919063ffffffff61396516565b9392505050565b60386020526000908152604090205481565b600e81565b603760209081526000928352604080842090915290825290205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b50516001600160a01b0316331480611b5c5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b50516001600160a01b031633145b611b975760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b80611bda576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b611be382612b50565b611bec8261345a565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b505160408051638340f54960e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015611cc057600080fd5b505af1158015611cd4573d6000803e3d6000fd5b505050506000611ce6838360006115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3c57600080fd5b505afa158015611d50573d6000803e3d6000fd5b505050506040513d6020811015611d6657600080fd5b505160408051638280e5a960e01b81526001600160a01b0386811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b1580156113b357600080fd5b6000610fdd60356000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1157600080fd5b505afa158015611e25573d6000803e3d6000fd5b505050506040513d6020811015611e3b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918716815260349093529120549063ffffffff61396516565b600054610100900460ff1680611f065750611f066145f0565b80611f14575060005460ff16155b611f4f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806147ac602e913960400191505060405180910390fd5b600054610100900460ff16158015611f7a576000805460ff1961ff0019909116610100171660011790555b603b80546001600160a01b0319166001600160a01b0384161790558015611fa7576000805461ff00191690555b5050565b600080611fb783611019565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b031663b442a2066040518163ffffffff1660e01b815260040160206040518083038186803b15801561200957600080fd5b505afa15801561201d573d6000803e3d6000fd5b505050506040513d602081101561203357600080fd5b5051603b54604080516308fafb8d60e01b815290519293506000926120d5926001600160a01b0316916308fafb8d916004808301926020929190829003018186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516001600160a01b0387166000908152603a60205260409020600201549063ffffffff613a0516565b9050600061217e603b60009054906101000a90046001600160a01b03166001600160a01b03166313afb8ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0388166000908152603a60205260409020600301549063ffffffff613a0516565b9050600061219a670de0b6b3a76400008663ffffffff6139c316565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ec57600080fd5b505afa158015612200573d6000803e3d6000fd5b505050506040513d602081101561221657600080fd5b505160408051630e525ed960e21b81526001600160a01b038b81166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b50519050801561231b5760006122ad600a610a7c878763ffffffff61396516565b90506000670d99a8cec7e200008811156122fa576122d962201480610a7c89603263ffffffff613a0516565b90506122eb828263ffffffff61396516565b98505050505050505050610a8e565b6122d962201480610a7c86818b670de0b6b3a764000063ffffffff613a0516565b670d99a8cec7e200008611156123505761234362201480610a7c87603263ffffffff613a0516565b9650505050505050610a8e565b61234362201480610a7c848189670de0b6b3a764000063ffffffff613a0516565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156123bf57600080fd5b505afa1580156123d3573d6000803e3d6000fd5b505050506040513d60208110156123e957600080fd5b50516001600160a01b03163314806124825750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561244a57600080fd5b505afa15801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516001600160a01b031633145b6124bd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006124c76139bf565b6001600160a01b0383166000908152603f60205260408120549192509015612518576001600160a01b0383166000908152603f602052604090205461251390839063ffffffff6139c316565b61251b565b60005b6001600160a01b0384166000908152603360205260409020549091506126d6901561269c5761269760336000866001600160a01b03166001600160a01b0316815260200190815260200160002054610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ba57600080fd5b505afa1580156125ce573d6000803e3d6000fd5b505050506040513d60208110156125e457600080fd5b50516040805163d7fa113760e01b81526001600160a01b038a811660048301529151919092169163d7fa1137916024808301926020929190829003018186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b50516001600160a01b038816600090815260376020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61269f565b60005b6001600160a01b0385166000908152603d60209081526040808320603f83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603d60209081526040808320878452808352818420958655848452603f83528184208890559287905291815292548151908152905191927fabb9f52b6cb5c079bc60ea0d31e98448916c1b4fdbfea1dda8e2ef9802588bfd92918290030190a2505050565b6220148081565b670de0b6b3a764000081565b6001600160a01b0381166000908152603860205260408120548061278c5750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260366020908152604080832084845290915281205490610a2685611748565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d602081101561282957600080fd5b50516001600160a01b03163314806128c25750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b50516001600160a01b031633145b6128fd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b81612940576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b61294983612b50565b6129528361345a565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d60208110156129c157600080fd5b505160408051636ce5768960e11b81526001600160a01b0388811660048301528781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505190506000612a5a858360016115e9565b90508015612b4757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab057600080fd5b505afa158015612ac4573d6000803e3d6000fd5b505050506040513d6020811015612ada57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038881166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050505b50949350505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50516001600160a01b0316331480612c615750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2957600080fd5b505afa158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50516001600160a01b031633145b612c9c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6000612ca66139bf565b6001600160a01b038316600090815260386020526040902054909150811415612ccf57506115e6565b603b5460408051639895880f60e01b81529051670de0b6b3a7640000926000926001600160a01b0390911691639895880f91600480820192602092909190829003018186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d6020811015612d4b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03878116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015612d9757600080fd5b505afa158015612dab573d6000803e3d6000fd5b505050506040513d6020811015612dc157600080fd5b50516001600160a01b0385166000908152603860205260409020549091508061305c576001600160a01b038216612e4c576001600160a01b0385166000818152603a60209081526040808320805460ff191690556037825280832088845282528083208790558383526036825280832088845282528083208790559282526038905220849055613057565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b158015612eaa57600080fd5b505af1158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50519050612ee18661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4657600080fd5b505afa158015612f5a573d6000803e3d6000fd5b505050506040513d6020811015612f7057600080fd5b50516001600160a01b038088166000908152603a6020908152604091829020600301939093558051630ae9d70b60e41b815290519186169263ae9d70b092600480840193829003018186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d6020811015612ff257600080fd5b50516001600160a01b038088166000818152603a6020908152604080832060020195909555603781528482208a83528152848220899055828252603681528482208a835281528482208990559181526038825283812089905591861682526039905220555b61331f565b6001600160a01b0382166130f8576001600160a01b0385166000908152603a60205260409020805460ff19169055613093856109c9565b6001600160a01b03861660009081526037602090815260408083208884529091529020556130c08561275d565b6001600160a01b038616600081815260366020908152604080832089845282528083209490945591815260389091522084905561331f565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b15801561315657600080fd5b505af115801561316a573d6000803e3d6000fd5b505050506040513d602081101561318057600080fd5b5051905061318d8661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b50516001600160a01b0387166000908152603a602090815260408083206003019390935560389052205461328c9061325b90879063ffffffff6139c316565b6001600160a01b038516600090815260396020526040902054610a7c908790610a4b9083878463ffffffff613a0516565b6001600160a01b0387166000908152603a60205260409020600201556132b1866109c9565b6001600160a01b03871660009081526037602090815260408083208984529091529020556132de8661275d565b6001600160a01b0380881660008181526036602090815260408083208b84528252808320959095559181526038825283812089905591861682526039905220555b6001600160a01b038516600090815260376020908152604080832087845290915290205483146133a8576001600160a01b03851660008181526037602090815260408083208584528252808320548884528184205494845260339092529091205461338e92610a7c9190613a05565b6001600160a01b0386166000908152603360205260409020555b6001600160a01b03851660008181526036602052604081207f1cc14bf94d8329e459fdcf4f38c293236b70411487793b5c07ac7448c788c252916133ea6139bf565b81526020019081526020016000205460376000896001600160a01b03166001600160a01b0316815260200190815260200160002060006134286139bf565b815260200190815260200160002054604051808381526020018281526020019250505060405180910390a25050505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156134a857600080fd5b505afa1580156134bc573d6000803e3d6000fd5b505050506040513d60208110156134d257600080fd5b50516001600160a01b031633148061356b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b50516001600160a01b031633145b6135a65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006135b06139bf565b6001600160a01b0383166000908152603e60205260408120549192509015613601576001600160a01b0383166000908152603e60205260409020546135fc90839063ffffffff6139c316565b613604565b60005b9050613785613612846118d1565b1561374b57613746613623856118d1565b603b5460408051639895880f60e01b81529051610a7c926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561366957600080fd5b505afa15801561367d573d6000803e3d6000fd5b505050506040513d602081101561369357600080fd5b505160408051637a78a94360e01b81526001600160a01b038a8116600483015291519190921691637a78a943916024808301926020929190829003018186803b1580156136df57600080fd5b505afa1580156136f3573d6000803e3d6000fd5b505050506040513d602081101561370957600080fd5b50516001600160a01b038816600090815260366020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61374e565b60005b6001600160a01b0385166000908152603c60209081526040808320603e83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603c60209081526040808320878452808352818420958655848452603e83528184208890559287905291815292548151908152905191927f2aa34452d1f231efd3e8dc3eae64938dbfa82f1b40e2b994e1a395d7ed27ae5b92918290030190a2505050565b60396020526000908152604090205481565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b1580156138d257600080fd5b505afa1580156138e6573d6000803e3d6000fd5b505050506040513d60208110156138fc57600080fd5b50516001600160a01b038116600090815260356020526040902054909150613928576000915050610a8e565b61106d613934846118d1565b6001600160a01b038316600090815260356020526040902054610a7c90670de0b6b3a764000063ffffffff613a0516565b600082820183811015611a10576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b4390565b6000611a1083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506145f6565b600082613a1457506000610fdd565b82820282848281613a2157fe5b0414611a105760405162461bcd60e51b815260040180806020018281038252602181526020018061478b6021913960400191505060405180910390fd5b6000611a1083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061468d565b603b5460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b158015613ae557600080fd5b505afa158015613af9573d6000803e3d6000fd5b505050506040513d6020811015613b0f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613b5b57600080fd5b505afa158015613b6f573d6000803e3d6000fd5b505050506040513d6020811015613b8557600080fd5b505190506001600160a01b03811615611fa757806001600160a01b0316633af9e669603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bf557600080fd5b505afa158015613c09573d6000803e3d6000fd5b505050506040513d6020811015613c1f57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301525160248083019260209291908290030181600087803b158015613c6857600080fd5b505af1158015613c7c573d6000803e3d6000fd5b505050506040513d6020811015613c9257600080fd5b50516001600160a01b0382166000908152603560205260409020555050565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613d7857600080fd5b505afa158015613d8c573d6000803e3d6000fd5b505050506040513d6020811015613da257600080fd5b505190506000613db1866118d1565b90506000846004811115613dc157fe5b1480613dd857506003846004811115613dd657fe5b145b1561409a576000846004811115613deb57fe5b1415613e0857613e01818663ffffffff61396516565b9050613e4b565b6001600160a01b038616600090815260336020526040902054613e31908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b038616600090815260346020526040812054613e74908763ffffffff61396516565b90506001600160a01b03831615801590613f1b5750613f186064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663268c74e46040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b505afa158015613ef3573d6000803e3d6000fd5b505050506040513d6020811015613f0957600080fd5b5051859063ffffffff613a0516565b81115b15614051576000613fc1613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b158015613f7b57600080fd5b505afa158015613f8f573d6000803e3d6000fd5b505050506040513d6020811015613fa557600080fd5b5051879063ffffffff613a0516565b839063ffffffff6139c316565b6001600160a01b038516600090815260356020526040902054909550859150613ff0908263ffffffff61396516565b6001600160a01b03808616600090815260356020908152604080832094909455918b16815260349091522054614032908290610a4b908a63ffffffff61396516565b6001600160a01b03891660009081526034602052604090205550614094565b6001600160a01b03871660009081526034602052604090205461407a908763ffffffff61396516565b6001600160a01b0388166000908152603460205260409020555b506145e7565b60048460048111156140a857fe5b14156140f5576001600160a01b0386166000908152603360205260409020546140d7908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020556145e7565b600184600481111561410357fe5b14156141ed576001600160a01b03861660009081526033602052604090205415614189578461413187611dba565b1015614184576040805162461bcd60e51b815260206004820181905260248201527f4c61636b206f66206c6971756964697479207768656e2077697468647261772e604482015290519081900360640190fd5b6141dd565b8461419387611dba565b10156141dd576001600160a01b0382166000908152603560205260409020546141c390869063ffffffff6139c316565b6001600160a01b0387166000908152603460205260409020555b6141e6866118d1565b905061424a565b846141f787611dba565b101561424a576040805162461bcd60e51b815260206004820152601e60248201527f4c61636b206f66206c6971756964697479207768656e20626f72726f772e0000604482015290519081900360640190fd5b600184600481111561425857fe5b14156142755761426e818663ffffffff6139c316565b90506142b8565b6001600160a01b03861660009081526033602052604090205461429e908663ffffffff61396516565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b03861660009081526034602052604081205486106142de576000614307565b6001600160a01b038716600090815260346020526040902054614307908763ffffffff6139c316565b90506001600160a01b0383161580159061437d575081158061437d575061437a6064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316635a596d1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b81105b156145a2576001600160a01b03808416600090815260356020908152604080832054938b168352603490915281205490916143c4918991610a4b919063ffffffff61396516565b90506144556064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d602081101561444657600080fd5b5051869063ffffffff613a0516565b811015614494576001600160a01b038085166000908152603560209081526040808320805490849055938c16835260349091529020829055945061459c565b6000614528613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b1580156144ef57600080fd5b505afa158015614503573d6000803e3d6000fd5b505050506040513d602081101561451957600080fd5b5051889063ffffffff613a0516565b6001600160a01b038616600090815260356020526040902054909150614554908263ffffffff6139c316565b6001600160a01b03861660009081526035602052604090208290559550614581828263ffffffff6139c316565b6001600160a01b038a16600090815260346020526040902055505b506145e5565b6001600160a01b0387166000908152603460205260409020546145cb908763ffffffff6139c316565b6001600160a01b0388166000908152603460205260409020555b505b50509392505050565b303b1590565b600081848411156146855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561464a578181015183820152602001614632565b50505050905090810190601f1680156146775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836146dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561464a578181015183820152602001614632565b5060008385816146e857fe5b049594505050505056fe5f6465706f736974526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652e546f6b656e20426f72726f775072696e636970616c206d7573742062652067726561746572207468616e20302e20546f206465706f7369742062616c616e63652c20706c6561736520757365206465706f73697420627574746f6e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5f626f72726f77526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652ea265627a7a72315820757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef84664736f6c634300050e0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636dae2fa511610130578063d2796a93116100b8578063de34b0f41161007c578063de34b0f4146107b2578063e0b5a664146107d8578063e9ace6d9146107fe578063f487196614610824578063fbcd9b051461074e57610227565b8063d2796a9314610720578063d37db1d214610746578063d8c2d84c1461074e578063d8d7891714610756578063d9caed121461077c57610227565b80637aa473d1116100ff5780637aa473d11461064c5780638340f54914610678578063945eb764146106ae578063c4d66de8146106d4578063c9ca7d31146106fa57610227565b80636dae2fa5146105b65780636e5d84ba146105dc57806374a23843146106025780637753f47b1461062857610227565b80634cb9792b116101b357806354fd4d501161018257806354fd4d501461048657806356697310146105035780635a80c4971461052f5780635f85ca471461055b57806362e4a78c1461058157610227565b80634cb9792b146103dc5780634d770570146104025780634e7e36e2146104285780635224372c1461044e57610227565b80631ff4443c116101fa5780631ff4443c1461031257806329aa42181461033e5780632d6cb68114610364578063343340f41461039057806337a58b15146103b657610227565b80630603c2221461022c5780630b3eb9701461026a5780630b574443146102b65780631da649cf146102dc575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561084a565b60408051918252519081900360200190f35b6102906004803603602081101561028057600080fd5b50356001600160a01b0316610867565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610258600480360360208110156102cc57600080fd5b50356001600160a01b03166109c9565b610258600480360360608110156102f257600080fd5b506001600160a01b03813581169160208101359091169060400135610a93565b6102586004803603604081101561032857600080fd5b506001600160a01b038135169060200135610f31565b6102586004803603602081101561035457600080fd5b50356001600160a01b0316610f4e565b6102586004803603604081101561037a57600080fd5b506001600160a01b038135169060200135610f60565b610258600480360360208110156103a657600080fd5b50356001600160a01b0316610fe3565b610258600480360360208110156103cc57600080fd5b50356001600160a01b0316610ff5565b610258600480360360208110156103f257600080fd5b50356001600160a01b0316611007565b6102586004803603602081101561041857600080fd5b50356001600160a01b0316611019565b6102586004803603602081101561043e57600080fd5b50356001600160a01b0316611075565b6104846004803603606081101561046457600080fd5b506001600160a01b03813581169160208101359091169060400135611087565b005b61048e6113d2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c85781810151838201526020016104b0565b50505050905090810190601f1680156104f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561051957600080fd5b506001600160a01b0381351690602001356113f2565b6102586004803603604081101561054557600080fd5b506001600160a01b03813516906020013561140f565b6104846004803603602081101561057157600080fd5b50356001600160a01b0316611488565b6102586004803603606081101561059757600080fd5b5080356001600160a01b0316906020810135906040013560ff166115e9565b610258600480360360208110156105cc57600080fd5b50356001600160a01b0316611748565b610258600480360360208110156105f257600080fd5b50356001600160a01b03166118d1565b6102586004803603602081101561061857600080fd5b50356001600160a01b0316611a17565b610630611a29565b604080516001600160a01b039092168252519081900360200190f35b6102586004803603604081101561066257600080fd5b506001600160a01b038135169060200135611a2e565b6104846004803603606081101561068e57600080fd5b506001600160a01b03813581169160208101359091169060400135611a4b565b610258600480360360208110156106c457600080fd5b50356001600160a01b0316611dba565b610484600480360360208110156106ea57600080fd5b50356001600160a01b0316611eed565b6102586004803603602081101561071057600080fd5b50356001600160a01b0316611fab565b6104846004803603602081101561073657600080fd5b50356001600160a01b0316612371565b61025861274a565b610258612751565b6102586004803603602081101561076c57600080fd5b50356001600160a01b031661275d565b6102586004803603606081101561079257600080fd5b506001600160a01b038135811691602081013590911690604001356127ba565b610484600480360360208110156107c857600080fd5b50356001600160a01b0316612b50565b610484600480360360208110156107ee57600080fd5b50356001600160a01b031661345a565b6102586004803603602081101561081457600080fd5b50356001600160a01b03166137f9565b6102586004803603602081101561083a57600080fd5b50356001600160a01b031661380b565b603d60209081526000928352604080842090915290825290205481565b600080600080610876856118d1565b6001600160a01b038087166000908152603360209081526040808320546034835281842054603b548351639895880f60e01b81529351929691956109ba9560359591949290931692639895880f92600480840193829003018186803b1580156108de57600080fd5b505afa1580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b505160408051637e5a4eb960e01b81526001600160a01b038e8116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561095457600080fd5b505afa158015610968573d6000803e3d6000fd5b505050506040513d602081101561097e57600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918d16815260349093529120549063ffffffff61396516565b93509350935093509193509193565b6001600160a01b038116600090815260386020526040812054806109f85750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260376020908152604080832084845290915281205490610a2685611fab565b9050610a88670de0b6b3a7640000610a7c610a6f82610a6386610a578a610a4b6139bf565b9063ffffffff6139c316565b9063ffffffff613a0516565b9063ffffffff61396516565b859063ffffffff613a0516565b9063ffffffff613a5e16565b93505050505b919050565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b158015610ad857600080fd5b505afa158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b50516001600160a01b0316331480610b9b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6357600080fd5b505afa158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b50516001600160a01b031633145b610bd65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b610bdf83612b50565b610be883612371565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610c2d57600080fd5b505afa158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b505160408051638224b89960e01b81526001600160a01b038881166004830152878116602483015291519190921691638224b899916044808301926020929190829003018186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d6020811015610cd557600080fd5b505111610d135760405162461bcd60e51b815260040180806020018281038252605c81526020018061472f605c913960600191505060405180910390fd5b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d6020811015610d8257600080fd5b505160408051631da649cf60e01b81526001600160a01b03888116600483015287811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b505190506000610e2a85610e23868563ffffffff6139c316565b60036115e9565b90508015610f1757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d6020811015610eaa57600080fd5b505160408051638280e5a960e01b81526001600160a01b0388811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b158015610efe57600080fd5b505af1158015610f12573d6000803e3d6000fd5b505050505b610f27848363ffffffff6139c316565b9695505050505050565b603660209081526000928352604080842090915290825290205481565b603f6020526000908152604090205481565b6001600160a01b038216600090815260376020908152604080832084845290915281205480610fc05760405162461bcd60e51b815260040180806020018281038252603b815260200180614812603b913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a57886109c9565b9150505b92915050565b60336020526000908152604090205481565b60356020526000908152604090205481565b603e6020526000908152604090205481565b600080611025836118d1565b905080611036576000915050610a8e565b6001600160a01b03831660009081526033602052604090205461106d908290610a7c90670de0b6b3a764000063ffffffff613a0516565b915050610a8e565b60346020526000908152604090205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b03163314806111985750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b50516001600160a01b031633145b6111d35760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6111dc82612b50565b6111e582612371565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516314890dcb60e21b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691635224372c91606480830192600092919082900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b5050505060006112df838360026115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133557600080fd5b505afa158015611349573d6000803e3d6000fd5b505050506040513d602081101561135f57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038681166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b1580156113b357600080fd5b505af11580156113c7573d6000803e3d6000fd5b505050505b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603c60209081526000928352604080842090915290825290205481565b6001600160a01b03821660009081526036602090815260408083208484529091528120548061146f5760405162461bcd60e51b815260040180806020018281038252603c8152602001806146f3603c913960400191505060405180910390fd5b610fd981610a7c670de0b6b3a7640000610a578861275d565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50516001600160a01b03163314806115995750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b50516001600160a01b031633145b6115d45760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6115dd81612b50565b6115e681613aa0565b50565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d602081101561165857600080fd5b50516001600160a01b03163314806116f15750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b957600080fd5b505afa1580156116cd573d6000803e3d6000fd5b505050506040513d60208110156116e357600080fd5b50516001600160a01b031633145b61172c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b61173584613aa0565b611740848484613cb1565b949350505050565b60008061175483611fab565b9050600061176184611019565b9050603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b505160408051630e525ed960e21b81526001600160a01b038781166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d602081101561185157600080fd5b505161187c57611873670de0b6b3a7640000610a7c848463ffffffff613a0516565b92505050610a8e565b6001600160a01b0384166000908152603a60205260409020600181015460029091015461174091670de0b6b3a764000091610a7c916118c1919063ffffffff613a0516565b610a63868663ffffffff613a0516565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d602081101561194c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561199857600080fd5b505afa1580156119ac573d6000803e3d6000fd5b505050506040513d60208110156119c257600080fd5b50516001600160a01b0380851660009081526034602090815260408083205460338352818420549486168452603590925290912054929350611a10929091610a63919063ffffffff61396516565b9392505050565b60386020526000908152604090205481565b600e81565b603760209081526000928352604080842090915290825290205481565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b50516001600160a01b0316331480611b5c5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b50516001600160a01b031633145b611b975760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b80611bda576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b611be382612b50565b611bec8261345a565b603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b505160408051638340f54960e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015611cc057600080fd5b505af1158015611cd4573d6000803e3d6000fd5b505050506000611ce6838360006115e9565b905080156113cc57603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3c57600080fd5b505afa158015611d50573d6000803e3d6000fd5b505050506040513d6020811015611d6657600080fd5b505160408051638280e5a960e01b81526001600160a01b0386811660048301526024820185905291519190921691638280e5a991604480830192600092919082900301818387803b1580156113b357600080fd5b6000610fdd60356000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1157600080fd5b505afa158015611e25573d6000803e3d6000fd5b505050506040513d6020811015611e3b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b50516001600160a01b0390811682526020828101939093526040918201600090812054918716815260349093529120549063ffffffff61396516565b600054610100900460ff1680611f065750611f066145f0565b80611f14575060005460ff16155b611f4f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806147ac602e913960400191505060405180910390fd5b600054610100900460ff16158015611f7a576000805460ff1961ff0019909116610100171660011790555b603b80546001600160a01b0319166001600160a01b0384161790558015611fa7576000805461ff00191690555b5050565b600080611fb783611019565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b031663b442a2066040518163ffffffff1660e01b815260040160206040518083038186803b15801561200957600080fd5b505afa15801561201d573d6000803e3d6000fd5b505050506040513d602081101561203357600080fd5b5051603b54604080516308fafb8d60e01b815290519293506000926120d5926001600160a01b0316916308fafb8d916004808301926020929190829003018186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516001600160a01b0387166000908152603a60205260409020600201549063ffffffff613a0516565b9050600061217e603b60009054906101000a90046001600160a01b03166001600160a01b03166313afb8ef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0388166000908152603a60205260409020600301549063ffffffff613a0516565b9050600061219a670de0b6b3a76400008663ffffffff6139c316565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121ec57600080fd5b505afa158015612200573d6000803e3d6000fd5b505050506040513d602081101561221657600080fd5b505160408051630e525ed960e21b81526001600160a01b038b81166004830152915191909216916339497b64916024808301926020929190829003018186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d602081101561228c57600080fd5b50519050801561231b5760006122ad600a610a7c878763ffffffff61396516565b90506000670d99a8cec7e200008811156122fa576122d962201480610a7c89603263ffffffff613a0516565b90506122eb828263ffffffff61396516565b98505050505050505050610a8e565b6122d962201480610a7c86818b670de0b6b3a764000063ffffffff613a0516565b670d99a8cec7e200008611156123505761234362201480610a7c87603263ffffffff613a0516565b9650505050505050610a8e565b61234362201480610a7c848189670de0b6b3a764000063ffffffff613a0516565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156123bf57600080fd5b505afa1580156123d3573d6000803e3d6000fd5b505050506040513d60208110156123e957600080fd5b50516001600160a01b03163314806124825750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561244a57600080fd5b505afa15801561245e573d6000803e3d6000fd5b505050506040513d602081101561247457600080fd5b50516001600160a01b031633145b6124bd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006124c76139bf565b6001600160a01b0383166000908152603f60205260408120549192509015612518576001600160a01b0383166000908152603f602052604090205461251390839063ffffffff6139c316565b61251b565b60005b6001600160a01b0384166000908152603360205260409020549091506126d6901561269c5761269760336000866001600160a01b03166001600160a01b0316815260200190815260200160002054610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ba57600080fd5b505afa1580156125ce573d6000803e3d6000fd5b505050506040513d60208110156125e457600080fd5b50516040805163d7fa113760e01b81526001600160a01b038a811660048301529151919092169163d7fa1137916024808301926020929190829003018186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b50516001600160a01b038816600090815260376020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61269f565b60005b6001600160a01b0385166000908152603d60209081526040808320603f83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603d60209081526040808320878452808352818420958655848452603f83528184208890559287905291815292548151908152905191927fabb9f52b6cb5c079bc60ea0d31e98448916c1b4fdbfea1dda8e2ef9802588bfd92918290030190a2505050565b6220148081565b670de0b6b3a764000081565b6001600160a01b0381166000908152603860205260408120548061278c5750670de0b6b3a76400009050610a8e565b6001600160a01b038316600090815260366020908152604080832084845290915281205490610a2685611748565b603b546040805163cc5738b560e01b815290516000926001600160a01b03169163cc5738b5916004808301926020929190829003018186803b1580156127ff57600080fd5b505afa158015612813573d6000803e3d6000fd5b505050506040513d602081101561282957600080fd5b50516001600160a01b03163314806128c25750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561288a57600080fd5b505afa15801561289e573d6000803e3d6000fd5b505050506040513d60208110156128b457600080fd5b50516001600160a01b031633145b6128fd5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b81612940576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b61294983612b50565b6129528361345a565b603b546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d60208110156129c157600080fd5b505160408051636ce5768960e11b81526001600160a01b0388811660048301528781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b505050506040513d6020811015612a4857600080fd5b505190506000612a5a858360016115e9565b90508015612b4757603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ab057600080fd5b505afa158015612ac4573d6000803e3d6000fd5b505050506040513d6020811015612ada57600080fd5b50516040805163526e93cb60e01b81526001600160a01b038881166004830152602482018590529151919092169163526e93cb91604480830192600092919082900301818387803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050505b50949350505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50516001600160a01b0316331480612c615750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2957600080fd5b505afa158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50516001600160a01b031633145b612c9c5760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b6000612ca66139bf565b6001600160a01b038316600090815260386020526040902054909150811415612ccf57506115e6565b603b5460408051639895880f60e01b81529051670de0b6b3a7640000926000926001600160a01b0390911691639895880f91600480820192602092909190829003018186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d6020811015612d4b57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03878116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015612d9757600080fd5b505afa158015612dab573d6000803e3d6000fd5b505050506040513d6020811015612dc157600080fd5b50516001600160a01b0385166000908152603860205260409020549091508061305c576001600160a01b038216612e4c576001600160a01b0385166000818152603a60209081526040808320805460ff191690556037825280832088845282528083208790558383526036825280832088845282528083208790559282526038905220849055613057565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b158015612eaa57600080fd5b505af1158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50519050612ee18661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4657600080fd5b505afa158015612f5a573d6000803e3d6000fd5b505050506040513d6020811015612f7057600080fd5b50516001600160a01b038088166000908152603a6020908152604091829020600301939093558051630ae9d70b60e41b815290519186169263ae9d70b092600480840193829003018186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d6020811015612ff257600080fd5b50516001600160a01b038088166000818152603a6020908152604080832060020195909555603781528482208a83528152848220899055828252603681528482208a835281528482208990559181526038825283812089905591861682526039905220555b61331f565b6001600160a01b0382166130f8576001600160a01b0385166000908152603a60205260409020805460ff19169055613093856109c9565b6001600160a01b03861660009081526037602090815260408083208884529091529020556130c08561275d565b6001600160a01b038616600081815260366020908152604080832089845282528083209490945591815260389091522084905561331f565b6001600160a01b038086166000908152603a60209081526040808320805460ff19166001179055805163bd6d894d60e01b81529051929386169263bd6d894d9260048084019391929182900301818787803b15801561315657600080fd5b505af115801561316a573d6000803e3d6000fd5b505050506040513d602081101561318057600080fd5b5051905061318d8661380b565b603a6000886001600160a01b03166001600160a01b0316815260200190815260200160002060010181905550826001600160a01b031663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b50516001600160a01b0387166000908152603a602090815260408083206003019390935560389052205461328c9061325b90879063ffffffff6139c316565b6001600160a01b038516600090815260396020526040902054610a7c908790610a4b9083878463ffffffff613a0516565b6001600160a01b0387166000908152603a60205260409020600201556132b1866109c9565b6001600160a01b03871660009081526037602090815260408083208984529091529020556132de8661275d565b6001600160a01b0380881660008181526036602090815260408083208b84528252808320959095559181526038825283812089905591861682526039905220555b6001600160a01b038516600090815260376020908152604080832087845290915290205483146133a8576001600160a01b03851660008181526037602090815260408083208584528252808320548884528184205494845260339092529091205461338e92610a7c9190613a05565b6001600160a01b0386166000908152603360205260409020555b6001600160a01b03851660008181526036602052604081207f1cc14bf94d8329e459fdcf4f38c293236b70411487793b5c07ac7448c788c252916133ea6139bf565b81526020019081526020016000205460376000896001600160a01b03166001600160a01b0316815260200190815260200160002060006134286139bf565b815260200190815260200160002054604051808381526020018281526020019250505060405180910390a25050505050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156134a857600080fd5b505afa1580156134bc573d6000803e3d6000fd5b505050506040513d60208110156134d257600080fd5b50516001600160a01b031633148061356b5750603b60009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b50516001600160a01b031633145b6135a65760405162461bcd60e51b81526004018080602001828103825260388152602001806147da6038913960400191505060405180910390fd5b60006135b06139bf565b6001600160a01b0383166000908152603e60205260408120549192509015613601576001600160a01b0383166000908152603e60205260409020546135fc90839063ffffffff6139c316565b613604565b60005b9050613785613612846118d1565b1561374b57613746613623856118d1565b603b5460408051639895880f60e01b81529051610a7c926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561366957600080fd5b505afa15801561367d573d6000803e3d6000fd5b505050506040513d602081101561369357600080fd5b505160408051637a78a94360e01b81526001600160a01b038a8116600483015291519190921691637a78a943916024808301926020929190829003018186803b1580156136df57600080fd5b505afa1580156136f3573d6000803e3d6000fd5b505050506040513d602081101561370957600080fd5b50516001600160a01b038816600090815260366020908152604080832060388352818420548452909152902054610a57908763ffffffff613a0516565b61374e565b60005b6001600160a01b0385166000908152603c60209081526040808320603e83528184205484529091529020549063ffffffff61396516565b6001600160a01b0384166000818152603c60209081526040808320878452808352818420958655848452603e83528184208890559287905291815292548151908152905191927f2aa34452d1f231efd3e8dc3eae64938dbfa82f1b40e2b994e1a395d7ed27ae5b92918290030190a2505050565b60396020526000908152604090205481565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b1580156138d257600080fd5b505afa1580156138e6573d6000803e3d6000fd5b505050506040513d60208110156138fc57600080fd5b50516001600160a01b038116600090815260356020526040902054909150613928576000915050610a8e565b61106d613934846118d1565b6001600160a01b038316600090815260356020526040902054610a7c90670de0b6b3a764000063ffffffff613a0516565b600082820183811015611a10576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b4390565b6000611a1083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506145f6565b600082613a1457506000610fdd565b82820282848281613a2157fe5b0414611a105760405162461bcd60e51b815260040180806020018281038252602181526020018061478b6021913960400191505060405180910390fd5b6000611a1083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061468d565b603b5460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b158015613ae557600080fd5b505afa158015613af9573d6000803e3d6000fd5b505050506040513d6020811015613b0f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613b5b57600080fd5b505afa158015613b6f573d6000803e3d6000fd5b505050506040513d6020811015613b8557600080fd5b505190506001600160a01b03811615611fa757806001600160a01b0316633af9e669603b60009054906101000a90046001600160a01b03166001600160a01b031663cc5738b56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bf557600080fd5b505afa158015613c09573d6000803e3d6000fd5b505050506040513d6020811015613c1f57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301525160248083019260209291908290030181600087803b158015613c6857600080fd5b505af1158015613c7c573d6000803e3d6000fd5b505050506040513d6020811015613c9257600080fd5b50516001600160a01b0382166000908152603560205260409020555050565b600080603b60009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d0257600080fd5b505afa158015613d16573d6000803e3d6000fd5b505050506040513d6020811015613d2c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03888116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015613d7857600080fd5b505afa158015613d8c573d6000803e3d6000fd5b505050506040513d6020811015613da257600080fd5b505190506000613db1866118d1565b90506000846004811115613dc157fe5b1480613dd857506003846004811115613dd657fe5b145b1561409a576000846004811115613deb57fe5b1415613e0857613e01818663ffffffff61396516565b9050613e4b565b6001600160a01b038616600090815260336020526040902054613e31908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b038616600090815260346020526040812054613e74908763ffffffff61396516565b90506001600160a01b03831615801590613f1b5750613f186064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663268c74e46040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b505afa158015613ef3573d6000803e3d6000fd5b505050506040513d6020811015613f0957600080fd5b5051859063ffffffff613a0516565b81115b15614051576000613fc1613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b158015613f7b57600080fd5b505afa158015613f8f573d6000803e3d6000fd5b505050506040513d6020811015613fa557600080fd5b5051879063ffffffff613a0516565b839063ffffffff6139c316565b6001600160a01b038516600090815260356020526040902054909550859150613ff0908263ffffffff61396516565b6001600160a01b03808616600090815260356020908152604080832094909455918b16815260349091522054614032908290610a4b908a63ffffffff61396516565b6001600160a01b03891660009081526034602052604090205550614094565b6001600160a01b03871660009081526034602052604090205461407a908763ffffffff61396516565b6001600160a01b0388166000908152603460205260409020555b506145e7565b60048460048111156140a857fe5b14156140f5576001600160a01b0386166000908152603360205260409020546140d7908663ffffffff6139c316565b6001600160a01b0387166000908152603360205260409020556145e7565b600184600481111561410357fe5b14156141ed576001600160a01b03861660009081526033602052604090205415614189578461413187611dba565b1015614184576040805162461bcd60e51b815260206004820181905260248201527f4c61636b206f66206c6971756964697479207768656e2077697468647261772e604482015290519081900360640190fd5b6141dd565b8461419387611dba565b10156141dd576001600160a01b0382166000908152603560205260409020546141c390869063ffffffff6139c316565b6001600160a01b0387166000908152603460205260409020555b6141e6866118d1565b905061424a565b846141f787611dba565b101561424a576040805162461bcd60e51b815260206004820152601e60248201527f4c61636b206f66206c6971756964697479207768656e20626f72726f772e0000604482015290519081900360640190fd5b600184600481111561425857fe5b14156142755761426e818663ffffffff6139c316565b90506142b8565b6001600160a01b03861660009081526033602052604090205461429e908663ffffffff61396516565b6001600160a01b0387166000908152603360205260409020555b6001600160a01b03861660009081526034602052604081205486106142de576000614307565b6001600160a01b038716600090815260346020526040902054614307908763ffffffff6139c316565b90506001600160a01b0383161580159061437d575081158061437d575061437a6064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b0316635a596d1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613edf57600080fd5b81105b156145a2576001600160a01b03808416600090815260356020908152604080832054938b168352603490915281205490916143c4918991610a4b919063ffffffff61396516565b90506144556064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b15801561441c57600080fd5b505afa158015614430573d6000803e3d6000fd5b505050506040513d602081101561444657600080fd5b5051869063ffffffff613a0516565b811015614494576001600160a01b038085166000908152603560209081526040808320805490849055938c16835260349091529020829055945061459c565b6000614528613fb46064610a7c603b60009054906101000a90046001600160a01b03166001600160a01b031663c36938966040518163ffffffff1660e01b815260040160206040518083038186803b1580156144ef57600080fd5b505afa158015614503573d6000803e3d6000fd5b505050506040513d602081101561451957600080fd5b5051889063ffffffff613a0516565b6001600160a01b038616600090815260356020526040902054909150614554908263ffffffff6139c316565b6001600160a01b03861660009081526035602052604090208290559550614581828263ffffffff6139c316565b6001600160a01b038a16600090815260346020526040902055505b506145e5565b6001600160a01b0387166000908152603460205260409020546145cb908763ffffffff6139c316565b6001600160a01b0388166000908152603460205260409020555b505b50509392505050565b303b1590565b600081848411156146855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561464a578181015183820152602001614632565b50505050905090810190601f1680156146775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836146dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561464a578181015183820152602001614632565b5060008385816146e857fe5b049594505050505056fe5f6465706f736974526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652e546f6b656e20426f72726f775072696e636970616c206d7573742062652067726561746572207468616e20302e20546f206465706f7369742062616c616e63652c20706c6561736520757365206465706f73697420627574746f6e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5f626f72726f77526174655265636f72645374617274206973206e6f74206120636865636b20706f696e74206f6e20696e6465782063757276652ea265627a7a72315820757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef84664736f6c634300050e0032
Deployed Bytecode Sourcemap
12871:27736:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12871:27736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14015:67;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14015:67:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35942:379;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35942:379:0;-1:-1:-1;;;;;35942:379:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35345:500;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35345:500:0;-1:-1:-1;;;;;35345:500:0;;:::i;38084:1023::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38084:1023:0;;;;;;;;;;;;;;;;;:::i;13250:66::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13250:66:0;;;;;;;;:::i;14156:59::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14156:59:0;-1:-1:-1;;;;;14156:59:0;;:::i;30160:366::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30160:366:0;;;;;;;;:::i;12953:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12953:45:0;-1:-1:-1;;;;;12953:45:0;;:::i;13127:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13127:48:0;-1:-1:-1;;;;;13127:48:0;;:::i;14089:60::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14089:60:0;-1:-1:-1;;;;;14089:60:0;;:::i;28343:317::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28343:317:0;-1:-1:-1;;;;;28343:317:0;;:::i;13036:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13036:47:0;-1:-1:-1;;;;;13036:47:0;;:::i;37343:733::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37343:733:0;;;;;;;;;;;;;;;;;:::i;:::-;;40514:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40514:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13940:68;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13940:68:0;;;;;;;;:::i;29463:377::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29463:377:0;;;;;;;;:::i;24427:146::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24427:146:0;-1:-1:-1;;;;;24427:146:0;;:::i;21583:307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21583:307:0;;-1:-1:-1;;;;;21583:307:0;;;;;;;;;;;;;:::i;27535:549::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27535:549:0;-1:-1:-1;;;;;27535:549:0;;:::i;15517:343::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15517:343:0;-1:-1:-1;;;;;15517:343:0;;:::i;13538:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13538:46:0;-1:-1:-1;;;;;13538:46:0;;:::i;10519:77::-;;;:::i;:::-;;;;-1:-1:-1;;;;;10519:77:0;;;;;;;;;;;;;;13393:64;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13393:64:0;;;;;;;;:::i;36519:816::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36519:816:0;;;;;;;;;;;;;;;;;:::i;36329:182::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36329:182:0;-1:-1:-1;;;;;36329:182:0;;:::i;15272:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15272:131:0;-1:-1:-1;;;;;15272:131:0;;:::i;24730:2480::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24730:2480:0;-1:-1:-1;;;;;24730:2480:0;;:::i;23340:1079::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23340:1079:0;-1:-1:-1;;;;;23340:1079:0;;:::i;10769:49::-;;;:::i;10603:52::-;;;:::i;34579:649::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34579:649:0;-1:-1:-1;;;;;34579:649:0;;:::i;39415:899::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39415:899:0;;;;;;;;;;;;;;;;;:::i;30729:3602::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30729:3602:0;-1:-1:-1;;;;;30729:3602:0;;:::i;22229:1103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22229:1103:0;-1:-1:-1;;;;;22229:1103:0;;:::i;13671:54::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13671:54:0;-1:-1:-1;;;;;13671:54:0;;:::i;28763:353::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28763:353:0;-1:-1:-1;;;;;28763:353:0;;:::i;14015:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;35942:379::-;36002:16;36020:13;36035:22;36059:23;36112:28;36133:6;36112:20;:28::i;:::-;-1:-1:-1;;;;;36151:18:0;;;;;;;:10;:18;;;;;;;;;36180:12;:20;;;;;;36250:12;;:32;;-1:-1:-1;;;36250:32:0;;;;36151:18;;36180:20;;36211:91;;36236:13;;36151:18;;36250:12;;;;;:30;;:32;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;36250:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36250:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36250:32:0;:50;;;-1:-1:-1;;;36250:50:0;;-1:-1:-1;;;;;36250:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;36250:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36250:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36250:50:0;-1:-1:-1;;;;;36236:65:0;;;;;36250:50;36236:65;;;;;;;;;;;-1:-1:-1;36236:65:0;;;;36211:20;;;;;:12;:20;;;;;;;:91;:24;:91;:::i;:::-;36094:219;;;;;;;;35942:379;;;;;:::o;35345:500::-;-1:-1:-1;;;;;35440:22:0;;35409:4;35440:22;;;:14;:22;;;;;;35541:8;35538:41;;-1:-1:-1;10638:17:0;;-1:-1:-1;35564:15:0;;35538:41;-1:-1:-1;;;;;35620:23:0;;35590:27;35620:23;;;:15;:23;;;;;;;;:28;;;;;;;;;;35688:29;35636:6;35688:21;:29::i;:::-;35659:58;-1:-1:-1;35735:102:0;10638:17;35735:88;35759:63;10638:17;35759:49;35659:58;35759:25;35780:3;35759:16;:14;:16::i;:::-;:20;:25;:20;:25;:::i;:::-;:29;:49;:29;:49;:::i;:::-;:53;:63;:53;:63;:::i;:::-;35735:19;;:88;:23;:88;:::i;:::-;:92;:102;:92;:102;:::i;:::-;35728:109;;;;;35345:500;;;;:::o;38084:1023::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;38177:4;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38249:30;38272:6;38249:22;:30::i;:::-;38290:28;38311:6;38290:20;:28::i;:::-;38364:12;;:23;;;-1:-1:-1;;;38364:23:0;;;;38422:1;;-1:-1:-1;;;;;38364:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38364:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38364:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38364:23:0;:55;;;-1:-1:-1;;;38364:55:0;;-1:-1:-1;;;;;38364:55:0;;;;;;;;;;;;;;;;:42;;;;;;;:55;;;;;:23;;:55;;;;;;;:42;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;38364:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38364:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38364:55:0;:59;38356:187;;;;-1:-1:-1;;;38356:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38602:12;;:23;;;-1:-1:-1;;;38602:23:0;;;;38585:14;;-1:-1:-1;;;;;38602:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38602:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38602:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38602:23:0;:51;;;-1:-1:-1;;;38602:51:0;;-1:-1:-1;;;;;38602:51:0;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;:51;;;;;:23;;:51;;;;;;;-1:-1:-1;38602:29:0;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;38602:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38602:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38602:51:0;;-1:-1:-1;38817:19:0;38839:59;38846:6;38854:19;:7;38602:51;38854:19;:11;:19;:::i;:::-;38875:22;38839:6;:59::i;:::-;38817:81;-1:-1:-1;38912:18:0;;38909:112;;38946:12;;;;;;;;;-1:-1:-1;;;;;38946:12:0;-1:-1:-1;;;;;38946:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38946:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38946:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38946:28:0;:63;;;-1:-1:-1;;;38946:63:0;;-1:-1:-1;;;;;38946:63:0;;;;;;;;;;;;;;;:39;;;;;;;:63;;;;;-1:-1:-1;;38946:63:0;;;;;;;-1:-1:-1;38946:39:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;38946:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38946:63:0;;;;38909:112;39080:19;:7;39092:6;39080:19;:11;:19;:::i;:::-;39073:26;38084:1023;-1:-1:-1;;;;;;38084:1023:0:o;13250:66::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14156:59::-;;;;;;;;;;;;;:::o;30160:366::-;-1:-1:-1;;;;;30299:23:0;;30258:7;30299:23;;;:15;:23;;;;;;;;:47;;;;;;;;;30365:15;30357:87;;;;-1:-1:-1;;;30357:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30462:56;30507:10;30462:40;10638:17;30462:26;30481:6;30462:18;:26::i;:56::-;30455:63;;;30160:366;;;;;:::o;12953:45::-;;;;;;;;;;;;;:::o;13127:48::-;;;;;;;;;;;;;:::o;14089:60::-;;;;;;;;;;;;;:::o;28343:317::-;28415:4;28432:24;28459:28;28480:6;28459:20;:28::i;:::-;28432:55;-1:-1:-1;28501:21:0;28498:155;;28546:1;28539:8;;;;;28498:155;-1:-1:-1;;;;;28587:18:0;;;;;;:10;:18;;;;;;:54;;28624:16;;28587:32;;10638:17;28587:32;:22;:32;:::i;:54::-;28580:61;;;;;13036:47;;;;;;;;;;;;;:::o;37343:733::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37497:30;37520:6;37497:22;:30::i;:::-;37538:28;37559:6;37538:20;:28::i;:::-;37621:12;;;;;;;;;-1:-1:-1;;;;;37621:12:0;-1:-1:-1;;;;;37621:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37621:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37621:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37621:23:0;:54;;;-1:-1:-1;;;37621:54:0;;-1:-1:-1;;;;;37621:54:0;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;:54;;;;;-1:-1:-1;;37621:54:0;;;;;;;-1:-1:-1;37621:30:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;37621:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37621:54:0;;;;37871:19;37893:48;37900:6;37908:7;37917:23;37893:6;:48::i;:::-;37871:70;-1:-1:-1;37957:18:0;;37954:115;;37992:12;;;;;;;;;-1:-1:-1;;;;;37992:12:0;-1:-1:-1;;;;;37992:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37992:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37992:28:0;:65;;;-1:-1:-1;;;37992:65:0;;-1:-1:-1;;;;;37992:65:0;;;;;;;;;;;;;;;:41;;;;;;;:65;;;;;-1:-1:-1;;37992:65:0;;;;;;;-1:-1:-1;37992:41:0;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;37992:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:65:0;;;;37954:115;14455:1;37343:733;;;:::o;40514:88::-;40579:15;;;;;;;;;;;;-1:-1:-1;;;40579:15:0;;;;40514:88;:::o;13940:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;29463:377::-;-1:-1:-1;;;;;29605:25:0;;29563:7;29605:25;;;:17;:25;;;;;;;;:50;;;;;;;;;29674:16;29666:89;;;;-1:-1:-1;;;29666:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29773:59;29820:11;29773:42;10638:17;29773:28;29794:6;29773:20;:28::i;24427:146::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24497:30;24520:6;24497:22;:30::i;:::-;24538:27;24558:6;24538:19;:27::i;:::-;24427:146;:::o;21583:307::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;21679:22;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21714:27;21734:6;21714:19;:27::i;:::-;21806:44;21825:6;21833:7;21842;21806:18;:44::i;:::-;21789:61;21583:307;-1:-1:-1;;;;21583:307:0:o;27535:549::-;27603:4;27620:26;27649:29;27671:6;27649:21;:29::i;:::-;27620:58;;27689:24;27716:34;27743:6;27716:26;:34::i;:::-;27689:61;;27765:12;;;;;;;;;-1:-1:-1;;;;;27765:12:0;-1:-1:-1;;;;;27765:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27765:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27765:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27765:32:0;:62;;;-1:-1:-1;;;27765:62:0;;-1:-1:-1;;;;;27765:62:0;;;;;;;;;:54;;;;;;;:62;;;;;:32;;:62;;;;;;;:54;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;27765:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27765:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27765:62:0;27761:142;;27849:54;10638:17;27849:40;:18;27872:16;27849:40;:22;:40;:::i;:54::-;27842:61;;;;;;27761:142;-1:-1:-1;;;;;28027:20:0;;;;;;:12;:20;;;;;:33;;;;27968:40;;;;;27923:153;;10638:17;;27923:139;;27968:93;;:40;:93;:58;:93;:::i;:::-;27923:40;:18;27946:16;27923:40;:22;:40;:::i;15517:343::-;15583:4;15600:14;15617:12;;;;;;;;;-1:-1:-1;;;;;15617:12:0;-1:-1:-1;;;;;15617:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15617:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15617:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15617:32:0;:50;;;-1:-1:-1;;;15617:50:0;;-1:-1:-1;;;;;15617:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;15617:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15617:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15617:50:0;-1:-1:-1;;;;;15797:20:0;;;;;;;:12;15617:50;15797:20;;;;;;;;15773:10;:18;;;;;;15747:21;;;;;:13;:21;;;;;;;15617:50;;-1:-1:-1;15747:71:0;;15797:20;;15747:45;;:21;:45;:25;:45;:::i;:71::-;15740:78;15517:343;-1:-1:-1;;;15517:343:0:o;13538:46::-;;;;;;;;;;;;;:::o;10519:77::-;10554:42;10519:77;:::o;13393:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;36519:816::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36627:12;36619:39;;;;;-1:-1:-1;;;36619:39:0;;;;;;;;;;;;-1:-1:-1;;;36619:39:0;;;;;;;;;;;;;;;36724:30;36747:6;36724:22;:30::i;:::-;36765:29;36787:6;36765:21;:29::i;:::-;36914:12;;;;;;;;;-1:-1:-1;;;;;36914:12:0;-1:-1:-1;;;;;36914:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36914:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36914:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36914:23:0;:53;;;-1:-1:-1;;;36914:53:0;;-1:-1:-1;;;;;36914:53:0;;;;;;;;;;;;;;;;;;;;;;:31;;;;;;;:53;;;;;-1:-1:-1;;36914:53:0;;;;;;;-1:-1:-1;36914:31:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;36914:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36914:53:0;;;;37131:19;37153:49;37160:6;37168:7;37177:24;37153:6;:49::i;:::-;37131:71;-1:-1:-1;37218:18:0;;37215:113;;37253:12;;;;;;;;;-1:-1:-1;;;;;37253:12:0;-1:-1:-1;;;;;37253:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37253:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37253:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37253:28:0;:63;;;-1:-1:-1;;;37253:63:0;;-1:-1:-1;;;;;37253:63:0;;;;;;;;;;;;;;;:39;;;;;;;:63;;;;;-1:-1:-1;;37253:63:0;;;;;;;-1:-1:-1;37253:39:0;:63;;;5:2:-1;;;;30:1;27;20:12;36329:182:0;36388:4;36412:91;36437:13;:65;36451:12;;;;;;;;;-1:-1:-1;;;;;36451:12:0;-1:-1:-1;;;;;36451:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36451:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36451:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36451:32:0;:50;;;-1:-1:-1;;;36451:50:0;;-1:-1:-1;;;;;36451:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;36451:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36451:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36451:50:0;-1:-1:-1;;;;;36437:65:0;;;;;36451:50;36437:65;;;;;;;;;;;-1:-1:-1;36437:65:0;;;;36412:20;;;;;:12;:20;;;;;;;:91;:24;:91;:::i;15272:131::-;11845:12;;;;;;;;:31;;;11861:15;:13;:15::i;:::-;11845:47;;;-1:-1:-1;11881:11:0;;;;11880:12;11845:47;11837:106;;;;-1:-1:-1;;;11837:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11952:19;11975:12;;;;;;11974:13;11994:83;;;;12023:12;:19;;-1:-1:-1;;;;12023:19:0;;;;;12051:18;12038:4;12051:18;;;11994:83;15367:12;:28;;-1:-1:-1;;;;;;15367:28:0;-1:-1:-1;;;;;15367:28:0;;;;;12095:57;;;;12139:5;12124:20;;-1:-1:-1;;12124:20:0;;;12095:57;15272:131;;:::o;24730:2480::-;24797:4;24814:31;24848:34;24875:6;24848:26;:34::i;:::-;24814:68;;24972:25;25000:12;;;;;;;;;-1:-1:-1;;;;;25000:12:0;-1:-1:-1;;;;;25000:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25000:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25000:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25000:32:0;25204:12;;:40;;;-1:-1:-1;;;25204:40:0;;;;25000:32;;-1:-1:-1;25134:22:0;;25159:86;;-1:-1:-1;;;;;25204:12:0;;:38;;:40;;;;;25000:32;;25204:40;;;;;;;:12;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;25204:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25204:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25204:40:0;-1:-1:-1;;;;;25159:20:0;;;;;;:12;25204:40;25159:20;;;;:40;;;;:86;:44;:86;:::i;:::-;25134:111;;25347:22;25372:85;25416:12;;;;;;;;;-1:-1:-1;;;;;25416:12:0;-1:-1:-1;;;;;25416:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25416:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25416:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25416:40:0;-1:-1:-1;;;;;25372:20:0;;;;;;:12;25416:40;25372:20;;;;:39;;;;:85;:43;:85;:::i;:::-;25347:110;-1:-1:-1;25540:27:0;25570:37;10638:17;25583:23;25570:37;:12;:37;:::i;:::-;25540:67;;25620:26;25649:12;;;;;;;;;-1:-1:-1;;;;;25649:12:0;-1:-1:-1;;;;;25649:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25649:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25649:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25649:32:0;:62;;;-1:-1:-1;;;25649:62:0;;-1:-1:-1;;;;;25649:62:0;;;;;;;;;:54;;;;;;;:62;;;;;:32;;:62;;;;;;;:54;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;25649:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25649:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25649:62:0;;-1:-1:-1;25722:1481:0;;;;25763:32;25798:42;25837:2;25798:34;:14;25817;25798:34;:18;:34;:::i;:42::-;25763:77;;25855:20;26009:23;25982;:51;25979:688;;;26206:46;10811:7;26206:25;:17;26228:2;26206:25;:21;:25;:::i;:46::-;26191:61;-1:-1:-1;26278:42:0;:24;26191:61;26278:42;:28;:42;:::i;:::-;26271:49;;;;;;;;;;;;25979:688;26508:75;10811:7;26508:54;26542:19;26508:54;:17;26530:6;26508:29;:21;:29;:::i;25722:1481::-;26810:23;26783;:51;26780:412;;;26943:46;10811:7;26943:25;:17;26965:2;26943:25;:21;:25;:::i;:46::-;26936:53;;;;;;;;;;26780:412;27101:75;10811:7;27101:54;27135:19;27101:54;:17;27123:6;27101:29;:21;:29;:::i;23340:1079::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23418:17;23438:16;:14;:16::i;:::-;-1:-1:-1;;;;;23660:35:0;;23465:15;23660:35;;;:27;:35;;;;;;23418:36;;-1:-1:-1;23465:15:0;23660:40;:100;;-1:-1:-1;;;;;23724:35:0;;;;;;:27;:35;;;;;;23707:53;;:12;;:53;:16;:53;:::i;:::-;23660:100;;;23703:1;23660:100;-1:-1:-1;;;;;24013:18:0;;;;;;:10;:18;;;;;;23647:113;;-1:-1:-1;23931:331:0;;24013:23;:248;;24043:218;24242:10;:18;24253:6;-1:-1:-1;;;;;24242:18:0;-1:-1:-1;;;;;24242:18:0;;;;;;;;;;;;;24043:172;24155:12;;;;;;;;;-1:-1:-1;;;;;24155:12:0;-1:-1:-1;;;;;24155:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24155:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24155:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24155:32:0;:59;;;-1:-1:-1;;;24155:59:0;;-1:-1:-1;;;;;24155:59:0;;;;;;;;;:51;;;;;;;:59;;;;;:32;;:59;;;;;;;:51;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;24155:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24155:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24155:59:0;-1:-1:-1;;;;;24043:23:0;;;;;;:15;24155:59;24043:23;;;;;;;24067:14;:22;;;;;;24043:47;;;;;;;;:85;;24117:10;24043:85;:73;:85;:::i;:218::-;24013:248;;;24039:1;24013:248;-1:-1:-1;;;;;23931:26:0;;;;;;:18;:26;;;;;;;;23958:27;:35;;;;;;23931:63;;;;;;;;;:331;:67;:331;:::i;:::-;-1:-1:-1;;;;;23888:26:0;;;;;;:18;:26;;;;;;;;:40;;;;;;;;;:374;;;24273:35;;;:27;:35;;;;;:50;;;24370:40;;;;;;;;;24341:70;;;;;;;23888:26;;24341:70;;;;;;;;;14455:1;;23340:1079;:::o;10769:49::-;10811:7;10769:49;:::o;10603:52::-;10638:17;10603:52;:::o;34579:649::-;-1:-1:-1;;;;;34676:22:0;;34645:4;34676:22;;;:14;:22;;;;;;34777:8;34774:41;;-1:-1:-1;10638:17:0;;-1:-1:-1;34800:15:0;;34774:41;-1:-1:-1;;;;;34860:25:0;;34828:29;34860:25;;;:17;:25;;;;;;;;:30;;;;;;;;;;34931;34878:6;34931:22;:30::i;39415:899::-;14291:12;;:28;;;-1:-1:-1;;;14291:28:0;;;;39513:4;;-1:-1:-1;;;;;14291:12:0;;:26;;:28;;;;;;;;;;;;;;:12;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39540:12;39532:39;;;;;-1:-1:-1;;;39532:39:0;;;;;;;;;;;;-1:-1:-1;;;39532:39:0;;;;;;;;;;;;;;;39637:30;39660:6;39637:22;:30::i;:::-;39678:29;39700:6;39678:21;:29::i;:::-;39772:12;;:23;;;-1:-1:-1;;;39772:23:0;;;;39758:11;;-1:-1:-1;;;;;39772:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39772:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39772:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39772:23:0;:56;;;-1:-1:-1;;;39772:56:0;;-1:-1:-1;;;;;39772:56:0;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;:56;;;;;:23;;:56;;;;;;;-1:-1:-1;39772:32:0;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;39772:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39772:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39772:56:0;;-1:-1:-1;40024:19:0;40046:49;40053:6;39772:56;40069:25;40046:6;:49::i;:::-;40024:71;-1:-1:-1;40169:18:0;;40166:115;;40204:12;;;;;;;;;-1:-1:-1;;;;;40204:12:0;-1:-1:-1;;;;;40204:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40204:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40204:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40204:28:0;:65;;;-1:-1:-1;;;40204:65:0;;-1:-1:-1;;;;;40204:65:0;;;;;;;;;;;;;;;:41;;;;;;;:65;;;;;-1:-1:-1;;40204:65:0;;;;;;;-1:-1:-1;40204:41:0;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;40204:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40204:65:0;;;;40166:115;-1:-1:-1;40300:6:0;39415:899;-1:-1:-1;;;;39415:899:0:o;30729:3602::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30870:16;30889;:14;:16::i;:::-;-1:-1:-1;;;;;30935:22:0;;;;;;:14;:22;;;;;;30870:35;;-1:-1:-1;30920:37:0;;30916:63;;;30972:7;;;30916:63;31042:12;;:32;;;-1:-1:-1;;;31042:32:0;;;;10638:17;;30991:12;;-1:-1:-1;;;;;31042:12:0;;;;:30;;:32;;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;31042:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31042:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31042:32:0;:50;;;-1:-1:-1;;;31042:50:0;;-1:-1:-1;;;;;31042:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;31042:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31042:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31042:50:0;-1:-1:-1;;;;;31204:22:0;;31175:26;31204:22;;;:14;31042:50;31204:22;;;;;31042:50;;-1:-1:-1;31241:27:0;31237:2692;;-1:-1:-1;;;;;31288:20:0;;31285:1225;;-1:-1:-1;;;;;31329:20:0;;31362:5;31329:20;;;:12;:20;;;;;;;;:38;;-1:-1:-1;;31329:38:0;;;31386:15;:23;;;;;:36;;;;;;;;:43;;;31448:25;;;:17;:25;;;;;:38;;;;;;;;:45;;;31559:22;;;:14;:22;;;:36;;;31285:1225;;;-1:-1:-1;;;;;31649:20:0;;;;;;;:12;:20;;;;;;;;:37;;-1:-1:-1;;31649:37:0;31682:4;31649:37;;;31731;;-1:-1:-1;;;31731:37:0;;;;31649:20;;31731:35;;;;;:37;;;;;31649:20;;31731:37;;;;;;31649:20;31731:35;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;31731:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31731:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31731:37:0;;-1:-1:-1;31935:31:0;31959:6;31935:23;:31::i;:::-;31899:12;:20;31912:6;-1:-1:-1;;;;;31899:20:0;-1:-1:-1;;;;;31899:20:0;;;;;;;;;;;;:33;;:67;;;;32035:6;-1:-1:-1;;;;;32027:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32027:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32027:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32027:36:0;-1:-1:-1;;;;;31985:20:0;;;;;;;:12;32027:36;31985:20;;;;;;;;:39;;:78;;;;32143:36;;-1:-1:-1;;;32143:36:0;;;;:34;;;;;;:36;;;;;;;;;;:34;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;32143:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32143:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32143:36:0;-1:-1:-1;;;;;32100:20:0;;;;;;;:12;32143:36;32100:20;;;;;;;:40;;:79;;;;32215:15;:23;;;;;:36;;;;;;;;:43;;;32277:25;;;:17;:25;;;;;:38;;;;;;;;:45;;;32388:22;;;:14;:22;;;;;:36;;;32443:30;;;;;:22;:30;;;:51;31285:1225;31237:2692;;;-1:-1:-1;;;;;32547:20:0;;32544:1374;;-1:-1:-1;;;;;32588:20:0;;32621:5;32588:20;;;:12;:20;;;;;:38;;-1:-1:-1;;32588:38:0;;;32684:26;32601:6;32684:18;:26::i;:::-;-1:-1:-1;;;;;32645:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;:65;32770:28;32661:6;32770:20;:28::i;:::-;-1:-1:-1;;;;;32729:25:0;;;;;;:17;:25;;;;;;;;:38;;;;;;;;:69;;;;32864:22;;;:14;:22;;;;:36;;;32544:1374;;;-1:-1:-1;;;;;32941:20:0;;;;;;;:12;:20;;;;;;;;:37;;-1:-1:-1;;32941:37:0;32974:4;32941:37;;;33023;;-1:-1:-1;;;33023:37:0;;;;32941:20;;33023:35;;;;;:37;;;;;32941:20;;33023:37;;;;;;32941:20;33023:35;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;33023:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33023:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33023:37:0;;-1:-1:-1;33227:31:0;33251:6;33227:23;:31::i;:::-;33191:12;:20;33204:6;-1:-1:-1;;;;;33191:20:0;-1:-1:-1;;;;;33191:20:0;;;;;;;;;;;;:33;;:67;;;;33327:6;-1:-1:-1;;;;;33319:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33319:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33319:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33319:36:0;-1:-1:-1;;;;;33277:20:0;;;;;;:12;33319:36;33277:20;;;;;;;:39;;:78;;;;33534:14;:22;;;;33417:141;;33518:39;;:11;;:39;:15;:39;:::i;:::-;-1:-1:-1;;;;;33450:30:0;;;;;;:22;:30;;;;;;33417:96;;33508:4;;33417:64;;:96;:18;33508:4;33417:28;:22;:28;:::i;:141::-;-1:-1:-1;;;;;33374:20:0;;;;;;:12;:20;;;;;:40;;:184;33616:26;33387:6;33616:18;:26::i;:::-;-1:-1:-1;;;;;33577:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;:65;33702:28;33593:6;33702:20;:28::i;:::-;-1:-1:-1;;;;;33661:25:0;;;;;;;:17;:25;;;;;;;;:38;;;;;;;;:69;;;;33796:22;;;:14;:22;;;;;:36;;;33851:30;;;;;:22;:30;;;:51;32544:1374;-1:-1:-1;;;;;33978:23:0;;;;;;:15;:23;;;;;;;;:36;;;;;;;;;:44;;33975:224;;-1:-1:-1;;;;;34143:23:0;;;;;;:15;:23;;;;;;;;:43;;;;;;;;;34083:36;;;;;;;34060:18;;;:10;:18;;;;;;;:127;;:60;;:18;:22;:60::i;:127::-;-1:-1:-1;;;;;34039:18:0;;;;;;:10;:18;;;;;:148;33975:224;-1:-1:-1;;;;;34216:107:0;;34236:25;;;;:17;:25;;;;;34216:107;;34262:16;:14;:16::i;:::-;34236:43;;;;;;;;;;;;34281:15;:23;34297:6;-1:-1:-1;;;;;34281:23:0;-1:-1:-1;;;;;34281:23:0;;;;;;;;;;;;:41;34305:16;:14;:16::i;:::-;34281:41;;;;;;;;;;;;34216:107;;;;;;;;;;;;;;;;;;;;;;;;14455:1;;;;30729:3602;:::o;22229:1103::-;14291:12;;;;;;;;;-1:-1:-1;;;;;14291:12:0;-1:-1:-1;;;;;14291:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14291:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14291:28:0;-1:-1:-1;;;;;14269:51:0;:10;:51;;:101;;;14346:12;;;;;;;;;-1:-1:-1;;;;;14346:12:0;-1:-1:-1;;;;;14346:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14346:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14346:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14346:23:0;-1:-1:-1;;;;;14324:46:0;:10;:46;14269:101;14261:183;;;;-1:-1:-1;;;14261:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22308:17;22328:16;:14;:16::i;:::-;-1:-1:-1;;;;;22552:36:0;;22355:15;22552:36;;;:28;:36;;;;;;22308;;-1:-1:-1;22355:15:0;22552:41;:102;;-1:-1:-1;;;;;22617:36:0;;;;;;:28;:36;;;;;;22600:54;;:12;;:54;:16;:54;:::i;:::-;22552:102;;;22596:1;22552:102;22539:115;;22827:345;22911:28;22932:6;22911:20;:28::i;:::-;:33;:260;;22951:220;23142:28;23163:6;23142:20;:28::i;:::-;23057:12;;:32;;;-1:-1:-1;;;23057:32:0;;;;22951:168;;-1:-1:-1;;;;;23057:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;23057:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23057:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23057:32:0;:61;;;-1:-1:-1;;;23057:61:0;;-1:-1:-1;;;;;23057:61:0;;;;;;;;;:53;;;;;;;:61;;;;;:32;;:61;;;;;;;:53;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;23057:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23057:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23057:61:0;-1:-1:-1;;;;;22951:25:0;;;;;;:17;23057:61;22951:25;;;;;;;22977:14;:22;;;;;;22951:49;;;;;;;;:83;;23023:10;22951:83;:71;:83;:::i;:220::-;22911:260;;;22947:1;22911:260;-1:-1:-1;;;;;22827:27:0;;;;;;:19;:27;;;;;;;;22855:28;:36;;;;;;22827:65;;;;;;;;;:345;:69;:345;:::i;:::-;-1:-1:-1;;;;;22783:27:0;;;;;;:19;:27;;;;;;;;:41;;;;;;;;;:389;;;23183:36;;;:28;:36;;;;;:51;;;23282:41;;;;;;;;;23252:72;;;;;;;22783:27;;23252:72;;;;;;;;;14455:1;;22229:1103;:::o;13671:54::-;;;;;;;;;;;;;:::o;28763:353::-;28832:4;28849:14;28866:12;;;;;;;;;-1:-1:-1;;;;;28866:12:0;-1:-1:-1;;;;;28866:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28866:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28866:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28866:32:0;:50;;;-1:-1:-1;;;28866:50:0;;-1:-1:-1;;;;;28866:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;28866:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28866:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28866:50:0;-1:-1:-1;;;;;28930:21:0;;;;;;:13;28866:50;28930:21;;;;;28866:50;;-1:-1:-1;28927:182:0;;28981:1;28974:8;;;;;28927:182;29027:69;29067:28;29088:6;29067:20;:28::i;:::-;-1:-1:-1;;;;;29027:21:0;;;;;;:13;:21;;;;;;:35;;10638:17;29027:35;:25;:35;:::i;5791:181::-;5849:7;5881:5;;;5905:6;;;;5897:46;;;;;-1:-1:-1;;;5897:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40414:92;40486:12;40414:92;:::o;6247:136::-;6305:7;6332:43;6336:1;6339;6332:43;;;;;;;;;;;;;;;;;:3;:43::i;7163:471::-;7221:7;7466:6;7462:47;;-1:-1:-1;7496:1:0;7489:8;;7462:47;7533:5;;;7537:1;7533;:5;:1;7557:5;;;;;:10;7549:56;;;;-1:-1:-1;;;7549:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8102:132;8160:7;8187:39;8191:1;8194;8187:39;;;;;;;;;;;;;;;;;:3;:39::i;15999:300::-;16081:12;;:32;;;-1:-1:-1;;;16081:32:0;;;;16064:14;;-1:-1:-1;;;;;16081:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;16081:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16081:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16081:32:0;:50;;;-1:-1:-1;;;16081:50:0;;-1:-1:-1;;;;;16081:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;16081:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16081:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16081:50:0;;-1:-1:-1;;;;;;16145:20:0;;;16142:150;;16214:6;-1:-1:-1;;;;;16206:35:0;;16250:12;;;;;;;;;-1:-1:-1;;;;;16250:12:0;-1:-1:-1;;;;;16250:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16250:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16250:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16250:28:0;16206:74;;;-1:-1:-1;;;;;;16206:74:0;;;;;;;-1:-1:-1;;;;;16206:74:0;;;;;;;;;;;;;16250:28;;16206:74;;;;;;;-1:-1:-1;16206:74:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;16206:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16206:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16206:74:0;-1:-1:-1;;;;;16182:21:0;;;;;;:13;16206:74;16182:21;;;;:98;15999:300;;:::o;16774:4800::-;16869:22;16903:14;16920:12;;;;;;;;;-1:-1:-1;;;;;16920:12:0;-1:-1:-1;;;;;16920:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16920:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16920:32:0;:50;;;-1:-1:-1;;;16920:50:0;;-1:-1:-1;;;;;16920:50:0;;;;;;;;;:42;;;;;;;:50;;;;;:32;;:50;;;;;;;:42;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;16920:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16920:50:0;;-1:-1:-1;16981:16:0;17000:28;17021:6;17000:20;:28::i;:::-;16981:47;-1:-1:-1;17054:24:0;17043:7;:35;;;;;;;;;:72;;;-1:-1:-1;17093:22:0;17082:7;:33;;;;;;;;;17043:72;17039:4496;;;17208:24;17197:7;:35;;;;;;;;;17193:185;;;17265:24;:11;17281:7;17265:24;:15;:24;:::i;:::-;17251:38;;17193:185;;;-1:-1:-1;;;;;17347:18:0;;;;;;:10;:18;;;;;;:31;;17370:7;17347:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;17326:18:0;;;;;;:10;:18;;;;;:52;17193:185;-1:-1:-1;;;;;17512:20:0;;17480:29;17512:20;;;:12;:20;;;;;;:33;;17537:7;17512:33;:24;:33;:::i;:::-;17480:65;-1:-1:-1;;;;;;17566:20:0;;;;;;:120;;;17630:56;17682:3;17630:47;17646:12;;;;;;;;;-1:-1:-1;;;;;17646:12:0;-1:-1:-1;;;;;17646:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17646:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17646:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17646:30:0;17630:11;;:47;:15;:47;:::i;:56::-;17603:24;:83;17566:120;17562:673;;;17707:21;17731:86;17760:56;17812:3;17760:47;17776:12;;;;;;;;;-1:-1:-1;;;;;17776:12:0;-1:-1:-1;;;;;17776:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17776:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17776:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17776:30:0;17760:11;;:47;:15;:47;:::i;:56::-;17731:24;;:86;:28;:86;:::i;:::-;-1:-1:-1;;;;;17969:21:0;;;;;;:13;:21;;;;;;17707:110;;-1:-1:-1;17707:110:0;;-1:-1:-1;17969:43:0;;17707:110;17969:43;:25;:43;:::i;:::-;-1:-1:-1;;;;;17945:21:0;;;;;;;:13;:21;;;;;;;;:67;;;;18054:20;;;;;:12;:20;;;;;:55;;18092:16;;18054:33;;18079:7;18054:33;:24;:33;:::i;:55::-;-1:-1:-1;;;;;18031:20:0;;;;;;:12;:20;;;;;:78;-1:-1:-1;17562:673:0;;;-1:-1:-1;;;;;18186:20:0;;;;;;:12;:20;;;;;;:33;;18211:7;18186:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;18163:20:0;;;;;;:12;:20;;;;;:56;17562:673;17039:4496;;;;18266:31;18255:7;:42;;;;;;;;;18252:3283;;;-1:-1:-1;;;;;18604:18:0;;;;;;:10;:18;;;;;;:31;;18627:7;18604:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;18583:18:0;;;;;;:10;:18;;;;;:52;18252:3283;;;19297:25;19286:7;:36;;;;;;;;;19283:513;;;-1:-1:-1;;;;;19346:18:0;;;;;;:10;:18;;;;;;:23;19343:265;;19425:7;19400:21;19414:6;19400:13;:21::i;:::-;:32;;19392:77;;;;;-1:-1:-1;;;19392:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19343:265;;;19521:7;19497:21;19511:6;19497:13;:21::i;:::-;:31;19493:115;;;-1:-1:-1;;;;;19586:21:0;;;;;;:13;:21;;;;;;19574:34;;:7;;:34;:11;:34;:::i;:::-;-1:-1:-1;;;;;19551:20:0;;;;;;:12;:20;;;;;:57;19493:115;19641:28;19662:6;19641:20;:28::i;:::-;19627:42;;19283:513;;;19754:7;19729:21;19743:6;19729:13;:21::i;:::-;:32;;19721:75;;;;;-1:-1:-1;;;19721:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19891:25;19880:7;:36;;;;;;;;;19876:186;;;19949:24;:11;19965:7;19949:24;:15;:24;:::i;:::-;19935:38;;19876:186;;;-1:-1:-1;;;;;20031:18:0;;;;;;:10;:18;;;;;;:31;;20054:7;20031:31;:22;:31;:::i;:::-;-1:-1:-1;;;;;20010:18:0;;;;;;:10;:18;;;;;:52;19876:186;-1:-1:-1;;;;;20196:20:0;;20164:29;20196:20;;;:12;:20;;;;;;:30;-1:-1:-1;20196:70:0;;20265:1;20196:70;;;-1:-1:-1;;;;;20229:20:0;;;;;;:12;:20;;;;;;:33;;20254:7;20229:33;:24;:33;:::i;:::-;20164:102;-1:-1:-1;;;;;;20369:20:0;;;;;;:142;;-1:-1:-1;20407:16:0;;;:103;;;20454:56;20506:3;20454:47;20470:12;;;;;;;;;-1:-1:-1;;;;;20470:12:0;-1:-1:-1;;;;;20470:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;20454:56:0;20427:24;:83;20407:103;20366:1158;;;-1:-1:-1;;;;;20581:21:0;;;20534:19;20581:21;;;:13;:21;;;;;;;;;20556:20;;;;;:12;:20;;;;;;20534:19;;20556:60;;20608:7;;20556:47;;:20;:47;:24;:47;:::i;:60::-;20534:82;;20656:56;20708:3;20656:47;20672:12;;;;;;;;;-1:-1:-1;;;;;20672:12:0;-1:-1:-1;;;;;20672:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20672:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20672:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20672:30:0;20656:11;;:47;:15;:47;:::i;:56::-;20639:14;:73;20635:764;;;-1:-1:-1;;;;;20815:21:0;;;;;;;:13;:21;;;;;;;;;;20859:25;;;;20907:20;;;;;:12;:20;;;;;:37;;;20815:21;-1:-1:-1;20635:764:0;;;21055:20;21078:76;21097:56;21149:3;21097:47;21113:12;;;;;;;;;-1:-1:-1;;;;;21113:12:0;-1:-1:-1;;;;;21113:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21113:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21113:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21113:30:0;21097:11;;:47;:15;:47;:::i;21078:76::-;-1:-1:-1;;;;;21194:21:0;;;;;;:13;:21;;;;;;21055:99;;-1:-1:-1;21194:42:0;;21055:99;21194:42;:25;:42;:::i;:::-;-1:-1:-1;;;;;21259:21:0;;;;;;:13;:21;;;;;:39;;;21177:59;-1:-1:-1;21344:35:0;:14;21283:15;21344:35;:18;:35;:::i;:::-;-1:-1:-1;;;;;21321:20:0;;;;;;:12;:20;;;;;:58;-1:-1:-1;20635:764:0;20366:1158;;;;-1:-1:-1;;;;;21475:20:0;;;;;;:12;:20;;;;;;:33;;21500:7;21475:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;21452:20:0;;;;;;:12;:20;;;;;:56;20366:1158;18252:3283;;-1:-1:-1;;16774:4800:0;;;;;:::o;12246:508::-;12663:4;12709:17;12741:7;12246:508;:::o;6720:192::-;6806:7;6842:12;6834:6;;;;6826:29;;;;-1:-1:-1;;;6826:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6826:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6878:5:0;;;6720:192::o;8764:345::-;8850:7;8952:12;8945:5;8937:28;;;;-1:-1:-1;;;8937:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8937:28:0;;8976:9;8992:1;8988;:5;;;;;;;8764:345;-1:-1:-1;;;;;8764:345:0:o
Swarm Source
bzzr://757185121399a527a64ac4f04319dcd8b650fb25ccba9f3ca4843c1dbe0ef846
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.