Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Timelock
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 8
- EVM Version
- default
- Verified at
- 2023-07-29T17:54:02.878166Z
Constructor Arguments
0x000000000000000000000000180f4bd2563b95564c0142e269e70c6a84a2ab000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea000000000000000000000000663ebe57dc7bfff136608a4a0a80ab6c107d5625000000000000000000000000c1007262d1cae7e641d51e46275fda5561235b6a0000000000000000000000000000000000000000000af5cbf0741b4c95400000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001f4
Arg [0] (address) : 0x180f4bd2563b95564c0142e269e70c6a84a2ab00
Arg [1] (uint256) : 1
Arg [2] (address) : 0xe3a4088781adc8f0b26bbbf42757d8238326dfea
Arg [3] (address) : 0xe3a4088781adc8f0b26bbbf42757d8238326dfea
Arg [4] (address) : 0x663ebe57dc7bfff136608a4a0a80ab6c107d5625
Arg [5] (address) : 0xc1007262d1cae7e641d51e46275fda5561235b6a
Arg [6] (uint256) : 13250000000000000000000000
Arg [7] (uint256) : 10
Arg [8] (uint256) : 500
contracts/peripherals/Timelock.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./interfaces/ITimelockTarget.sol";
import "./interfaces/ITimelock.sol";
import "./interfaces/IHandlerTarget.sol";
import "../access/interfaces/IAdmin.sol";
import "../core/interfaces/IVault.sol";
import "../core/interfaces/IVaultUtils.sol";
import "../core/interfaces/IAlpManager.sol";
import "../referrals/interfaces/IReferralStorage.sol";
import "../tokens/interfaces/IYieldToken.sol";
import "../tokens/interfaces/IBaseToken.sol";
import "../tokens/interfaces/IMintable.sol";
import "../tokens/interfaces/IUSDG.sol";
import "../staking/interfaces/IVester.sol";
import "../staking/interfaces/IRewardRouterV2.sol";
import "../libraries/math/SafeMath.sol";
import "../libraries/token/IERC20.sol";
contract Timelock is ITimelock {
using SafeMath for uint256;
uint256 public constant PRICE_PRECISION = 10 ** 30;
uint256 public constant MAX_BUFFER = 5 days;
uint256 public constant MAX_FUNDING_RATE_FACTOR = 200; // 0.02%
uint256 public constant MAX_LEVERAGE_VALIDATION = 500000; // 50x
uint256 public buffer;
address public admin;
address public tokenManager;
address public mintReceiver;
address public alpManager;
address public rewardRouter;
uint256 public maxTokenSupply;
uint256 public marginFeeBasisPoints;
uint256 public maxMarginFeeBasisPoints;
bool public shouldToggleIsLeverageEnabled;
mapping (bytes32 => uint256) public pendingActions;
mapping (address => bool) public isHandler;
mapping (address => bool) public isKeeper;
event SignalPendingAction(bytes32 action);
event SignalApprove(address token, address spender, uint256 amount, bytes32 action);
event SignalWithdrawToken(address target, address token, address receiver, uint256 amount, bytes32 action);
event SignalMint(address token, address receiver, uint256 amount, bytes32 action);
event SignalSetGov(address target, address gov, bytes32 action);
event SignalSetHandler(address target, address handler, bool isActive, bytes32 action);
event SignalSetPriceFeed(address vault, address priceFeed, bytes32 action);
event SignalRedeemUsdg(address vault, address token, uint256 amount);
event SignalVaultSetTokenConfig(
address vault,
address token,
uint256 tokenDecimals,
uint256 tokenWeight,
uint256 minProfitBps,
uint256 maxUsdgAmount,
bool isStable,
bool isShortable
);
event ClearAction(bytes32 action);
modifier onlyAdmin() {
require(msg.sender == admin, "Timelock: forbidden");
_;
}
modifier onlyHandlerAndAbove() {
require(msg.sender == admin || isHandler[msg.sender], "Timelock: forbidden");
_;
}
modifier onlyKeeperAndAbove() {
require(msg.sender == admin || isHandler[msg.sender] || isKeeper[msg.sender], "Timelock: forbidden");
_;
}
modifier onlyTokenManager() {
require(msg.sender == tokenManager, "Timelock: forbidden");
_;
}
constructor(
address _admin,
uint256 _buffer,
address _tokenManager,
address _mintReceiver,
address _alpManager,
address _rewardRouter,
uint256 _maxTokenSupply,
uint256 _marginFeeBasisPoints,
uint256 _maxMarginFeeBasisPoints
) public {
require(_buffer <= MAX_BUFFER, "Timelock: invalid _buffer");
admin = _admin;
buffer = _buffer;
tokenManager = _tokenManager;
mintReceiver = _mintReceiver;
alpManager = _alpManager;
rewardRouter = _rewardRouter;
maxTokenSupply = _maxTokenSupply;
marginFeeBasisPoints = _marginFeeBasisPoints;
maxMarginFeeBasisPoints = _maxMarginFeeBasisPoints;
}
function setAdmin(address _admin) external override onlyTokenManager {
admin = _admin;
}
function setExternalAdmin(address _target, address _admin) external onlyAdmin {
require(_target != address(this), "Timelock: invalid _target");
IAdmin(_target).setAdmin(_admin);
}
function setContractHandler(address _handler, bool _isActive) external onlyAdmin {
isHandler[_handler] = _isActive;
}
function initAlpManager() external onlyAdmin {
IAlpManager _alpManager = IAlpManager(alpManager);
IMintable alp = IMintable(_alpManager.alp());
alp.setMinter(alpManager, true);
IUSDG usdg = IUSDG(_alpManager.usdg());
usdg.addVault(alpManager);
IVault vault = _alpManager.vault();
vault.setManager(alpManager, true);
}
function initRewardRouter() external onlyAdmin {
IRewardRouterV2 _rewardRouter = IRewardRouterV2(rewardRouter);
IHandlerTarget(_rewardRouter.feeAlpTracker()).setHandler(rewardRouter, true);
IHandlerTarget(_rewardRouter.stakedAlpTracker()).setHandler(rewardRouter, true);
IHandlerTarget(alpManager).setHandler(rewardRouter, true);
}
function setKeeper(address _keeper, bool _isActive) external onlyAdmin {
isKeeper[_keeper] = _isActive;
}
function setBuffer(uint256 _buffer) external onlyAdmin {
require(_buffer <= MAX_BUFFER, "Timelock: invalid _buffer");
require(_buffer > buffer, "Timelock: buffer cannot be decreased");
buffer = _buffer;
}
function setMaxLeverage(address _vault, uint256 _maxLeverage) external onlyAdmin {
require(_maxLeverage > MAX_LEVERAGE_VALIDATION, "Timelock: invalid _maxLeverage");
IVault(_vault).setMaxLeverage(_maxLeverage);
}
function setFundingRate(address _vault, uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external onlyKeeperAndAbove {
require(_fundingRateFactor < MAX_FUNDING_RATE_FACTOR, "Timelock: invalid _fundingRateFactor");
require(_stableFundingRateFactor < MAX_FUNDING_RATE_FACTOR, "Timelock: invalid _stableFundingRateFactor");
IVault(_vault).setFundingRate(_fundingInterval, _fundingRateFactor, _stableFundingRateFactor);
}
function setShouldToggleIsLeverageEnabled(bool _shouldToggleIsLeverageEnabled) external onlyHandlerAndAbove {
shouldToggleIsLeverageEnabled = _shouldToggleIsLeverageEnabled;
}
function setMarginFeeBasisPoints(uint256 _marginFeeBasisPoints, uint256 _maxMarginFeeBasisPoints) external onlyHandlerAndAbove {
marginFeeBasisPoints = _marginFeeBasisPoints;
maxMarginFeeBasisPoints = _maxMarginFeeBasisPoints;
}
function setSwapFees(
address _vault,
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints
) external onlyKeeperAndAbove {
IVault vault = IVault(_vault);
vault.setFees(
_taxBasisPoints,
_stableTaxBasisPoints,
_mintBurnFeeBasisPoints,
_swapFeeBasisPoints,
_stableSwapFeeBasisPoints,
maxMarginFeeBasisPoints,
vault.liquidationFeeUsd(),
vault.minProfitTime(),
vault.hasDynamicFees()
);
}
// assign _marginFeeBasisPoints to this.marginFeeBasisPoints
// because enableLeverage would update Vault.marginFeeBasisPoints to this.marginFeeBasisPoints
// and disableLeverage would reset the Vault.marginFeeBasisPoints to this.maxMarginFeeBasisPoints
function setFees(
address _vault,
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 _minProfitTime,
bool _hasDynamicFees
) external onlyKeeperAndAbove {
marginFeeBasisPoints = _marginFeeBasisPoints;
IVault(_vault).setFees(
_taxBasisPoints,
_stableTaxBasisPoints,
_mintBurnFeeBasisPoints,
_swapFeeBasisPoints,
_stableSwapFeeBasisPoints,
maxMarginFeeBasisPoints,
_liquidationFeeUsd,
_minProfitTime,
_hasDynamicFees
);
}
function enableLeverage(address _vault) external override onlyHandlerAndAbove {
IVault vault = IVault(_vault);
if (shouldToggleIsLeverageEnabled) {
vault.setIsLeverageEnabled(true);
}
vault.setFees(
vault.taxBasisPoints(),
vault.stableTaxBasisPoints(),
vault.mintBurnFeeBasisPoints(),
vault.swapFeeBasisPoints(),
vault.stableSwapFeeBasisPoints(),
marginFeeBasisPoints,
vault.liquidationFeeUsd(),
vault.minProfitTime(),
vault.hasDynamicFees()
);
}
function disableLeverage(address _vault) external override onlyHandlerAndAbove {
IVault vault = IVault(_vault);
if (shouldToggleIsLeverageEnabled) {
vault.setIsLeverageEnabled(false);
}
vault.setFees(
vault.taxBasisPoints(),
vault.stableTaxBasisPoints(),
vault.mintBurnFeeBasisPoints(),
vault.swapFeeBasisPoints(),
vault.stableSwapFeeBasisPoints(),
maxMarginFeeBasisPoints, // marginFeeBasisPoints
vault.liquidationFeeUsd(),
vault.minProfitTime(),
vault.hasDynamicFees()
);
}
function setIsLeverageEnabled(address _vault, bool _isLeverageEnabled) external override onlyHandlerAndAbove {
IVault(_vault).setIsLeverageEnabled(_isLeverageEnabled);
}
function setTokenConfig(
address _vault,
address _token,
uint256 _tokenWeight,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
uint256 _bufferAmount,
uint256 _usdgAmount
) external onlyKeeperAndAbove {
require(_minProfitBps <= 500, "Timelock: invalid _minProfitBps");
IVault vault = IVault(_vault);
require(vault.whitelistedTokens(_token), "Timelock: token not yet whitelisted");
uint256 tokenDecimals = vault.tokenDecimals(_token);
bool isStable = vault.stableTokens(_token);
bool isShortable = vault.shortableTokens(_token);
IVault(_vault).setTokenConfig(
_token,
tokenDecimals,
_tokenWeight,
_minProfitBps,
_maxUsdgAmount,
isStable,
isShortable
);
IVault(_vault).setBufferAmount(_token, _bufferAmount);
IVault(_vault).setUsdgAmount(_token, _usdgAmount);
}
function setUsdgAmounts(address _vault, address[] memory _tokens, uint256[] memory _usdgAmounts) external onlyKeeperAndAbove {
for (uint256 i = 0; i < _tokens.length; i++) {
IVault(_vault).setUsdgAmount(_tokens[i], _usdgAmounts[i]);
}
}
function updateUsdgSupply(uint256 usdgAmount) external onlyKeeperAndAbove {
address usdg = IAlpManager(alpManager).usdg();
uint256 balance = IERC20(usdg).balanceOf(alpManager);
IUSDG(usdg).addVault(address(this));
if (usdgAmount > balance) {
uint256 mintAmount = usdgAmount.sub(balance);
IUSDG(usdg).mint(alpManager, mintAmount);
} else {
uint256 burnAmount = balance.sub(usdgAmount);
IUSDG(usdg).burn(alpManager, burnAmount);
}
IUSDG(usdg).removeVault(address(this));
}
function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external onlyAdmin {
IAlpManager(alpManager).setShortsTrackerAveragePriceWeight(_shortsTrackerAveragePriceWeight);
}
function setAlpCooldownDuration(uint256 _cooldownDuration) external onlyAdmin {
require(_cooldownDuration < 2 hours, "Timelock: invalid _cooldownDuration");
IAlpManager(alpManager).setCooldownDuration(_cooldownDuration);
}
function setMaxGlobalShortSize(address _vault, address _token, uint256 _amount) external onlyAdmin {
IVault(_vault).setMaxGlobalShortSize(_token, _amount);
}
function removeAdmin(address _token, address _account) external onlyAdmin {
IYieldToken(_token).removeAdmin(_account);
}
function setIsSwapEnabled(address _vault, bool _isSwapEnabled) external onlyKeeperAndAbove {
IVault(_vault).setIsSwapEnabled(_isSwapEnabled);
}
function setTier(address _referralStorage, uint256 _tierId, uint256 _totalRebate, uint256 _discountShare) external onlyKeeperAndAbove {
IReferralStorage(_referralStorage).setTier(_tierId, _totalRebate, _discountShare);
}
function setReferrerTier(address _referralStorage, address _referrer, uint256 _tierId) external onlyKeeperAndAbove {
IReferralStorage(_referralStorage).setReferrerTier(_referrer, _tierId);
}
function govSetCodeOwner(address _referralStorage, bytes32 _code, address _newAccount) external onlyKeeperAndAbove {
IReferralStorage(_referralStorage).govSetCodeOwner(_code, _newAccount);
}
function setVaultUtils(address _vault, IVaultUtils _vaultUtils) external onlyAdmin {
IVault(_vault).setVaultUtils(_vaultUtils);
}
function setMaxGasPrice(address _vault, uint256 _maxGasPrice) external onlyAdmin {
require(_maxGasPrice > 5000000000, "Invalid _maxGasPrice");
IVault(_vault).setMaxGasPrice(_maxGasPrice);
}
function withdrawFees(address _vault, address _token, address _receiver) external onlyAdmin {
IVault(_vault).withdrawFees(_token, _receiver);
}
function batchWithdrawFees(address _vault, address[] memory _tokens) external onlyKeeperAndAbove {
for (uint256 i = 0; i < _tokens.length; i++) {
IVault(_vault).withdrawFees(_tokens[i], admin);
}
}
function setInPrivateLiquidationMode(address _vault, bool _inPrivateLiquidationMode) external onlyAdmin {
IVault(_vault).setInPrivateLiquidationMode(_inPrivateLiquidationMode);
}
function setLiquidator(address _vault, address _liquidator, bool _isActive) external onlyAdmin {
IVault(_vault).setLiquidator(_liquidator, _isActive);
}
function setInPrivateTransferMode(address _token, bool _inPrivateTransferMode) external onlyAdmin {
IBaseToken(_token).setInPrivateTransferMode(_inPrivateTransferMode);
}
function batchSetBonusRewards(address _vester, address[] memory _accounts, uint256[] memory _amounts) external onlyKeeperAndAbove {
require(_accounts.length == _amounts.length, "Timelock: invalid lengths");
IHandlerTarget(_vester).setHandler(address(this), true);
for (uint256 i = 0; i < _accounts.length; i++) {
address account = _accounts[i];
uint256 amount = _amounts[i];
IVester(_vester).setBonusRewards(account, amount);
}
IHandlerTarget(_vester).setHandler(address(this), false);
}
function transferIn(address _sender, address _token, uint256 _amount) external onlyAdmin {
IERC20(_token).transferFrom(_sender, address(this), _amount);
}
function signalApprove(address _token, address _spender, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("approve", _token, _spender, _amount));
_setPendingAction(action);
emit SignalApprove(_token, _spender, _amount, action);
}
function approve(address _token, address _spender, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("approve", _token, _spender, _amount));
_validateAction(action);
_clearAction(action);
IERC20(_token).approve(_spender, _amount);
}
function signalWithdrawToken(address _target, address _token, address _receiver, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("withdrawToken", _target, _token, _receiver, _amount));
_setPendingAction(action);
emit SignalWithdrawToken(_target, _token, _receiver, _amount, action);
}
function withdrawToken(address _target, address _token, address _receiver, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("withdrawToken", _target, _token, _receiver, _amount));
_validateAction(action);
_clearAction(action);
IBaseToken(_target).withdrawToken(_token, _receiver, _amount);
}
function signalMint(address _token, address _receiver, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("mint", _token, _receiver, _amount));
_setPendingAction(action);
emit SignalMint(_token, _receiver, _amount, action);
}
function processMint(address _token, address _receiver, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("mint", _token, _receiver, _amount));
_validateAction(action);
_clearAction(action);
_mint(_token, _receiver, _amount);
}
function signalSetGov(address _target, address _gov) external override onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setGov", _target, _gov));
_setPendingAction(action);
emit SignalSetGov(_target, _gov, action);
}
function setGov(address _target, address _gov) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setGov", _target, _gov));
_validateAction(action);
_clearAction(action);
ITimelockTarget(_target).setGov(_gov);
}
function signalSetHandler(address _target, address _handler, bool _isActive) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setHandler", _target, _handler, _isActive));
_setPendingAction(action);
emit SignalSetHandler(_target, _handler, _isActive, action);
}
function setHandler(address _target, address _handler, bool _isActive) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setHandler", _target, _handler, _isActive));
_validateAction(action);
_clearAction(action);
IHandlerTarget(_target).setHandler(_handler, _isActive);
}
function signalSetPriceFeed(address _vault, address _priceFeed) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setPriceFeed", _vault, _priceFeed));
_setPendingAction(action);
emit SignalSetPriceFeed(_vault, _priceFeed, action);
}
function setPriceFeed(address _vault, address _priceFeed) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("setPriceFeed", _vault, _priceFeed));
_validateAction(action);
_clearAction(action);
IVault(_vault).setPriceFeed(_priceFeed);
}
function signalRedeemUsdg(address _vault, address _token, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("redeemUsdg", _vault, _token, _amount));
_setPendingAction(action);
emit SignalRedeemUsdg(_vault, _token, _amount);
}
function redeemUsdg(address _vault, address _token, uint256 _amount) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked("redeemUsdg", _vault, _token, _amount));
_validateAction(action);
_clearAction(action);
address usdg = IVault(_vault).usdg();
IVault(_vault).setManager(address(this), true);
IUSDG(usdg).addVault(address(this));
IUSDG(usdg).mint(address(this), _amount);
IERC20(usdg).transfer(address(_vault), _amount);
IVault(_vault).sellUSDG(_token, mintReceiver);
IVault(_vault).setManager(address(this), false);
IUSDG(usdg).removeVault(address(this));
}
function signalVaultSetTokenConfig(
address _vault,
address _token,
uint256 _tokenDecimals,
uint256 _tokenWeight,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
bool _isStable,
bool _isShortable
) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked(
"vaultSetTokenConfig",
_vault,
_token,
_tokenDecimals,
_tokenWeight,
_minProfitBps,
_maxUsdgAmount,
_isStable,
_isShortable
));
_setPendingAction(action);
emit SignalVaultSetTokenConfig(
_vault,
_token,
_tokenDecimals,
_tokenWeight,
_minProfitBps,
_maxUsdgAmount,
_isStable,
_isShortable
);
}
function vaultSetTokenConfig(
address _vault,
address _token,
uint256 _tokenDecimals,
uint256 _tokenWeight,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
bool _isStable,
bool _isShortable
) external onlyAdmin {
bytes32 action = keccak256(abi.encodePacked(
"vaultSetTokenConfig",
_vault,
_token,
_tokenDecimals,
_tokenWeight,
_minProfitBps,
_maxUsdgAmount,
_isStable,
_isShortable
));
_validateAction(action);
_clearAction(action);
IVault(_vault).setTokenConfig(
_token,
_tokenDecimals,
_tokenWeight,
_minProfitBps,
_maxUsdgAmount,
_isStable,
_isShortable
);
}
function cancelAction(bytes32 _action) external onlyAdmin {
_clearAction(_action);
}
function _mint(address _token, address _receiver, uint256 _amount) private {
IMintable mintable = IMintable(_token);
if (!mintable.isMinter(address(this))) {
mintable.setMinter(address(this), true);
}
mintable.mint(_receiver, _amount);
require(IERC20(_token).totalSupply() <= maxTokenSupply, "Timelock: maxTokenSupply exceeded");
}
function _setPendingAction(bytes32 _action) private {
require(pendingActions[_action] == 0, "Timelock: action already signalled");
pendingActions[_action] = block.timestamp.add(buffer);
emit SignalPendingAction(_action);
}
function _validateAction(bytes32 _action) private view {
require(pendingActions[_action] != 0, "Timelock: action not signalled");
require(pendingActions[_action] < block.timestamp, "Timelock: action time not yet passed");
}
function _clearAction(bytes32 _action) private {
require(pendingActions[_action] != 0, "Timelock: invalid _action");
delete pendingActions[_action];
emit ClearAction(_action);
}
}
contracts/access/interfaces/IAdmin.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IAdmin {
function setAdmin(address _admin) external;
}
contracts/peripherals/interfaces/IHandlerTarget.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IHandlerTarget {
function isHandler(address _account) external returns (bool);
function setHandler(address _handler, bool _isActive) external;
}
contracts/peripherals/interfaces/ITimelock.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface ITimelock {
function setAdmin(address _admin) external;
function enableLeverage(address _vault) external;
function disableLeverage(address _vault) external;
function setIsLeverageEnabled(address _vault, bool _isLeverageEnabled) external;
function signalSetGov(address _target, address _gov) external;
}
contracts/peripherals/interfaces/ITimelockTarget.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface ITimelockTarget {
function setGov(address _gov) external;
function withdrawToken(address _token, address _account, uint256 _amount) external;
}
contracts/referrals/interfaces/IReferralStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IReferralStorage {
function codeOwners(bytes32 _code) external view returns (address);
function traderReferralCodes(address _account) external view returns (bytes32);
function referrerDiscountShares(address _account) external view returns (uint256);
function referrerTiers(address _account) external view returns (uint256);
function getTraderReferralInfo(address _account) external view returns (bytes32, address);
function setTraderReferralCode(address _account, bytes32 _code) external;
function setTier(uint256 _tierId, uint256 _totalRebate, uint256 _discountShare) external;
function setReferrerTier(address _referrer, uint256 _tierId) external;
function govSetCodeOwner(bytes32 _code, address _newAccount) external;
}
contracts/staking/interfaces/IRewardRouterV2.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IRewardRouterV2 {
function feeAlpTracker() external view returns (address);
function stakedAlpTracker() external view returns (address);
}
contracts/core/interfaces/IAlpManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IVault.sol";
interface IAlpManager {
function alp() external view returns (address);
function usdg() external view returns (address);
function vault() external view returns (IVault);
function cooldownDuration() external returns (uint256);
function getAumInUsdg(bool maximise) external view returns (uint256);
function lastAddedAt(address _account) external returns (uint256);
function addLiquidity(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minAlp) external returns (uint256);
function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minAlp) external returns (uint256);
function removeLiquidity(address _tokenOut, uint256 _alpAmount, uint256 _minOut, address _receiver) external returns (uint256);
function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _alpAmount, uint256 _minOut, address _receiver) external returns (uint256);
function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external;
function setCooldownDuration(uint256 _cooldownDuration) external;
}
contracts/core/interfaces/IVault.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IVaultUtils.sol";
interface IVault {
function isInitialized() external view returns (bool);
function isSwapEnabled() external view returns (bool);
function isLeverageEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function router() external view returns (address);
function usdg() external view returns (address);
function gov() external view returns (address);
function whitelistedTokenCount() external view returns (uint256);
function maxLeverage() external view returns (uint256);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function fundingInterval() external view returns (uint256);
function totalTokenWeights() external view returns (uint256);
function getTargetUsdgAmount(address _token) external view returns (uint256);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
function approvedRouters(address _account, address _router) external view returns (bool);
function isLiquidator(address _account) external view returns (bool);
function isManager(address _account) external view returns (bool);
function minProfitBasisPoints(address _token) external view returns (uint256);
function tokenBalances(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setIsLeverageEnabled(bool _isLeverageEnabled) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setUsdgAmount(address _token, uint256 _amount) external;
function setBufferAmount(address _token, uint256 _amount) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external;
function setFees(
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _redemptionBps,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
bool _isStable,
bool _isShortable
) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(address _token, address _receiver) external returns (uint256);
function directPoolDeposit(address _token) external;
function buyUSDG(address _token, address _receiver) external returns (uint256);
function sellUSDG(address _token, address _receiver) external returns (uint256);
function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function priceFeed() external view returns (address);
function fundingRateFactor() external view returns (uint256);
function stableFundingRateFactor() external view returns (uint256);
function cumulativeFundingRates(address _token) external view returns (uint256);
function getNextFundingRate(address _token) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
function liquidationFeeUsd() external view returns (uint256);
function taxBasisPoints() external view returns (uint256);
function stableTaxBasisPoints() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function swapFeeBasisPoints() external view returns (uint256);
function stableSwapFeeBasisPoints() external view returns (uint256);
function marginFeeBasisPoints() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function whitelistedTokens(address _token) external view returns (bool);
function stableTokens(address _token) external view returns (bool);
function shortableTokens(address _token) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(address _token) external view returns (uint256);
function maxGlobalShortSizes(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function tokenWeights(address _token) external view returns (uint256);
function guaranteedUsd(address _token) external view returns (uint256);
function poolAmounts(address _token) external view returns (uint256);
function bufferAmounts(address _token) external view returns (uint256);
function reservedAmounts(address _token) external view returns (uint256);
function usdgAmounts(address _token) external view returns (uint256);
function maxUsdgAmounts(address _token) external view returns (uint256);
function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256);
function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256);
}
contracts/core/interfaces/IVaultUtils.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IVaultUtils {
function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}
contracts/libraries/math/SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @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.
*/
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.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
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.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contracts/libraries/token/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contracts/staking/interfaces/IVester.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IVester {
function rewardTracker() external view returns (address);
function claimForAccount(address _account, address _receiver) external returns (uint256);
function claimable(address _account) external view returns (uint256);
function cumulativeClaimAmounts(address _account) external view returns (uint256);
function claimedAmounts(address _account) external view returns (uint256);
function pairAmounts(address _account) external view returns (uint256);
function getVestedAmount(address _account) external view returns (uint256);
function transferredAverageStakedAmounts(address _account) external view returns (uint256);
function transferredCumulativeRewards(address _account) external view returns (uint256);
function cumulativeRewardDeductions(address _account) external view returns (uint256);
function bonusRewards(address _account) external view returns (uint256);
function transferStakeValues(address _sender, address _receiver) external;
function setTransferredAverageStakedAmounts(address _account, uint256 _amount) external;
function setTransferredCumulativeRewards(address _account, uint256 _amount) external;
function setCumulativeRewardDeductions(address _account, uint256 _amount) external;
function setBonusRewards(address _account, uint256 _amount) external;
function getMaxVestableAmount(address _account) external view returns (uint256);
function getCombinedAverageStakedAmount(address _account) external view returns (uint256);
}
contracts/tokens/interfaces/IBaseToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IBaseToken {
function totalStaked() external view returns (uint256);
function stakedBalance(address _account) external view returns (uint256);
function removeAdmin(address _account) external;
function setInPrivateTransferMode(bool _inPrivateTransferMode) external;
function withdrawToken(address _token, address _account, uint256 _amount) external;
}
contracts/tokens/interfaces/IMintable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IMintable {
function isMinter(address _account) external returns (bool);
function setMinter(address _minter, bool _isActive) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}
contracts/tokens/interfaces/IUSDG.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IUSDG {
function addVault(address _vault) external;
function removeVault(address _vault) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}
contracts/tokens/interfaces/IYieldToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IYieldToken {
function totalStaked() external view returns (uint256);
function stakedBalance(address _account) external view returns (uint256);
function removeAdmin(address _account) external;
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":8,"enabled":true},"libraries":{}}
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"uint256","name":"_buffer","internalType":"uint256"},{"type":"address","name":"_tokenManager","internalType":"address"},{"type":"address","name":"_mintReceiver","internalType":"address"},{"type":"address","name":"_alpManager","internalType":"address"},{"type":"address","name":"_rewardRouter","internalType":"address"},{"type":"uint256","name":"_maxTokenSupply","internalType":"uint256"},{"type":"uint256","name":"_marginFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_maxMarginFeeBasisPoints","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BUFFER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_FUNDING_RATE_FACTOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_LEVERAGE_VALIDATION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PRICE_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"alpManager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"batchSetBonusRewards","inputs":[{"type":"address","name":"_vester","internalType":"address"},{"type":"address[]","name":"_accounts","internalType":"address[]"},{"type":"uint256[]","name":"_amounts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"batchWithdrawFees","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address[]","name":"_tokens","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buffer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelAction","inputs":[{"type":"bytes32","name":"_action","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableLeverage","inputs":[{"type":"address","name":"_vault","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableLeverage","inputs":[{"type":"address","name":"_vault","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"govSetCodeOwner","inputs":[{"type":"address","name":"_referralStorage","internalType":"address"},{"type":"bytes32","name":"_code","internalType":"bytes32"},{"type":"address","name":"_newAccount","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initAlpManager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initRewardRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHandler","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isKeeper","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marginFeeBasisPoints","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxMarginFeeBasisPoints","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTokenSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"mintReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingActions","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processMint","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"redeemUsdg","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAdmin","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"rewardRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAlpCooldownDuration","inputs":[{"type":"uint256","name":"_cooldownDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuffer","inputs":[{"type":"uint256","name":"_buffer","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setContractHandler","inputs":[{"type":"address","name":"_handler","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExternalAdmin","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"uint256","name":"_taxBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_stableTaxBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_mintBurnFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_swapFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_stableSwapFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_marginFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_liquidationFeeUsd","internalType":"uint256"},{"type":"uint256","name":"_minProfitTime","internalType":"uint256"},{"type":"bool","name":"_hasDynamicFees","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFundingRate","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"uint256","name":"_fundingInterval","internalType":"uint256"},{"type":"uint256","name":"_fundingRateFactor","internalType":"uint256"},{"type":"uint256","name":"_stableFundingRateFactor","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGov","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHandler","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_handler","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInPrivateLiquidationMode","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"bool","name":"_inPrivateLiquidationMode","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInPrivateTransferMode","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_inPrivateTransferMode","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsLeverageEnabled","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"bool","name":"_isLeverageEnabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsSwapEnabled","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"bool","name":"_isSwapEnabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setKeeper","inputs":[{"type":"address","name":"_keeper","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidator","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_liquidator","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarginFeeBasisPoints","inputs":[{"type":"uint256","name":"_marginFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_maxMarginFeeBasisPoints","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxGasPrice","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"uint256","name":"_maxGasPrice","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxGlobalShortSize","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxLeverage","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"uint256","name":"_maxLeverage","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPriceFeed","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_priceFeed","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReferrerTier","inputs":[{"type":"address","name":"_referralStorage","internalType":"address"},{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_tierId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShortsTrackerAveragePriceWeight","inputs":[{"type":"uint256","name":"_shortsTrackerAveragePriceWeight","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShouldToggleIsLeverageEnabled","inputs":[{"type":"bool","name":"_shouldToggleIsLeverageEnabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapFees","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"uint256","name":"_taxBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_stableTaxBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_mintBurnFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_swapFeeBasisPoints","internalType":"uint256"},{"type":"uint256","name":"_stableSwapFeeBasisPoints","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTier","inputs":[{"type":"address","name":"_referralStorage","internalType":"address"},{"type":"uint256","name":"_tierId","internalType":"uint256"},{"type":"uint256","name":"_totalRebate","internalType":"uint256"},{"type":"uint256","name":"_discountShare","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTokenConfig","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_tokenWeight","internalType":"uint256"},{"type":"uint256","name":"_minProfitBps","internalType":"uint256"},{"type":"uint256","name":"_maxUsdgAmount","internalType":"uint256"},{"type":"uint256","name":"_bufferAmount","internalType":"uint256"},{"type":"uint256","name":"_usdgAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setUsdgAmounts","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address[]","name":"_tokens","internalType":"address[]"},{"type":"uint256[]","name":"_usdgAmounts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setVaultUtils","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_vaultUtils","internalType":"contract IVaultUtils"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"shouldToggleIsLeverageEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalApprove","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalMint","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalRedeemUsdg","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetGov","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetHandler","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_handler","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalSetPriceFeed","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_priceFeed","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalVaultSetTokenConfig","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_tokenDecimals","internalType":"uint256"},{"type":"uint256","name":"_tokenWeight","internalType":"uint256"},{"type":"uint256","name":"_minProfitBps","internalType":"uint256"},{"type":"uint256","name":"_maxUsdgAmount","internalType":"uint256"},{"type":"bool","name":"_isStable","internalType":"bool"},{"type":"bool","name":"_isShortable","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"signalWithdrawToken","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenManager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferIn","inputs":[{"type":"address","name":"_sender","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateUsdgSupply","inputs":[{"type":"uint256","name":"usdgAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vaultSetTokenConfig","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_tokenDecimals","internalType":"uint256"},{"type":"uint256","name":"_tokenWeight","internalType":"uint256"},{"type":"uint256","name":"_minProfitBps","internalType":"uint256"},{"type":"uint256","name":"_maxUsdgAmount","internalType":"uint256"},{"type":"bool","name":"_isStable","internalType":"bool"},{"type":"bool","name":"_isShortable","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFees","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"_target","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"event","name":"ClearAction","inputs":[{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalApprove","inputs":[{"type":"address","name":"token","indexed":false},{"type":"address","name":"spender","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalMint","inputs":[{"type":"address","name":"token","indexed":false},{"type":"address","name":"receiver","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalPendingAction","inputs":[{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalRedeemUsdg","inputs":[{"type":"address","name":"vault","indexed":false},{"type":"address","name":"token","indexed":false},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetGov","inputs":[{"type":"address","name":"target","indexed":false},{"type":"address","name":"gov","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetHandler","inputs":[{"type":"address","name":"target","indexed":false},{"type":"address","name":"handler","indexed":false},{"type":"bool","name":"isActive","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalSetPriceFeed","inputs":[{"type":"address","name":"vault","indexed":false},{"type":"address","name":"priceFeed","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false},{"type":"event","name":"SignalVaultSetTokenConfig","inputs":[{"type":"address","name":"vault","indexed":false},{"type":"address","name":"token","indexed":false},{"type":"uint256","name":"tokenDecimals","indexed":false},{"type":"uint256","name":"tokenWeight","indexed":false},{"type":"uint256","name":"minProfitBps","indexed":false},{"type":"uint256","name":"maxUsdgAmount","indexed":false},{"type":"bool","name":"isStable","indexed":false},{"type":"bool","name":"isShortable","indexed":false}],"anonymous":false},{"type":"event","name":"SignalWithdrawToken","inputs":[{"type":"address","name":"target","indexed":false},{"type":"address","name":"token","indexed":false},{"type":"address","name":"receiver","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"bytes32","name":"action","indexed":false}],"anonymous":false}]
Contract Creation Code
0x60806040523480156200001157600080fd5b5060405162005d7b38038062005d7b83398181016040526101208110156200003857600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101009098015196979596949593949293919290919062069780881115620000cd576040805162461bcd60e51b815260206004820152601960248201527f54696d656c6f636b3a20696e76616c6964205f62756666657200000000000000604482015290519081900360640190fd5b600180546001600160a01b03199081166001600160a01b039b8c16179091556000988955600280548216988b1698909817909755600380548816968a169690961790955560048054871694891694909417909355600580549095169190961617909255600693909355600755600891909155615c2b9081906200015090396000f3fe608060405234801561001057600080fd5b50600436106103215760003560e01c80629a698e146103265780630191c2371461045b57806309cc9a08146104915780630e0dc426146104c75780630e9587f3146105155780631154e8081461054d578063117cf20414610585578063185051c1146105b3578063204bbc54146105e157806321754d9e1461061757806321bd059214610653578063227f03eb1461068157806323aaad12146106b957806324ccbe30146106d5578063268959e51461070d5780632a709b141461073b5780632ba3725a1461075f578063318bc6891461077957806346ea87af1461078157806347de43e2146107a75780634cd23f3b146107df5780634f5f6b5e1461081b57806350f7c2041461083857806351a6de0d14610840578063558182941461086e57806355ef1395146108a65780635a3bb989146108d457806361d07569146108dc57806363960074146108e45780636ba42aaa146108ec5780636d63c1d0146109125780636e5227d414610938578063704b6c021461099957806370ac0a93146109bf57806376e11286146109f5578063781cc3d314610a235780637b6f775a14610a4057806380894d6214610a6c57806381774b3d14610a9a57806386803c7214610ab75780638a39735a14610ae55780638bf22c4614610aed5780638e34c98f14610b1957806395082d2514610b38578063996a7a1e14610b40578063996e2bc914610b6e5780639b53ad2214610b76578063adc7ea3714610ca9578063afd14deb14610cc6578063bc476dfd14610cce578063bc8a8ab914610cfc578063c142940a14610d32578063c57399e114610d68578063c7bb26a014610d85578063cd2b123014610d8d578063d1b9e85314610dbb578063d3c87bbb14610de9578063da76231614610e0f578063db1c844114610e53578063dce6e18d14610eac578063df3a66d914610ee2578063e1f21c6714610f18578063e21b459114610f4e578063e30569e514610f71578063e3cbeb0f14610f8e578063e4652f4914610fe7578063e8ae22711461101d578063ea5ded9a146110ce578063edaafe20146110d6578063f851a440146110de575b600080fd5b6104596004803603606081101561033c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561036657600080fd5b82018360208201111561037857600080fd5b803590602001918460208302840111600160201b8311171561039957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103e857600080fd5b8201836020820111156103fa57600080fd5b803590602001918460208302840111600160201b8311171561041b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110e6945050505050565b005b6104596004803603606081101561047157600080fd5b506001600160a01b03813581169160208101359091169060400135611342565b610459600480360360608110156104a757600080fd5b506001600160a01b03813581169160208101359091169060400135611440565b610459600480360360e08110156104dd57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c0013561153f565b6104596004803603606081101561052b57600080fd5b506001600160a01b0381358116916020810135821691604090910135166119b8565b6104596004803603606081101561056357600080fd5b506001600160a01b038135811691602081013590911690604001351515611a96565b6104596004803603604081101561059b57600080fd5b506001600160a01b0381351690602001351515611bc7565b610459600480360360408110156105c957600080fd5b506001600160a01b0381351690602001351515611cac565b610459600480360360608110156105f757600080fd5b506001600160a01b03813581169160208101359160409091013516611d24565b6104596004803603608081101561062d57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611dfc565b6104596004803603604081101561066957600080fd5b506001600160a01b0381351690602001351515611f47565b6104596004803603608081101561069757600080fd5b506001600160a01b038135169060208101359060408101359060600135611fdc565b6106c1612131565b604080519115158252519081900360200190f35b610459600480360360608110156106eb57600080fd5b506001600160a01b03813581169160208101359091169060400135151561213a565b6104596004803603604081101561072357600080fd5b506001600160a01b0381358116916020013516612243565b6107436122df565b604080516001600160a01b039092168252519081900360200190f35b6107676122ee565b60408051918252519081900360200190f35b6107676122f5565b6106c16004803603602081101561079757600080fd5b50356001600160a01b03166122fb565b610459600480360360608110156107bd57600080fd5b506001600160a01b038135811691602081013590911690604001351515612310565b610459600480360360808110156107f557600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356123b6565b6104596004803603602081101561083157600080fd5b50356124d1565b61076761257d565b6104596004803603604081101561085657600080fd5b506001600160a01b0381358116916020013516612583565b6104596004803603608081101561088457600080fd5b506001600160a01b03813516906020810135906040810135906060013561267d565b610459600480360360408110156108bc57600080fd5b506001600160a01b0381358116916020013516612754565b61074361284a565b610767612859565b610743612860565b6106c16004803603602081101561090257600080fd5b50356001600160a01b031661286f565b6104596004803603602081101561092857600080fd5b50356001600160a01b0316612884565b610459600480360361014081101561094f57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001351515612d3a565b610459600480360360208110156109af57600080fd5b50356001600160a01b0316612e6a565b610459600480360360608110156109d557600080fd5b506001600160a01b03813581169160208101359091169060400135612ed9565b61045960048036036040811015610a0b57600080fd5b506001600160a01b03813581169160200135166132d7565b61045960048036036020811015610a3957600080fd5b50356133d6565b61045960048036036040811015610a5657600080fd5b506001600160a01b03813516906020013561342f565b61045960048036036040811015610a8257600080fd5b506001600160a01b0381358116916020013516613519565b61045960048036036020811015610ab057600080fd5b503561360f565b61045960048036036040811015610acd57600080fd5b506001600160a01b0381351690602001351515613940565b6107676139d5565b61045960048036036040811015610b0357600080fd5b506001600160a01b0381351690602001356139da565b61045960048036036020811015610b2f57600080fd5b50351515613abd565b610767613b37565b61045960048036036040811015610b5657600080fd5b506001600160a01b0381358116916020013516613b47565b610767613c38565b61045960048036036060811015610b8c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610bb657600080fd5b820183602082011115610bc857600080fd5b803590602001918460208302840111600160201b83111715610be957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c3857600080fd5b820183602082011115610c4a57600080fd5b803590602001918460208302840111600160201b83111715610c6b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c3e945050505050565b61045960048036036020811015610cbf57600080fd5b5035613d72565b610459613e58565b61045960048036036040811015610ce457600080fd5b506001600160a01b03813581169160200135166140ae565b61045960048036036060811015610d1257600080fd5b506001600160a01b0381358116916020810135909116906040013561414a565b61045960048036036060811015610d4857600080fd5b506001600160a01b03813581169160208101359091169060400135614206565b61045960048036036020811015610d7e57600080fd5b50356142de565b6107436143b6565b61045960048036036040811015610da357600080fd5b506001600160a01b03813516906020013515156143c5565b61045960048036036040811015610dd157600080fd5b506001600160a01b0381351690602001351515614474565b61045960048036036020811015610dff57600080fd5b50356001600160a01b03166144ec565b610459600480360360c0811015610e2557600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135614826565b6104596004803603610100811015610e6a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c081013515159060e001351515614a97565b61045960048036036060811015610ec257600080fd5b506001600160a01b03813581169160208101359091169060400135614bf4565b61045960048036036060811015610ef857600080fd5b506001600160a01b03813581169160208101359091169060400135614cf6565b61045960048036036060811015610f2e57600080fd5b506001600160a01b03813581169160208101359091169060400135614d9a565b61045960048036036040811015610f6457600080fd5b5080359060200135614ecf565b61076760048036036020811015610f8757600080fd5b5035614f41565b6104596004803603610100811015610fa557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c081013515159060e001351515614f53565b61045960048036036060811015610ffd57600080fd5b506001600160a01b038135811691602081013590911690604001356150d8565b6104596004803603604081101561103357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561105d57600080fd5b82018360208201111561106f57600080fd5b803590602001918460208302840111600160201b8311171561109057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061517e945050505050565b6104596152ba565b61076761557e565b610743615584565b6001546001600160a01b031633148061110e5750336000908152600b602052604090205460ff165b806111285750336000908152600c602052604090205460ff165b611167576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b80518251146111b9576040805162461bcd60e51b815260206004820152601960248201527854696d656c6f636b3a20696e76616c6964206c656e6774687360381b604482015290519081900360640190fd5b60408051639cb7de4b60e01b81523060048201526001602482015290516001600160a01b03851691639cb7de4b91604480830192600092919082900301818387803b15801561120757600080fd5b505af115801561121b573d6000803e3d6000fd5b5050505060005b82518110156112d857600083828151811061123957fe5b60200260200101519050600083838151811061125157fe5b60200260200101519050856001600160a01b03166341f2272483836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b50506001909401935061122292505050565b5060408051639cb7de4b60e01b815230600482015260006024820181905291516001600160a01b03861692639cb7de4b926044808201939182900301818387803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b0316331461138f576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516972656465656d5573646760b01b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e830152605280830185905283518084039091018152607290920190925280519101206113f081615593565b604080516001600160a01b0380871682528516602082015280820184905290517fe6bd553b6ef21f3a22ebc877b3aaedc30fe15826b8156d4e8c8b373ebf11d78b9181900360600190a150505050565b6001546001600160a01b0316331461148d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051631b5a5b9d60e21b6020808301919091526001600160601b0319606087811b8216602485015286901b166038830152604c80830185905283518084039091018152606c90920190925280519101206114e881615593565b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f23d37bec99db82564427c9bbfe48ad7434bccf413a40fd357fb838c90a0d68289181900360800190a150505050565b6001546001600160a01b03163314806115675750336000908152600b602052604090205460ff165b806115815750336000908152600c602052604090205460ff165b6115c0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6101f4841115611617576040805162461bcd60e51b815260206004820152601f60248201527f54696d656c6f636b3a20696e76616c6964205f6d696e50726f66697442707300604482015290519081900360640190fd5b60408051630daf9c2160e41b81526001600160a01b0388811660048301529151899283169163daf9c210916024808301926020929190829003018186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d602081101561168b57600080fd5b50516116c85760405162461bcd60e51b8152600401808060200182810382526023815260200180615b206023913960400191505060405180910390fd5b6000816001600160a01b0316638ee573ac896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561171757600080fd5b505afa15801561172b573d6000803e3d6000fd5b505050506040513d602081101561174157600080fd5b5051604080516342b60b0360e01b81526001600160a01b038b811660048301529151929350600092918516916342b60b0391602480820192602092909190829003018186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d60208110156117bd57600080fd5b50516040805163db3555fb60e01b81526001600160a01b038c8116600483015291519293506000929186169163db3555fb91602480820192602092909190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b505160408051633c5a6e3560e01b81526001600160a01b038d8116600483015260248201879052604482018d9052606482018c9052608482018b905285151560a483015283151560c48301529151929350908d1691633c5a6e359160e48082019260009290919082900301818387803b1580156118b557600080fd5b505af11580156118c9573d6000803e3d6000fd5b505050508a6001600160a01b0316638585f4d28b886040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b505050508a6001600160a01b031663d66b000d8b876040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561199357600080fd5b505af11580156119a7573d6000803e3d6000fd5b505050505050505050505050505050565b6001546001600160a01b03163314611a05576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663f255527883836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b505050506040513d6020811015611a8f57600080fd5b5050505050565b6001546001600160a01b03163314611ae3576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516939b2ba2430b7323632b960b11b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015283151560f81b60528301528251603381840301815260539092019092528051910120611b4781615637565b611b50816156e3565b836001600160a01b0316639cb7de4b84846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001821515815260200192505050600060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b5050505050505050565b6001546001600160a01b0316331480611bef5750336000908152600b602052604090205460ff165b80611c095750336000908152600c602052604090205460ff165b611c48576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b03166330455ede826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b505050505050565b6001546001600160a01b03163314611cf9576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331480611d4c5750336000908152600b602052604090205460ff165b80611d665750336000908152600c602052604090205460ff165b611da5576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663dfcfa25083836040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314611e49576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516c3bb4ba34323930bbaa37b5b2b760991b6020808301919091526001600160601b0319606088811b8216602d85015287811b8216604185015286901b16605583015260698083018590528351808403909101815260899092019092528051910120611eb781615637565b611ec0816156e3565b846001600160a01b03166301e336678585856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b03163314611f94576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b031663f07bbf77826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314806120045750336000908152600b602052604090205460ff165b8061201e5750336000908152600c602052604090205460ff165b61205d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60c8821061209c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615ab76024913960400191505060405180910390fd5b60c881106120db5760405162461bcd60e51b815260040180806020018281038252602a815260200180615bcc602a913960400191505060405180910390fd5b836001600160a01b0316638a27d4688484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015611ba957600080fd5b60095460ff1681565b6001546001600160a01b03163314612187576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516939b2ba2430b7323632b960b11b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015283151560f81b605283015282516033818403018152605390920190925280519101206121eb81615593565b604080516001600160a01b03808716825285166020820152831515818301526060810183905290517f1929c4e13b0dbbad7856b9ce1fc9dca98c7bf7cedd56e22c04dd60ad1d34fe4b9181900360800190a150505050565b6001546001600160a01b03163314612290576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316631785f53c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6002546001600160a01b031681565b6207a12081565b60075481565b600b6020526000908152604090205460ff1681565b6001546001600160a01b0316331461235d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b0316634453a37483836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001821515815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314612403576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516c3bb4ba34323930bbaa37b5b2b760991b6020808301919091526001600160601b0319606088811b8216602d85015287811b8216604185015286901b1660558301526069808301859052835180840390910181526089909201909252805191012061247181615593565b604080516001600160a01b0380881682528087166020830152851681830152606081018490526080810183905290517f9ed7b0f07a9eed51079fab67f6d0f141f167f5b17fdb5a23282280e15fcafed39181900360a00190a15050505050565b6001546001600160a01b0316331461251e576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60048054604080516327afb5af60e11b8152928301849052516001600160a01b0390911691634f5f6b5e91602480830192600092919082900301818387803b15801561256957600080fd5b505af1158015611a8f573d6000803e3d6000fd5b60065481565b6001546001600160a01b031633146125d0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e909201909252805191012061262581615637565b61262e816156e3565b826001600160a01b031663cfad57a2836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314806126a55750336000908152600b602052604090205460ff165b806126bf5750336000908152600c602052604090205460ff165b6126fe576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b836001600160a01b031663836a01878484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015611ba957600080fd5b6001546001600160a01b031633146127a1576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b0382163014156127fb576040805162461bcd60e51b8152602060048201526019602482015278151a5b595b1bd8dace881a5b9d985b1a590817dd185c99d95d603a1b604482015290519081900360640190fd5b816001600160a01b031663704b6c02826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6005546001600160a01b031681565b6206978081565b6004546001600160a01b031681565b600c6020526000908152604090205460ff1681565b6001546001600160a01b03163314806128ac5750336000908152600b602052604090205460ff165b6128eb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600954819060ff16156129595760408051637c2eb9f760e01b81526001600482015290516001600160a01b03831691637c2eb9f791602480830192600092919082900301818387803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b505050505b806001600160a01b03166340eb3802826001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129a157600080fd5b505afa1580156129b5573d6000803e3d6000fd5b505050506040513d60208110156129cb57600080fd5b505160408051630875ab6160e11b815290516001600160a01b038616916310eb56c2916004808301926020929190829003018186803b158015612a0d57600080fd5b505afa158015612a21573d6000803e3d6000fd5b505050506040513d6020811015612a3757600080fd5b505160408051631351ecc160e21b815290516001600160a01b03871691634d47b304916004808301926020929190829003018186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b50516040805163511791c960e11b815290516001600160a01b0388169163a22f2392916004808301926020929190829003018186803b158015612ae557600080fd5b505afa158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b50516040805163df73a26760e01b815290516001600160a01b0389169163df73a267916004808301926020929190829003018186803b158015612b5157600080fd5b505afa158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b5051600754604080516305d349a560e21b815290516001600160a01b038b169163174d2694916004808301926020929190829003018186803b158015612bc057600080fd5b505afa158015612bd4573d6000803e3d6000fd5b505050506040513d6020811015612bea57600080fd5b50516040805163d9ac422560e01b815290516001600160a01b038c169163d9ac4225916004808301926020929190829003018186803b158015612c2c57600080fd5b505afa158015612c40573d6000803e3d6000fd5b505050506040513d6020811015612c5657600080fd5b505160408051639f392eb360e01b815290516001600160a01b038d1691639f392eb3916004808301926020929190829003018186803b158015612c9857600080fd5b505afa158015612cac573d6000803e3d6000fd5b505050506040513d6020811015612cc257600080fd5b5051604080516001600160e01b031960e08d901b168152600481019a909a5260248a019890985260448901969096526064880194909452608487019290925260a486015260c485015260e484015215156101048301525161012480830192600092919082900301818387803b158015611c9057600080fd5b6001546001600160a01b0316331480612d625750336000908152600b602052604090205460ff165b80612d7c5750336000908152600c602052604090205460ff165b612dbb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6007849055600854604080516320759c0160e11b8152600481018c9052602481018b9052604481018a9052606481018990526084810188905260a481019290925260c4820185905260e48201849052821515610104830152516001600160a01b038c16916340eb38029161012480830192600092919082900301818387803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b5050505050505050505050505050565b6002546001600160a01b03163314612eb7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612f26576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516972656465656d5573646760b01b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015260528083018590528351808403909101815260729092019092528051910120612f8781615637565b612f90816156e3565b6000846001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612fcb57600080fd5b505afa158015612fdf573d6000803e3d6000fd5b505050506040513d6020811015612ff557600080fd5b5051604080516352f4877760e11b81523060048201526001602482015290519192506001600160a01b0387169163a5e90eee9160448082019260009290919082900301818387803b15801561304957600080fd5b505af115801561305d573d6000803e3d6000fd5b5050604080516312b5ad0160e11b815230600482015290516001600160a01b038516935063256b5a029250602480830192600092919082900301818387803b1580156130a857600080fd5b505af11580156130bc573d6000803e3d6000fd5b5050604080516340c10f1960e01b81523060048201526024810187905290516001600160a01b03851693506340c10f199250604480830192600092919082900301818387803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50505050806001600160a01b031663a9059cbb86856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561317d57600080fd5b505af1158015613191573d6000803e3d6000fd5b505050506040513d60208110156131a757600080fd5b505060035460408051630711e61960e41b81526001600160a01b038781166004830152928316602482015290519187169163711e6190916044808201926020929091908290030181600087803b15801561320057600080fd5b505af1158015613214573d6000803e3d6000fd5b505050506040513d602081101561322a57600080fd5b5050604080516352f4877760e11b815230600482015260006024820181905291516001600160a01b0388169263a5e90eee926044808201939182900301818387803b15801561327857600080fd5b505af115801561328c573d6000803e3d6000fd5b50506040805163ceb68c2360e01b815230600482015290516001600160a01b038516935063ceb68c239250602480830192600092919082900301818387803b158015611f2857600080fd5b6001546001600160a01b03163314613324576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516b1cd95d141c9a58d95199595960a21b6020808301919091526001600160601b0319606086811b8216602c85015285901b1682840152825160348184030181526054909201909252805191012061337e81615637565b613387816156e3565b826001600160a01b031663724e78da836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314613423576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b61342c816156e3565b50565b6001546001600160a01b0316331461347c576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6207a12081116134d3576040805162461bcd60e51b815260206004820152601e60248201527f54696d656c6f636b3a20696e76616c6964205f6d61784c657665726167650000604482015290519081900360640190fd5b816001600160a01b031663d3127e63826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314613566576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516b1cd95d141c9a58d95199595960a21b6020808301919091526001600160601b0319606086811b8216602c85015285901b168284015282516034818403018152605490920190925280519101206135c081615593565b604080516001600160a01b0380861682528416602082015280820183905290517fb878dd4b5762f4118ad54995be907dd2bcd915d942e4ac75580fba9b4ee4727f9181900360600190a1505050565b6001546001600160a01b03163314806136375750336000908152600b602052604090205460ff165b806136515750336000908152600c602052604090205460ff165b613690576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d602081101561370a57600080fd5b505160048054604080516370a0823160e01b81526001600160a01b039283169381019390935251929350600092908416916370a08231916024808301926020929190829003018186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d602081101561378a57600080fd5b5051604080516312b5ad0160e11b815230600482015290519192506001600160a01b0384169163256b5a029160248082019260009290919082900301818387803b1580156137d757600080fd5b505af11580156137eb573d6000803e3d6000fd5b505050508083111561387a5760006138038483615788565b60048054604080516340c10f1960e01b81526001600160a01b039283169381019390935260248301849052519293508516916340c10f199160448082019260009290919082900301818387803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b50505050506138f9565b60006138868285615788565b6004805460408051632770a7eb60e21b81526001600160a01b03928316938101939093526024830184905251929350851691639dc29fac9160448082019260009290919082900301818387803b1580156138df57600080fd5b505af11580156138f3573d6000803e3d6000fd5b50505050505b6040805163ceb68c2360e01b815230600482015290516001600160a01b0384169163ceb68c2391602480830192600092919082900301818387803b15801561132557600080fd5b6001546001600160a01b0316331461398d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316635a47a1a7826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b60c881565b6001546001600160a01b03163314613a27576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b64012a05f2008111613a77576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964205f6d6178476173507269636560601b604482015290519081900360640190fd5b816001600160a01b031663d2fa635e826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b0316331480613ae55750336000908152600b602052604090205460ff165b613b24576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6009805460ff1916911515919091179055565b68327cb2734119d3b7a9601e1b81565b6001546001600160a01b03163314613b94576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e9092019092528051910120613be981615593565b604080516001600160a01b0380861682528416602082015280820183905290517f2701a94fd55a560e291f3c54d36580040670d6fde558a77a75d619e38139f7139181900360600190a1505050565b60085481565b6001546001600160a01b0316331480613c665750336000908152600b602052604090205460ff165b80613c805750336000908152600c602052604090205460ff165b613cbf576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60005b8251811015613d6c57836001600160a01b031663d66b000d848381518110613ce657fe5b6020026020010151848481518110613cfa57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613d4857600080fd5b505af1158015613d5c573d6000803e3d6000fd5b505060019092019150613cc29050565b50505050565b6001546001600160a01b03163314613dbf576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b62069780811115613e13576040805162461bcd60e51b81526020600482015260196024820152782a34b6b2b637b1b59d1034b73b30b634b2102fb13ab33332b960391b604482015290519081900360640190fd5b6000548111613e535760405162461bcd60e51b8152600401808060200182810382526024815260200180615b676024913960400191505060405180910390fd5b600055565b6001546001600160a01b03163314613ea5576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6005546040805163bd7bb45160e01b815290516001600160a01b0390921691829163bd7bb451916004808301926020929190829003018186803b158015613eeb57600080fd5b505afa158015613eff573d6000803e3d6000fd5b505050506040513d6020811015613f1557600080fd5b505160055460408051639cb7de4b60e01b81526001600160a01b0392831660048201526001602482015290519190921691639cb7de4b91604480830192600092919082900301818387803b158015613f6c57600080fd5b505af1158015613f80573d6000803e3d6000fd5b50505050806001600160a01b031663705403fa6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fbd57600080fd5b505afa158015613fd1573d6000803e3d6000fd5b505050506040513d6020811015613fe757600080fd5b505160055460408051639cb7de4b60e01b81526001600160a01b0392831660048201526001602482015290519190921691639cb7de4b91604480830192600092919082900301818387803b15801561403e57600080fd5b505af1158015614052573d6000803e3d6000fd5b50506004805460055460408051639cb7de4b60e01b81526001600160a01b0392831694810194909452600160248501525191169350639cb7de4b9250604480830192600092919082900301818387803b15801561256957600080fd5b6001546001600160a01b031633146140fb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b03166371089f4d826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314614197576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051631b5a5b9d60e21b6020808301919091526001600160601b0319606087811b8216602485015286901b166038830152604c80830185905283518084039091018152606c90920190925280519101206141f281615637565b6141fb816156e3565b613d6c8484846157d1565b6001546001600160a01b031633148061422e5750336000908152600b602052604090205460ff165b806142485750336000908152600c602052604090205460ff165b614287576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b0316633fb8b32383836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b0316331461432b576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b611c20811061436b5760405162461bcd60e51b8152600401808060200182810382526023815260200180615adb6023913960400191505060405180910390fd5b600480546040805163966be07560e01b8152928301849052516001600160a01b039091169163966be07591602480830192600092919082900301818387803b15801561256957600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314806143ed5750336000908152600b602052604090205460ff165b61442c576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316637c2eb9f7826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b031633146144c1576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314806145145750336000908152600b602052604090205460ff165b614553576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600954819060ff16156145bf5760408051637c2eb9f760e01b815260006004820181905291516001600160a01b03841692637c2eb9f7926024808201939182900301818387803b1580156145a657600080fd5b505af11580156145ba573d6000803e3d6000fd5b505050505b806001600160a01b03166340eb3802826001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561460757600080fd5b505afa15801561461b573d6000803e3d6000fd5b505050506040513d602081101561463157600080fd5b505160408051630875ab6160e11b815290516001600160a01b038616916310eb56c2916004808301926020929190829003018186803b15801561467357600080fd5b505afa158015614687573d6000803e3d6000fd5b505050506040513d602081101561469d57600080fd5b505160408051631351ecc160e21b815290516001600160a01b03871691634d47b304916004808301926020929190829003018186803b1580156146df57600080fd5b505afa1580156146f3573d6000803e3d6000fd5b505050506040513d602081101561470957600080fd5b50516040805163511791c960e11b815290516001600160a01b0388169163a22f2392916004808301926020929190829003018186803b15801561474b57600080fd5b505afa15801561475f573d6000803e3d6000fd5b505050506040513d602081101561477557600080fd5b50516040805163df73a26760e01b815290516001600160a01b0389169163df73a267916004808301926020929190829003018186803b1580156147b757600080fd5b505afa1580156147cb573d6000803e3d6000fd5b505050506040513d60208110156147e157600080fd5b5051600854604080516305d349a560e21b815290516001600160a01b038b169163174d2694916004808301926020929190829003018186803b158015612bc057600080fd5b6001546001600160a01b031633148061484e5750336000908152600b602052604090205460ff165b806148685750336000908152600c602052604090205460ff165b6148a7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6000869050806001600160a01b03166340eb38028787878787600854886001600160a01b031663174d26946040518163ffffffff1660e01b815260040160206040518083038186803b1580156148fc57600080fd5b505afa158015614910573d6000803e3d6000fd5b505050506040513d602081101561492657600080fd5b50516040805163d9ac422560e01b815290516001600160a01b038c169163d9ac4225916004808301926020929190829003018186803b15801561496857600080fd5b505afa15801561497c573d6000803e3d6000fd5b505050506040513d602081101561499257600080fd5b505160408051639f392eb360e01b815290516001600160a01b038d1691639f392eb3916004808301926020929190829003018186803b1580156149d457600080fd5b505afa1580156149e8573d6000803e3d6000fd5b505050506040513d60208110156149fe57600080fd5b5051604080516001600160e01b031960e08d901b168152600481019a909a5260248a019890985260448901969096526064880194909452608487019290925260a486015260c485015260e484015215156101048301525161012480830192600092919082900301818387803b158015614a7657600080fd5b505af1158015614a8a573d6000803e3d6000fd5b5050505050505050505050565b6001546001600160a01b03163314614ae4576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051727661756c74536574546f6b656e436f6e66696760681b6020808301919091526001600160601b031960608c811b821660338501528b901b166047830152605b8201899052607b8201889052609b820187905260bb820186905284151560f890811b60db840152841515901b60dc830152825160bd81840301815260dd9092019092528051910120614b7981615593565b604080516001600160a01b03808c1682528a166020820152808201899052606081018890526080810187905260a0810186905284151560c082015283151560e082015290517f3510e9d8245371c6c1061c33781ce16bd0eafa03cd3d0781865036520af4c743918190036101000190a1505050505050505050565b6001546001600160a01b03163314614c41576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6040805166617070726f766560c81b6020808301919091526001600160601b0319606087811b8216602785015286901b16603b830152604f80830185905283518084039091018152606f9092019092528051910120614c9f81615593565b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f6af9d86ba7407a934e941ed8ae5f779369a88fe8ba2cd1c204185d6f8a8287fd9181900360800190a150505050565b6001546001600160a01b03163314614d43576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663efa10a6e83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314614de7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6040805166617070726f766560c81b6020808301919091526001600160601b0319606087811b8216602785015286901b16603b830152604f80830185905283518084039091018152606f9092019092528051910120614e4581615637565b614e4e816156e3565b836001600160a01b031663095ea7b384846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614ea557600080fd5b505af1158015614eb9573d6000803e3d6000fd5b505050506040513d6020811015611ca457600080fd5b6001546001600160a01b0316331480614ef75750336000908152600b602052604090205460ff165b614f36576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600791909155600855565b600a6020526000908152604090205481565b6001546001600160a01b03163314614fa0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051727661756c74536574546f6b656e436f6e66696760681b6020808301919091526001600160601b031960608c811b821660338501528b901b166047830152605b8201899052607b8201889052609b820187905260bb820186905284151560f890811b60db840152841515901b60dc830152825160bd81840301815260dd909201909252805191012061503581615637565b61503e816156e3565b60408051633c5a6e3560e01b81526001600160a01b038a81166004830152602482018a905260448201899052606482018890526084820187905285151560a483015284151560c48301529151918b1691633c5a6e359160e48082019260009290919082900301818387803b1580156150b557600080fd5b505af11580156150c9573d6000803e3d6000fd5b50505050505050505050505050565b6001546001600160a01b03163314615125576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018490529151918416916323b872dd916064808201926020929091908290030181600087803b158015611a6557600080fd5b6001546001600160a01b03163314806151a65750336000908152600b602052604090205460ff165b806151c05750336000908152600c602052604090205460ff165b6151ff576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60005b81518110156152b557826001600160a01b031663f255527883838151811061522657fe5b602090810291909101810151600154604080516001600160e01b031960e087901b1681526001600160a01b03938416600482015292909116602483015251604480830193928290030181600087803b15801561528157600080fd5b505af1158015615295573d6000803e3d6000fd5b505050506040513d60208110156152ab57600080fd5b5050600101615202565b505050565b6001546001600160a01b03163314615307576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6004805460408051630748d94560e01b815290516001600160a01b03909216926000928492630748d9459281810192602092909190829003018186803b15801561535057600080fd5b505afa158015615364573d6000803e3d6000fd5b505050506040513d602081101561537a57600080fd5b5051600480546040805163cf456ae760e01b81526001600160a01b0392831693810193909352600160248401525192935083169163cf456ae79160448082019260009290919082900301818387803b1580156153d557600080fd5b505af11580156153e9573d6000803e3d6000fd5b505050506000826001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561542857600080fd5b505afa15801561543c573d6000803e3d6000fd5b505050506040513d602081101561545257600080fd5b505160048054604080516312b5ad0160e11b81526001600160a01b03928316938101939093525192935083169163256b5a029160248082019260009290919082900301818387803b1580156154a657600080fd5b505af11580156154ba573d6000803e3d6000fd5b505050506000836001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156154f957600080fd5b505afa15801561550d573d6000803e3d6000fd5b505050506040513d602081101561552357600080fd5b505160048054604080516352f4877760e11b81526001600160a01b0392831693810193909352600160248401525192935083169163a5e90eee9160448082019260009290919082900301818387803b158015611ba957600080fd5b60005481565b6001546001600160a01b031681565b6000818152600a6020526040902054156155de5760405162461bcd60e51b8152600401808060200182810382526022815260200180615afe6022913960400191505060405180910390fd5b6000546155ec9042906159c7565b6000828152600a602090815260409182902092909255805183815290517f5fb9c0ecf7b4a28c4c480212e868f9da7f373a2ed4d23498b0be6aadf35242fb929181900390910190a150565b6000818152600a6020526040902054615697576040805162461bcd60e51b815260206004820152601e60248201527f54696d656c6f636b3a20616374696f6e206e6f74207369676e616c6c65640000604482015290519081900360640190fd5b6000818152600a6020526040902054421161342c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615b436024913960400191505060405180910390fd5b6000818152600a602052604090205461573f576040805162461bcd60e51b81526020600482015260196024820152782a34b6b2b637b1b59d1034b73b30b634b2102fb0b1ba34b7b760391b604482015290519081900360640190fd5b6000818152600a6020908152604080832092909255815183815291517f194ed6dd5e37e2acc44a19455c3f208c4831ee695fe362d9c4ef2d316bc53aec9281900390910190a150565b60006157ca83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a1f565b9392505050565b604080516355138f0d60e11b8152306004820152905184916001600160a01b0383169163aa271e1a916024808201926020929091908290030181600087803b15801561581c57600080fd5b505af1158015615830573d6000803e3d6000fd5b505050506040513d602081101561584657600080fd5b50516158b3576040805163cf456ae760e01b81523060048201526001602482015290516001600160a01b0383169163cf456ae791604480830192600092919082900301818387803b15801561589a57600080fd5b505af11580156158ae573d6000803e3d6000fd5b505050505b806001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561590a57600080fd5b505af115801561591e573d6000803e3d6000fd5b50505050600654846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561595e57600080fd5b505afa158015615972573d6000803e3d6000fd5b505050506040513d602081101561598857600080fd5b50511115613d6c5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bab6021913960400191505060405180910390fd5b6000828201838110156157ca576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60008184841115615aae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615a73578181015183820152602001615a5b565b50505050905090810190601f168015615aa05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe54696d656c6f636b3a20696e76616c6964205f66756e64696e6752617465466163746f7254696d656c6f636b3a20696e76616c6964205f636f6f6c646f776e4475726174696f6e54696d656c6f636b3a20616374696f6e20616c7265616479207369676e616c6c656454696d656c6f636b3a20746f6b656e206e6f74207965742077686974656c697374656454696d656c6f636b3a20616374696f6e2074696d65206e6f74207965742070617373656454696d656c6f636b3a206275666665722063616e6e6f742062652064656372656173656454696d656c6f636b3a20666f7262696464656e0000000000000000000000000054696d656c6f636b3a206d6178546f6b656e537570706c7920657863656564656454696d656c6f636b3a20696e76616c6964205f737461626c6546756e64696e6752617465466163746f72a26469706673582212208360b5c9bc1d3f837b50bacd02e275442338b40cce2e3011f18b1ae83ae3445164736f6c634300060c0033000000000000000000000000180f4bd2563b95564c0142e269e70c6a84a2ab000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea000000000000000000000000663ebe57dc7bfff136608a4a0a80ab6c107d5625000000000000000000000000c1007262d1cae7e641d51e46275fda5561235b6a0000000000000000000000000000000000000000000af5cbf0741b4c95400000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001f4
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106103215760003560e01c80629a698e146103265780630191c2371461045b57806309cc9a08146104915780630e0dc426146104c75780630e9587f3146105155780631154e8081461054d578063117cf20414610585578063185051c1146105b3578063204bbc54146105e157806321754d9e1461061757806321bd059214610653578063227f03eb1461068157806323aaad12146106b957806324ccbe30146106d5578063268959e51461070d5780632a709b141461073b5780632ba3725a1461075f578063318bc6891461077957806346ea87af1461078157806347de43e2146107a75780634cd23f3b146107df5780634f5f6b5e1461081b57806350f7c2041461083857806351a6de0d14610840578063558182941461086e57806355ef1395146108a65780635a3bb989146108d457806361d07569146108dc57806363960074146108e45780636ba42aaa146108ec5780636d63c1d0146109125780636e5227d414610938578063704b6c021461099957806370ac0a93146109bf57806376e11286146109f5578063781cc3d314610a235780637b6f775a14610a4057806380894d6214610a6c57806381774b3d14610a9a57806386803c7214610ab75780638a39735a14610ae55780638bf22c4614610aed5780638e34c98f14610b1957806395082d2514610b38578063996a7a1e14610b40578063996e2bc914610b6e5780639b53ad2214610b76578063adc7ea3714610ca9578063afd14deb14610cc6578063bc476dfd14610cce578063bc8a8ab914610cfc578063c142940a14610d32578063c57399e114610d68578063c7bb26a014610d85578063cd2b123014610d8d578063d1b9e85314610dbb578063d3c87bbb14610de9578063da76231614610e0f578063db1c844114610e53578063dce6e18d14610eac578063df3a66d914610ee2578063e1f21c6714610f18578063e21b459114610f4e578063e30569e514610f71578063e3cbeb0f14610f8e578063e4652f4914610fe7578063e8ae22711461101d578063ea5ded9a146110ce578063edaafe20146110d6578063f851a440146110de575b600080fd5b6104596004803603606081101561033c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561036657600080fd5b82018360208201111561037857600080fd5b803590602001918460208302840111600160201b8311171561039957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103e857600080fd5b8201836020820111156103fa57600080fd5b803590602001918460208302840111600160201b8311171561041b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110e6945050505050565b005b6104596004803603606081101561047157600080fd5b506001600160a01b03813581169160208101359091169060400135611342565b610459600480360360608110156104a757600080fd5b506001600160a01b03813581169160208101359091169060400135611440565b610459600480360360e08110156104dd57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c0013561153f565b6104596004803603606081101561052b57600080fd5b506001600160a01b0381358116916020810135821691604090910135166119b8565b6104596004803603606081101561056357600080fd5b506001600160a01b038135811691602081013590911690604001351515611a96565b6104596004803603604081101561059b57600080fd5b506001600160a01b0381351690602001351515611bc7565b610459600480360360408110156105c957600080fd5b506001600160a01b0381351690602001351515611cac565b610459600480360360608110156105f757600080fd5b506001600160a01b03813581169160208101359160409091013516611d24565b6104596004803603608081101561062d57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611dfc565b6104596004803603604081101561066957600080fd5b506001600160a01b0381351690602001351515611f47565b6104596004803603608081101561069757600080fd5b506001600160a01b038135169060208101359060408101359060600135611fdc565b6106c1612131565b604080519115158252519081900360200190f35b610459600480360360608110156106eb57600080fd5b506001600160a01b03813581169160208101359091169060400135151561213a565b6104596004803603604081101561072357600080fd5b506001600160a01b0381358116916020013516612243565b6107436122df565b604080516001600160a01b039092168252519081900360200190f35b6107676122ee565b60408051918252519081900360200190f35b6107676122f5565b6106c16004803603602081101561079757600080fd5b50356001600160a01b03166122fb565b610459600480360360608110156107bd57600080fd5b506001600160a01b038135811691602081013590911690604001351515612310565b610459600480360360808110156107f557600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356123b6565b6104596004803603602081101561083157600080fd5b50356124d1565b61076761257d565b6104596004803603604081101561085657600080fd5b506001600160a01b0381358116916020013516612583565b6104596004803603608081101561088457600080fd5b506001600160a01b03813516906020810135906040810135906060013561267d565b610459600480360360408110156108bc57600080fd5b506001600160a01b0381358116916020013516612754565b61074361284a565b610767612859565b610743612860565b6106c16004803603602081101561090257600080fd5b50356001600160a01b031661286f565b6104596004803603602081101561092857600080fd5b50356001600160a01b0316612884565b610459600480360361014081101561094f57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001351515612d3a565b610459600480360360208110156109af57600080fd5b50356001600160a01b0316612e6a565b610459600480360360608110156109d557600080fd5b506001600160a01b03813581169160208101359091169060400135612ed9565b61045960048036036040811015610a0b57600080fd5b506001600160a01b03813581169160200135166132d7565b61045960048036036020811015610a3957600080fd5b50356133d6565b61045960048036036040811015610a5657600080fd5b506001600160a01b03813516906020013561342f565b61045960048036036040811015610a8257600080fd5b506001600160a01b0381358116916020013516613519565b61045960048036036020811015610ab057600080fd5b503561360f565b61045960048036036040811015610acd57600080fd5b506001600160a01b0381351690602001351515613940565b6107676139d5565b61045960048036036040811015610b0357600080fd5b506001600160a01b0381351690602001356139da565b61045960048036036020811015610b2f57600080fd5b50351515613abd565b610767613b37565b61045960048036036040811015610b5657600080fd5b506001600160a01b0381358116916020013516613b47565b610767613c38565b61045960048036036060811015610b8c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610bb657600080fd5b820183602082011115610bc857600080fd5b803590602001918460208302840111600160201b83111715610be957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c3857600080fd5b820183602082011115610c4a57600080fd5b803590602001918460208302840111600160201b83111715610c6b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c3e945050505050565b61045960048036036020811015610cbf57600080fd5b5035613d72565b610459613e58565b61045960048036036040811015610ce457600080fd5b506001600160a01b03813581169160200135166140ae565b61045960048036036060811015610d1257600080fd5b506001600160a01b0381358116916020810135909116906040013561414a565b61045960048036036060811015610d4857600080fd5b506001600160a01b03813581169160208101359091169060400135614206565b61045960048036036020811015610d7e57600080fd5b50356142de565b6107436143b6565b61045960048036036040811015610da357600080fd5b506001600160a01b03813516906020013515156143c5565b61045960048036036040811015610dd157600080fd5b506001600160a01b0381351690602001351515614474565b61045960048036036020811015610dff57600080fd5b50356001600160a01b03166144ec565b610459600480360360c0811015610e2557600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135614826565b6104596004803603610100811015610e6a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c081013515159060e001351515614a97565b61045960048036036060811015610ec257600080fd5b506001600160a01b03813581169160208101359091169060400135614bf4565b61045960048036036060811015610ef857600080fd5b506001600160a01b03813581169160208101359091169060400135614cf6565b61045960048036036060811015610f2e57600080fd5b506001600160a01b03813581169160208101359091169060400135614d9a565b61045960048036036040811015610f6457600080fd5b5080359060200135614ecf565b61076760048036036020811015610f8757600080fd5b5035614f41565b6104596004803603610100811015610fa557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c081013515159060e001351515614f53565b61045960048036036060811015610ffd57600080fd5b506001600160a01b038135811691602081013590911690604001356150d8565b6104596004803603604081101561103357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561105d57600080fd5b82018360208201111561106f57600080fd5b803590602001918460208302840111600160201b8311171561109057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061517e945050505050565b6104596152ba565b61076761557e565b610743615584565b6001546001600160a01b031633148061110e5750336000908152600b602052604090205460ff165b806111285750336000908152600c602052604090205460ff165b611167576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b80518251146111b9576040805162461bcd60e51b815260206004820152601960248201527854696d656c6f636b3a20696e76616c6964206c656e6774687360381b604482015290519081900360640190fd5b60408051639cb7de4b60e01b81523060048201526001602482015290516001600160a01b03851691639cb7de4b91604480830192600092919082900301818387803b15801561120757600080fd5b505af115801561121b573d6000803e3d6000fd5b5050505060005b82518110156112d857600083828151811061123957fe5b60200260200101519050600083838151811061125157fe5b60200260200101519050856001600160a01b03166341f2272483836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b50506001909401935061122292505050565b5060408051639cb7de4b60e01b815230600482015260006024820181905291516001600160a01b03861692639cb7de4b926044808201939182900301818387803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b0316331461138f576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516972656465656d5573646760b01b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e830152605280830185905283518084039091018152607290920190925280519101206113f081615593565b604080516001600160a01b0380871682528516602082015280820184905290517fe6bd553b6ef21f3a22ebc877b3aaedc30fe15826b8156d4e8c8b373ebf11d78b9181900360600190a150505050565b6001546001600160a01b0316331461148d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051631b5a5b9d60e21b6020808301919091526001600160601b0319606087811b8216602485015286901b166038830152604c80830185905283518084039091018152606c90920190925280519101206114e881615593565b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f23d37bec99db82564427c9bbfe48ad7434bccf413a40fd357fb838c90a0d68289181900360800190a150505050565b6001546001600160a01b03163314806115675750336000908152600b602052604090205460ff165b806115815750336000908152600c602052604090205460ff165b6115c0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6101f4841115611617576040805162461bcd60e51b815260206004820152601f60248201527f54696d656c6f636b3a20696e76616c6964205f6d696e50726f66697442707300604482015290519081900360640190fd5b60408051630daf9c2160e41b81526001600160a01b0388811660048301529151899283169163daf9c210916024808301926020929190829003018186803b15801561166157600080fd5b505afa158015611675573d6000803e3d6000fd5b505050506040513d602081101561168b57600080fd5b50516116c85760405162461bcd60e51b8152600401808060200182810382526023815260200180615b206023913960400191505060405180910390fd5b6000816001600160a01b0316638ee573ac896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561171757600080fd5b505afa15801561172b573d6000803e3d6000fd5b505050506040513d602081101561174157600080fd5b5051604080516342b60b0360e01b81526001600160a01b038b811660048301529151929350600092918516916342b60b0391602480820192602092909190829003018186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d60208110156117bd57600080fd5b50516040805163db3555fb60e01b81526001600160a01b038c8116600483015291519293506000929186169163db3555fb91602480820192602092909190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b505160408051633c5a6e3560e01b81526001600160a01b038d8116600483015260248201879052604482018d9052606482018c9052608482018b905285151560a483015283151560c48301529151929350908d1691633c5a6e359160e48082019260009290919082900301818387803b1580156118b557600080fd5b505af11580156118c9573d6000803e3d6000fd5b505050508a6001600160a01b0316638585f4d28b886040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b505050508a6001600160a01b031663d66b000d8b876040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561199357600080fd5b505af11580156119a7573d6000803e3d6000fd5b505050505050505050505050505050565b6001546001600160a01b03163314611a05576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663f255527883836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b505050506040513d6020811015611a8f57600080fd5b5050505050565b6001546001600160a01b03163314611ae3576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516939b2ba2430b7323632b960b11b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015283151560f81b60528301528251603381840301815260539092019092528051910120611b4781615637565b611b50816156e3565b836001600160a01b0316639cb7de4b84846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001821515815260200192505050600060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b5050505050505050565b6001546001600160a01b0316331480611bef5750336000908152600b602052604090205460ff165b80611c095750336000908152600c602052604090205460ff165b611c48576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b03166330455ede826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b505050505050565b6001546001600160a01b03163314611cf9576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331480611d4c5750336000908152600b602052604090205460ff165b80611d665750336000908152600c602052604090205460ff165b611da5576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663dfcfa25083836040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314611e49576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516c3bb4ba34323930bbaa37b5b2b760991b6020808301919091526001600160601b0319606088811b8216602d85015287811b8216604185015286901b16605583015260698083018590528351808403909101815260899092019092528051910120611eb781615637565b611ec0816156e3565b846001600160a01b03166301e336678585856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b03163314611f94576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b031663f07bbf77826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314806120045750336000908152600b602052604090205460ff165b8061201e5750336000908152600c602052604090205460ff165b61205d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60c8821061209c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615ab76024913960400191505060405180910390fd5b60c881106120db5760405162461bcd60e51b815260040180806020018281038252602a815260200180615bcc602a913960400191505060405180910390fd5b836001600160a01b0316638a27d4688484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015611ba957600080fd5b60095460ff1681565b6001546001600160a01b03163314612187576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516939b2ba2430b7323632b960b11b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015283151560f81b605283015282516033818403018152605390920190925280519101206121eb81615593565b604080516001600160a01b03808716825285166020820152831515818301526060810183905290517f1929c4e13b0dbbad7856b9ce1fc9dca98c7bf7cedd56e22c04dd60ad1d34fe4b9181900360800190a150505050565b6001546001600160a01b03163314612290576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316631785f53c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6002546001600160a01b031681565b6207a12081565b60075481565b600b6020526000908152604090205460ff1681565b6001546001600160a01b0316331461235d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b0316634453a37483836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001821515815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314612403576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516c3bb4ba34323930bbaa37b5b2b760991b6020808301919091526001600160601b0319606088811b8216602d85015287811b8216604185015286901b1660558301526069808301859052835180840390910181526089909201909252805191012061247181615593565b604080516001600160a01b0380881682528087166020830152851681830152606081018490526080810183905290517f9ed7b0f07a9eed51079fab67f6d0f141f167f5b17fdb5a23282280e15fcafed39181900360a00190a15050505050565b6001546001600160a01b0316331461251e576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60048054604080516327afb5af60e11b8152928301849052516001600160a01b0390911691634f5f6b5e91602480830192600092919082900301818387803b15801561256957600080fd5b505af1158015611a8f573d6000803e3d6000fd5b60065481565b6001546001600160a01b031633146125d0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e909201909252805191012061262581615637565b61262e816156e3565b826001600160a01b031663cfad57a2836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314806126a55750336000908152600b602052604090205460ff165b806126bf5750336000908152600c602052604090205460ff165b6126fe576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b836001600160a01b031663836a01878484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015611ba957600080fd5b6001546001600160a01b031633146127a1576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b0382163014156127fb576040805162461bcd60e51b8152602060048201526019602482015278151a5b595b1bd8dace881a5b9d985b1a590817dd185c99d95d603a1b604482015290519081900360640190fd5b816001600160a01b031663704b6c02826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6005546001600160a01b031681565b6206978081565b6004546001600160a01b031681565b600c6020526000908152604090205460ff1681565b6001546001600160a01b03163314806128ac5750336000908152600b602052604090205460ff165b6128eb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600954819060ff16156129595760408051637c2eb9f760e01b81526001600482015290516001600160a01b03831691637c2eb9f791602480830192600092919082900301818387803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b505050505b806001600160a01b03166340eb3802826001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129a157600080fd5b505afa1580156129b5573d6000803e3d6000fd5b505050506040513d60208110156129cb57600080fd5b505160408051630875ab6160e11b815290516001600160a01b038616916310eb56c2916004808301926020929190829003018186803b158015612a0d57600080fd5b505afa158015612a21573d6000803e3d6000fd5b505050506040513d6020811015612a3757600080fd5b505160408051631351ecc160e21b815290516001600160a01b03871691634d47b304916004808301926020929190829003018186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b50516040805163511791c960e11b815290516001600160a01b0388169163a22f2392916004808301926020929190829003018186803b158015612ae557600080fd5b505afa158015612af9573d6000803e3d6000fd5b505050506040513d6020811015612b0f57600080fd5b50516040805163df73a26760e01b815290516001600160a01b0389169163df73a267916004808301926020929190829003018186803b158015612b5157600080fd5b505afa158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b5051600754604080516305d349a560e21b815290516001600160a01b038b169163174d2694916004808301926020929190829003018186803b158015612bc057600080fd5b505afa158015612bd4573d6000803e3d6000fd5b505050506040513d6020811015612bea57600080fd5b50516040805163d9ac422560e01b815290516001600160a01b038c169163d9ac4225916004808301926020929190829003018186803b158015612c2c57600080fd5b505afa158015612c40573d6000803e3d6000fd5b505050506040513d6020811015612c5657600080fd5b505160408051639f392eb360e01b815290516001600160a01b038d1691639f392eb3916004808301926020929190829003018186803b158015612c9857600080fd5b505afa158015612cac573d6000803e3d6000fd5b505050506040513d6020811015612cc257600080fd5b5051604080516001600160e01b031960e08d901b168152600481019a909a5260248a019890985260448901969096526064880194909452608487019290925260a486015260c485015260e484015215156101048301525161012480830192600092919082900301818387803b158015611c9057600080fd5b6001546001600160a01b0316331480612d625750336000908152600b602052604090205460ff165b80612d7c5750336000908152600c602052604090205460ff165b612dbb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6007849055600854604080516320759c0160e11b8152600481018c9052602481018b9052604481018a9052606481018990526084810188905260a481019290925260c4820185905260e48201849052821515610104830152516001600160a01b038c16916340eb38029161012480830192600092919082900301818387803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b5050505050505050505050505050565b6002546001600160a01b03163314612eb7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612f26576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516972656465656d5573646760b01b6020808301919091526001600160601b0319606087811b8216602a85015286901b16603e83015260528083018590528351808403909101815260729092019092528051910120612f8781615637565b612f90816156e3565b6000846001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612fcb57600080fd5b505afa158015612fdf573d6000803e3d6000fd5b505050506040513d6020811015612ff557600080fd5b5051604080516352f4877760e11b81523060048201526001602482015290519192506001600160a01b0387169163a5e90eee9160448082019260009290919082900301818387803b15801561304957600080fd5b505af115801561305d573d6000803e3d6000fd5b5050604080516312b5ad0160e11b815230600482015290516001600160a01b038516935063256b5a029250602480830192600092919082900301818387803b1580156130a857600080fd5b505af11580156130bc573d6000803e3d6000fd5b5050604080516340c10f1960e01b81523060048201526024810187905290516001600160a01b03851693506340c10f199250604480830192600092919082900301818387803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50505050806001600160a01b031663a9059cbb86856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561317d57600080fd5b505af1158015613191573d6000803e3d6000fd5b505050506040513d60208110156131a757600080fd5b505060035460408051630711e61960e41b81526001600160a01b038781166004830152928316602482015290519187169163711e6190916044808201926020929091908290030181600087803b15801561320057600080fd5b505af1158015613214573d6000803e3d6000fd5b505050506040513d602081101561322a57600080fd5b5050604080516352f4877760e11b815230600482015260006024820181905291516001600160a01b0388169263a5e90eee926044808201939182900301818387803b15801561327857600080fd5b505af115801561328c573d6000803e3d6000fd5b50506040805163ceb68c2360e01b815230600482015290516001600160a01b038516935063ceb68c239250602480830192600092919082900301818387803b158015611f2857600080fd5b6001546001600160a01b03163314613324576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516b1cd95d141c9a58d95199595960a21b6020808301919091526001600160601b0319606086811b8216602c85015285901b1682840152825160348184030181526054909201909252805191012061337e81615637565b613387816156e3565b826001600160a01b031663724e78da836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314613423576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b61342c816156e3565b50565b6001546001600160a01b0316331461347c576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6207a12081116134d3576040805162461bcd60e51b815260206004820152601e60248201527f54696d656c6f636b3a20696e76616c6964205f6d61784c657665726167650000604482015290519081900360640190fd5b816001600160a01b031663d3127e63826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314613566576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516b1cd95d141c9a58d95199595960a21b6020808301919091526001600160601b0319606086811b8216602c85015285901b168284015282516034818403018152605490920190925280519101206135c081615593565b604080516001600160a01b0380861682528416602082015280820183905290517fb878dd4b5762f4118ad54995be907dd2bcd915d942e4ac75580fba9b4ee4727f9181900360600190a1505050565b6001546001600160a01b03163314806136375750336000908152600b602052604090205460ff165b806136515750336000908152600c602052604090205460ff165b613690576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d602081101561370a57600080fd5b505160048054604080516370a0823160e01b81526001600160a01b039283169381019390935251929350600092908416916370a08231916024808301926020929190829003018186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d602081101561378a57600080fd5b5051604080516312b5ad0160e11b815230600482015290519192506001600160a01b0384169163256b5a029160248082019260009290919082900301818387803b1580156137d757600080fd5b505af11580156137eb573d6000803e3d6000fd5b505050508083111561387a5760006138038483615788565b60048054604080516340c10f1960e01b81526001600160a01b039283169381019390935260248301849052519293508516916340c10f199160448082019260009290919082900301818387803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b50505050506138f9565b60006138868285615788565b6004805460408051632770a7eb60e21b81526001600160a01b03928316938101939093526024830184905251929350851691639dc29fac9160448082019260009290919082900301818387803b1580156138df57600080fd5b505af11580156138f3573d6000803e3d6000fd5b50505050505b6040805163ceb68c2360e01b815230600482015290516001600160a01b0384169163ceb68c2391602480830192600092919082900301818387803b15801561132557600080fd5b6001546001600160a01b0316331461398d576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316635a47a1a7826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b60c881565b6001546001600160a01b03163314613a27576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b64012a05f2008111613a77576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964205f6d6178476173507269636560601b604482015290519081900360640190fd5b816001600160a01b031663d2fa635e826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b0316331480613ae55750336000908152600b602052604090205460ff165b613b24576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6009805460ff1916911515919091179055565b68327cb2734119d3b7a9601e1b81565b6001546001600160a01b03163314613b94576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516539b2ba23b7bb60d11b6020808301919091526001600160601b0319606086811b8216602685015285901b16603a8301528251602e818403018152604e9092019092528051910120613be981615593565b604080516001600160a01b0380861682528416602082015280820183905290517f2701a94fd55a560e291f3c54d36580040670d6fde558a77a75d619e38139f7139181900360600190a1505050565b60085481565b6001546001600160a01b0316331480613c665750336000908152600b602052604090205460ff165b80613c805750336000908152600c602052604090205460ff165b613cbf576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60005b8251811015613d6c57836001600160a01b031663d66b000d848381518110613ce657fe5b6020026020010151848481518110613cfa57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613d4857600080fd5b505af1158015613d5c573d6000803e3d6000fd5b505060019092019150613cc29050565b50505050565b6001546001600160a01b03163314613dbf576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b62069780811115613e13576040805162461bcd60e51b81526020600482015260196024820152782a34b6b2b637b1b59d1034b73b30b634b2102fb13ab33332b960391b604482015290519081900360640190fd5b6000548111613e535760405162461bcd60e51b8152600401808060200182810382526024815260200180615b676024913960400191505060405180910390fd5b600055565b6001546001600160a01b03163314613ea5576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6005546040805163bd7bb45160e01b815290516001600160a01b0390921691829163bd7bb451916004808301926020929190829003018186803b158015613eeb57600080fd5b505afa158015613eff573d6000803e3d6000fd5b505050506040513d6020811015613f1557600080fd5b505160055460408051639cb7de4b60e01b81526001600160a01b0392831660048201526001602482015290519190921691639cb7de4b91604480830192600092919082900301818387803b158015613f6c57600080fd5b505af1158015613f80573d6000803e3d6000fd5b50505050806001600160a01b031663705403fa6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fbd57600080fd5b505afa158015613fd1573d6000803e3d6000fd5b505050506040513d6020811015613fe757600080fd5b505160055460408051639cb7de4b60e01b81526001600160a01b0392831660048201526001602482015290519190921691639cb7de4b91604480830192600092919082900301818387803b15801561403e57600080fd5b505af1158015614052573d6000803e3d6000fd5b50506004805460055460408051639cb7de4b60e01b81526001600160a01b0392831694810194909452600160248501525191169350639cb7de4b9250604480830192600092919082900301818387803b15801561256957600080fd5b6001546001600160a01b031633146140fb576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b03166371089f4d826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b03163314614197576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051631b5a5b9d60e21b6020808301919091526001600160601b0319606087811b8216602485015286901b166038830152604c80830185905283518084039091018152606c90920190925280519101206141f281615637565b6141fb816156e3565b613d6c8484846157d1565b6001546001600160a01b031633148061422e5750336000908152600b602052604090205460ff165b806142485750336000908152600c602052604090205460ff165b614287576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b0316633fb8b32383836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b0316331461432b576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b611c20811061436b5760405162461bcd60e51b8152600401808060200182810382526023815260200180615adb6023913960400191505060405180910390fd5b600480546040805163966be07560e01b8152928301849052516001600160a01b039091169163966be07591602480830192600092919082900301818387803b15801561256957600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314806143ed5750336000908152600b602052604090205460ff165b61442c576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b816001600160a01b0316637c2eb9f7826040518263ffffffff1660e01b8152600401808215158152602001915050600060405180830381600087803b158015611c9057600080fd5b6001546001600160a01b031633146144c1576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314806145145750336000908152600b602052604090205460ff165b614553576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600954819060ff16156145bf5760408051637c2eb9f760e01b815260006004820181905291516001600160a01b03841692637c2eb9f7926024808201939182900301818387803b1580156145a657600080fd5b505af11580156145ba573d6000803e3d6000fd5b505050505b806001600160a01b03166340eb3802826001600160a01b0316637a210a2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561460757600080fd5b505afa15801561461b573d6000803e3d6000fd5b505050506040513d602081101561463157600080fd5b505160408051630875ab6160e11b815290516001600160a01b038616916310eb56c2916004808301926020929190829003018186803b15801561467357600080fd5b505afa158015614687573d6000803e3d6000fd5b505050506040513d602081101561469d57600080fd5b505160408051631351ecc160e21b815290516001600160a01b03871691634d47b304916004808301926020929190829003018186803b1580156146df57600080fd5b505afa1580156146f3573d6000803e3d6000fd5b505050506040513d602081101561470957600080fd5b50516040805163511791c960e11b815290516001600160a01b0388169163a22f2392916004808301926020929190829003018186803b15801561474b57600080fd5b505afa15801561475f573d6000803e3d6000fd5b505050506040513d602081101561477557600080fd5b50516040805163df73a26760e01b815290516001600160a01b0389169163df73a267916004808301926020929190829003018186803b1580156147b757600080fd5b505afa1580156147cb573d6000803e3d6000fd5b505050506040513d60208110156147e157600080fd5b5051600854604080516305d349a560e21b815290516001600160a01b038b169163174d2694916004808301926020929190829003018186803b158015612bc057600080fd5b6001546001600160a01b031633148061484e5750336000908152600b602052604090205460ff165b806148685750336000908152600c602052604090205460ff165b6148a7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6000869050806001600160a01b03166340eb38028787878787600854886001600160a01b031663174d26946040518163ffffffff1660e01b815260040160206040518083038186803b1580156148fc57600080fd5b505afa158015614910573d6000803e3d6000fd5b505050506040513d602081101561492657600080fd5b50516040805163d9ac422560e01b815290516001600160a01b038c169163d9ac4225916004808301926020929190829003018186803b15801561496857600080fd5b505afa15801561497c573d6000803e3d6000fd5b505050506040513d602081101561499257600080fd5b505160408051639f392eb360e01b815290516001600160a01b038d1691639f392eb3916004808301926020929190829003018186803b1580156149d457600080fd5b505afa1580156149e8573d6000803e3d6000fd5b505050506040513d60208110156149fe57600080fd5b5051604080516001600160e01b031960e08d901b168152600481019a909a5260248a019890985260448901969096526064880194909452608487019290925260a486015260c485015260e484015215156101048301525161012480830192600092919082900301818387803b158015614a7657600080fd5b505af1158015614a8a573d6000803e3d6000fd5b5050505050505050505050565b6001546001600160a01b03163314614ae4576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051727661756c74536574546f6b656e436f6e66696760681b6020808301919091526001600160601b031960608c811b821660338501528b901b166047830152605b8201899052607b8201889052609b820187905260bb820186905284151560f890811b60db840152841515901b60dc830152825160bd81840301815260dd9092019092528051910120614b7981615593565b604080516001600160a01b03808c1682528a166020820152808201899052606081018890526080810187905260a0810186905284151560c082015283151560e082015290517f3510e9d8245371c6c1061c33781ce16bd0eafa03cd3d0781865036520af4c743918190036101000190a1505050505050505050565b6001546001600160a01b03163314614c41576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6040805166617070726f766560c81b6020808301919091526001600160601b0319606087811b8216602785015286901b16603b830152604f80830185905283518084039091018152606f9092019092528051910120614c9f81615593565b604080516001600160a01b038087168252851660208201528082018490526060810183905290517f6af9d86ba7407a934e941ed8ae5f779369a88fe8ba2cd1c204185d6f8a8287fd9181900360800190a150505050565b6001546001600160a01b03163314614d43576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b826001600160a01b031663efa10a6e83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561132557600080fd5b6001546001600160a01b03163314614de7576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6040805166617070726f766560c81b6020808301919091526001600160601b0319606087811b8216602785015286901b16603b830152604f80830185905283518084039091018152606f9092019092528051910120614e4581615637565b614e4e816156e3565b836001600160a01b031663095ea7b384846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614ea557600080fd5b505af1158015614eb9573d6000803e3d6000fd5b505050506040513d6020811015611ca457600080fd5b6001546001600160a01b0316331480614ef75750336000908152600b602052604090205460ff165b614f36576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b600791909155600855565b600a6020526000908152604090205481565b6001546001600160a01b03163314614fa0576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60408051727661756c74536574546f6b656e436f6e66696760681b6020808301919091526001600160601b031960608c811b821660338501528b901b166047830152605b8201899052607b8201889052609b820187905260bb820186905284151560f890811b60db840152841515901b60dc830152825160bd81840301815260dd909201909252805191012061503581615637565b61503e816156e3565b60408051633c5a6e3560e01b81526001600160a01b038a81166004830152602482018a905260448201899052606482018890526084820187905285151560a483015284151560c48301529151918b1691633c5a6e359160e48082019260009290919082900301818387803b1580156150b557600080fd5b505af11580156150c9573d6000803e3d6000fd5b50505050505050505050505050565b6001546001600160a01b03163314615125576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018490529151918416916323b872dd916064808201926020929091908290030181600087803b158015611a6557600080fd5b6001546001600160a01b03163314806151a65750336000908152600b602052604090205460ff165b806151c05750336000908152600c602052604090205460ff165b6151ff576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b60005b81518110156152b557826001600160a01b031663f255527883838151811061522657fe5b602090810291909101810151600154604080516001600160e01b031960e087901b1681526001600160a01b03938416600482015292909116602483015251604480830193928290030181600087803b15801561528157600080fd5b505af1158015615295573d6000803e3d6000fd5b505050506040513d60208110156152ab57600080fd5b5050600101615202565b505050565b6001546001600160a01b03163314615307576040805162461bcd60e51b81526020600482015260136024820152600080516020615b8b833981519152604482015290519081900360640190fd5b6004805460408051630748d94560e01b815290516001600160a01b03909216926000928492630748d9459281810192602092909190829003018186803b15801561535057600080fd5b505afa158015615364573d6000803e3d6000fd5b505050506040513d602081101561537a57600080fd5b5051600480546040805163cf456ae760e01b81526001600160a01b0392831693810193909352600160248401525192935083169163cf456ae79160448082019260009290919082900301818387803b1580156153d557600080fd5b505af11580156153e9573d6000803e3d6000fd5b505050506000826001600160a01b031663f5b91b7b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561542857600080fd5b505afa15801561543c573d6000803e3d6000fd5b505050506040513d602081101561545257600080fd5b505160048054604080516312b5ad0160e11b81526001600160a01b03928316938101939093525192935083169163256b5a029160248082019260009290919082900301818387803b1580156154a657600080fd5b505af11580156154ba573d6000803e3d6000fd5b505050506000836001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156154f957600080fd5b505afa15801561550d573d6000803e3d6000fd5b505050506040513d602081101561552357600080fd5b505160048054604080516352f4877760e11b81526001600160a01b0392831693810193909352600160248401525192935083169163a5e90eee9160448082019260009290919082900301818387803b158015611ba957600080fd5b60005481565b6001546001600160a01b031681565b6000818152600a6020526040902054156155de5760405162461bcd60e51b8152600401808060200182810382526022815260200180615afe6022913960400191505060405180910390fd5b6000546155ec9042906159c7565b6000828152600a602090815260409182902092909255805183815290517f5fb9c0ecf7b4a28c4c480212e868f9da7f373a2ed4d23498b0be6aadf35242fb929181900390910190a150565b6000818152600a6020526040902054615697576040805162461bcd60e51b815260206004820152601e60248201527f54696d656c6f636b3a20616374696f6e206e6f74207369676e616c6c65640000604482015290519081900360640190fd5b6000818152600a6020526040902054421161342c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615b436024913960400191505060405180910390fd5b6000818152600a602052604090205461573f576040805162461bcd60e51b81526020600482015260196024820152782a34b6b2b637b1b59d1034b73b30b634b2102fb0b1ba34b7b760391b604482015290519081900360640190fd5b6000818152600a6020908152604080832092909255815183815291517f194ed6dd5e37e2acc44a19455c3f208c4831ee695fe362d9c4ef2d316bc53aec9281900390910190a150565b60006157ca83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a1f565b9392505050565b604080516355138f0d60e11b8152306004820152905184916001600160a01b0383169163aa271e1a916024808201926020929091908290030181600087803b15801561581c57600080fd5b505af1158015615830573d6000803e3d6000fd5b505050506040513d602081101561584657600080fd5b50516158b3576040805163cf456ae760e01b81523060048201526001602482015290516001600160a01b0383169163cf456ae791604480830192600092919082900301818387803b15801561589a57600080fd5b505af11580156158ae573d6000803e3d6000fd5b505050505b806001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561590a57600080fd5b505af115801561591e573d6000803e3d6000fd5b50505050600654846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561595e57600080fd5b505afa158015615972573d6000803e3d6000fd5b505050506040513d602081101561598857600080fd5b50511115613d6c5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bab6021913960400191505060405180910390fd5b6000828201838110156157ca576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b60008184841115615aae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615a73578181015183820152602001615a5b565b50505050905090810190601f168015615aa05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe54696d656c6f636b3a20696e76616c6964205f66756e64696e6752617465466163746f7254696d656c6f636b3a20696e76616c6964205f636f6f6c646f776e4475726174696f6e54696d656c6f636b3a20616374696f6e20616c7265616479207369676e616c6c656454696d656c6f636b3a20746f6b656e206e6f74207965742077686974656c697374656454696d656c6f636b3a20616374696f6e2074696d65206e6f74207965742070617373656454696d656c6f636b3a206275666665722063616e6e6f742062652064656372656173656454696d656c6f636b3a20666f7262696464656e0000000000000000000000000054696d656c6f636b3a206d6178546f6b656e537570706c7920657863656564656454696d656c6f636b3a20696e76616c6964205f737461626c6546756e64696e6752617465466163746f72a26469706673582212208360b5c9bc1d3f837b50bacd02e275442338b40cce2e3011f18b1ae83ae3445164736f6c634300060c0033