Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 10974494 | 1515 days ago | IN | 0 ETH | 0.23549493 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
sbCommunityV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; import "./SafeMath.sol"; import "./IERC20.sol"; import "./sbTokensInterface.sol"; import "./sbControllerInterface.sol"; import "./sbStrongPoolInterface.sol"; import "./sbVotesInterface.sol"; contract sbCommunityV2 { event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); event NewAdmin(address oldAdmin, address newAdmin); event MinerRewardsPercentageUpdated(uint256 percentage); event RewardsReceived(uint256 indexed day, uint256 amount); event ETHMined(address indexed miner, uint256 amount, uint256 indexed day); event ETHUnmined( address indexed miner, uint256 amount, uint256 indexed day ); event ERC20Mined( address indexed miner, address indexed token, uint256 amount, uint256 indexed day ); event ERC20Unmined( address indexed miner, address indexed token, uint256 amount, uint256 indexed day ); event Claimed(address indexed miner, uint256 amount, uint256 indexed day); event ServiceAdded(address indexed service, string tag); event TagAddedForService(address indexed service, string tag); using SafeMath for uint256; bool internal initDone; address internal constant ETH = address(0); string internal name; uint256 internal minerRewardPercentage; IERC20 internal strongToken; sbTokensInterface internal sbTokens; sbControllerInterface internal sbController; sbStrongPoolInterface internal sbStrongPool; sbVotesInterface internal sbVotes; address internal sbTimelock; address internal admin; address internal pendingAdmin; mapping(address => mapping(address => uint256[])) internal minerTokenDays; mapping(address => mapping(address => uint256[])) internal minerTokenAmounts; mapping(address => mapping(address => uint256[])) internal minerTokenMineSeconds; mapping(address => uint256[]) internal tokenDays; mapping(address => uint256[]) internal tokenAmounts; mapping(address => uint256[]) internal tokenMineSeconds; mapping(address => uint256) internal minerDayLastClaimedFor; mapping(uint256 => uint256) internal dayServiceRewards; address[] internal services; mapping(address => string[]) internal serviceTags; address internal superAdmin; address internal pendingSuperAdmin; uint256 internal delayDays; function setSuperAdmin() public { require(superAdmin == address(0), "superAdmin already set"); superAdmin = address(0x4B5057B2c87Ec9e7C047fb00c0E406dfF2FDaCad); } function setPendingSuperAdmin(address newPendingSuperAdmin) public { require( msg.sender == superAdmin && msg.sender != address(0), "not superAdmin" ); pendingSuperAdmin = newPendingSuperAdmin; } function acceptSuperAdmin() public { require( msg.sender == pendingSuperAdmin && msg.sender != address(0), "not pendingSuperAdmin" ); superAdmin = pendingSuperAdmin; pendingSuperAdmin = address(0); } function getSuperAdminAddressUsed() public view returns (address) { return superAdmin; } function getPendingSuperAdminAddressUsed() public view returns (address) { return pendingSuperAdmin; } function superAdminUpdateMinerRewardPercentage(uint256 percentage) external { require( msg.sender == superAdmin && msg.sender != address(0), "not superAdmin" ); require(percentage <= 100, "greater than 100"); minerRewardPercentage = percentage; emit MinerRewardsPercentageUpdated(percentage); } function setDelayDays(uint256 dayCount) public { require( msg.sender == superAdmin && msg.sender != address(0), "not superAdmin" ); require(dayCount >= 1, "zero"); delayDays = dayCount; } function getDelayDays() public view returns (uint256) { return delayDays; } function updateMinerRewardPercentage(uint256 percentage) external { require(msg.sender == sbTimelock, "not sbTimelock"); require(percentage <= 100, "greater than 100"); minerRewardPercentage = percentage; emit MinerRewardsPercentageUpdated(percentage); } function getTokenData(address token, uint256 day) external view returns ( uint256, uint256, uint256 ) { require(sbTokens.tokenAccepted(token), "invalid token"); require(day <= _getCurrentDay(), "invalid day"); return _getTokenData(token, day); } function serviceAccepted(address service) external view returns (bool) { return _serviceExists(service); } function receiveRewards(uint256 day, uint256 amount) external { require(amount > 0, "zero"); require(msg.sender == address(sbController), "not sbController"); strongToken.transferFrom(address(sbController), address(this), amount); uint256 oneHundred = 100; uint256 serviceReward = oneHundred .sub(minerRewardPercentage) .mul(amount) .div(oneHundred); (, , uint256 communityVoteSeconds) = sbVotes.getCommunityData( address(this), day ); if (communityVoteSeconds != 0 && serviceReward != 0) { dayServiceRewards[day] = serviceReward; strongToken.approve(address(sbVotes), serviceReward); sbVotes.receiveServiceRewards(day, serviceReward); } emit RewardsReceived(day, amount.sub(serviceReward)); } function getMinerRewardPercentage() external view returns (uint256) { return minerRewardPercentage; } function addService(address service, string memory tag) public { require(msg.sender == admin, "not admin"); require(sbStrongPool.serviceMinMined(service), "not min mined"); require(service != address(0), "service not zero address"); require(!_serviceExists(service), "service exists"); services.push(service); serviceTags[service].push(tag); emit ServiceAdded(service, tag); } function getServices() public view returns (address[] memory) { return services; } function getServiceTags(address service) public view returns (string[] memory) { require(_serviceExists(service), "invalid service"); return serviceTags[service]; } function addTag(address service, string memory tag) public { require(msg.sender == admin, "not admin"); require(_serviceExists(service), "invalid service"); require(!_serviceTagExists(service, tag), "tag exists"); serviceTags[service].push(tag); emit TagAddedForService(service, tag); } function setPendingAdmin(address newPendingAdmin) public { require(msg.sender == admin, "not admin"); address oldPendingAdmin = pendingAdmin; pendingAdmin = newPendingAdmin; emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin); } function acceptAdmin() public { require( msg.sender == pendingAdmin && msg.sender != address(0), "not pendingAdmin" ); address oldAdmin = admin; address oldPendingAdmin = pendingAdmin; admin = pendingAdmin; pendingAdmin = address(0); emit NewAdmin(oldAdmin, admin); emit NewPendingAdmin(oldPendingAdmin, pendingAdmin); } function getAdminAddressUsed() public view returns (address) { return admin; } function getPendingAdminAddressUsed() public view returns (address) { return pendingAdmin; } function getSbControllerAddressUsed() public view returns (address) { return address(sbController); } function getStrongAddressUsed() public view returns (address) { return address(strongToken); } function getSbTokensAddressUsed() public view returns (address) { return address(sbTokens); } function getSbStrongPoolAddressUsed() public view returns (address) { return address(sbStrongPool); } function getSbVotesAddressUsed() public view returns (address) { return address(sbVotes); } function getSbTimelockAddressUsed() public view returns (address) { return sbTimelock; } function getDayServiceRewards(uint256 day) public view returns (uint256) { return dayServiceRewards[day]; } function getName() public view returns (string memory) { return name; } function getCurrentDay() public view returns (uint256) { return _getCurrentDay(); } function mineETH() public payable { require(msg.value > 0, "zero"); require(sbTokens.tokenAccepted(ETH), "invalid token"); uint256 currentDay = _getCurrentDay(); uint256 startDay = sbController.getStartDay(); uint256 MAX_YEARS = sbController.getMaxYears(); uint256 year = _getYearDayIsIn(currentDay, startDay); require(year <= MAX_YEARS, "invalid year"); require(sbStrongPool.minerMinMined(msg.sender), "not min mined"); _updateMinerTokenData(msg.sender, ETH, msg.value, true, currentDay); _updateTokenData(ETH, msg.value, true, currentDay); emit ETHMined(msg.sender, msg.value, currentDay); } function mineERC20(address token, uint256 amount) public { require(amount > 0, "zero"); require(token != ETH, "no mine ETH"); require(sbTokens.tokenAccepted(token), "invalid token"); IERC20(token).transferFrom(msg.sender, address(this), amount); uint256 currentDay = _getCurrentDay(); uint256 startDay = sbController.getStartDay(); uint256 MAX_YEARS = sbController.getMaxYears(); uint256 year = _getYearDayIsIn(currentDay, startDay); require(year <= MAX_YEARS, "invalid year"); require(sbStrongPool.minerMinMined(msg.sender), "not min mined"); _updateMinerTokenData(msg.sender, token, amount, true, currentDay); _updateTokenData(token, amount, true, currentDay); emit ERC20Mined(msg.sender, token, amount, currentDay); } function unmine(address token, uint256 amount) public { require(amount > 0, "zero"); require(sbTokens.tokenAccepted(token), "invalid token"); uint256 currentDay = _getCurrentDay(); _updateMinerTokenData(msg.sender, token, amount, false, currentDay); _updateTokenData(token, amount, false, currentDay); if (token == ETH) { msg.sender.transfer(amount); emit ETHUnmined(msg.sender, amount, currentDay); } else { IERC20(token).transfer(msg.sender, amount); emit ERC20Unmined(msg.sender, token, amount, currentDay); } } function claimAll() public { require(delayDays > 0, "zero"); uint256 currentDay = _getCurrentDay(); uint256 dayLastClaimedFor = minerDayLastClaimedFor[msg.sender] == 0 ? sbController.getStartDay().sub(1) : minerDayLastClaimedFor[msg.sender]; require( currentDay > dayLastClaimedFor.add(delayDays), "already claimed" ); require(sbTokens.upToDate(), "need token prices"); require(sbController.upToDate(), "need rewards released"); _claim(currentDay, msg.sender, dayLastClaimedFor); } function claimUpTo(uint256 day) public { require(delayDays > 0, "zero"); require(day <= _getCurrentDay(), "invalid day"); uint256 dayLastClaimedFor = minerDayLastClaimedFor[msg.sender] == 0 ? sbController.getStartDay().sub(1) : minerDayLastClaimedFor[msg.sender]; require(day > dayLastClaimedFor.add(delayDays), "already claimed"); require(sbTokens.upToDate(), "need token prices"); require(sbController.upToDate(), "need rewards released"); _claim(day, msg.sender, dayLastClaimedFor); } function getRewardsDueAll(address miner) public view returns (uint256) { require(delayDays > 0, "zero"); uint256 currentDay = _getCurrentDay(); uint256 dayLastClaimedFor = minerDayLastClaimedFor[miner] == 0 ? sbController.getStartDay().sub(1) : minerDayLastClaimedFor[miner]; if (!(currentDay > dayLastClaimedFor.add(delayDays))) { return 0; } require(sbTokens.upToDate(), "need token prices"); require(sbController.upToDate(), "need rewards released"); return _getRewardsDue(currentDay, miner, dayLastClaimedFor); } function getRewardsDueUpTo(uint256 day, address miner) public view returns (uint256) { require(delayDays > 0, "zero"); require(day <= _getCurrentDay(), "invalid day"); uint256 dayLastClaimedFor = minerDayLastClaimedFor[miner] == 0 ? sbController.getStartDay().sub(1) : minerDayLastClaimedFor[miner]; if (!(day > dayLastClaimedFor.add(delayDays))) { return 0; } require(sbTokens.upToDate(), "need token prices"); require(sbController.upToDate(), "need rewards released"); return _getRewardsDue(day, miner, dayLastClaimedFor); } function getMinerDayLastClaimedFor(address miner) public view returns (uint256) { return minerDayLastClaimedFor[miner] == 0 ? sbController.getStartDay().sub(1) : minerDayLastClaimedFor[miner]; } function getMinerTokenData( address miner, address token, uint256 day ) public view returns ( uint256, uint256, uint256 ) { require(sbTokens.tokenAccepted(token), "invalid token"); require(day <= _getCurrentDay(), "invalid day"); return _getMinerTokenData(miner, token, day); } function _getMinerTokenData( address miner, address token, uint256 day ) public view returns ( uint256, uint256, uint256 ) { uint256[] memory _Days = minerTokenDays[miner][token]; uint256[] memory _Amounts = minerTokenAmounts[miner][token]; uint256[] memory _UnitSeconds = minerTokenMineSeconds[miner][token]; return _get(_Days, _Amounts, _UnitSeconds, day); } function _getTokenData(address token, uint256 day) internal view returns ( uint256, uint256, uint256 ) { uint256[] memory _Days = tokenDays[token]; uint256[] memory _Amounts = tokenAmounts[token]; uint256[] memory _UnitSeconds = tokenMineSeconds[token]; return _get(_Days, _Amounts, _UnitSeconds, day); } function _updateMinerTokenData( address miner, address token, uint256 amount, bool adding, uint256 currentDay ) internal { uint256[] storage _Days = minerTokenDays[miner][token]; uint256[] storage _Amounts = minerTokenAmounts[miner][token]; uint256[] storage _UnitSeconds = minerTokenMineSeconds[miner][token]; _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay); } function _updateTokenData( address token, uint256 amount, bool adding, uint256 currentDay ) internal { uint256[] storage _Days = tokenDays[token]; uint256[] storage _Amounts = tokenAmounts[token]; uint256[] storage _UnitSeconds = tokenMineSeconds[token]; _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay); } function _get( uint256[] memory _Days, uint256[] memory _Amounts, uint256[] memory _UnitSeconds, uint256 day ) internal pure returns ( uint256, uint256, uint256 ) { uint256 len = _Days.length; if (len == 0) { return (day, 0, 0); } if (day < _Days[0]) { return (day, 0, 0); } uint256 lastIndex = len.sub(1); uint256 lastMinedDay = _Days[lastIndex]; if (day == lastMinedDay) { return (day, _Amounts[lastIndex], _UnitSeconds[lastIndex]); } else if (day > lastMinedDay) { return (day, _Amounts[lastIndex], _Amounts[lastIndex].mul(1 days)); } return _find(_Days, _Amounts, _UnitSeconds, day); } function _find( uint256[] memory _Days, uint256[] memory _Amounts, uint256[] memory _UnitSeconds, uint256 day ) internal pure returns ( uint256, uint256, uint256 ) { uint256 left = 0; uint256 right = _Days.length.sub(1); uint256 middle = right.add(left).div(2); while (left < right) { if (_Days[middle] == day) { return (day, _Amounts[middle], _UnitSeconds[middle]); } else if (_Days[middle] > day) { if (middle > 0 && _Days[middle.sub(1)] < day) { return ( day, _Amounts[middle.sub(1)], _Amounts[middle.sub(1)].mul(1 days) ); } if (middle == 0) { return (day, 0, 0); } right = middle.sub(1); } else if (_Days[middle] < day) { if ( middle < _Days.length.sub(1) && _Days[middle.add(1)] > day ) { return ( day, _Amounts[middle], _Amounts[middle].mul(1 days) ); } left = middle.add(1); } middle = right.add(left).div(2); } if (_Days[middle] != day) { return (day, 0, 0); } else { return (day, _Amounts[middle], _UnitSeconds[middle]); } } function _update( uint256[] storage _Days, uint256[] storage _Amounts, uint256[] storage _UnitSeconds, uint256 amount, bool adding, uint256 currentDay ) internal { uint256 len = _Days.length; uint256 secondsInADay = 1 days; uint256 secondsSinceStartOfDay = block.timestamp % secondsInADay; uint256 secondsUntilEndOfDay = secondsInADay.sub( secondsSinceStartOfDay ); if (len == 0) { if (adding) { _Days.push(currentDay); _Amounts.push(amount); _UnitSeconds.push(amount.mul(secondsUntilEndOfDay)); } else { require(false, "1: not enough mine"); } } else { uint256 lastIndex = len.sub(1); uint256 lastMinedDay = _Days[lastIndex]; uint256 lastMinedAmount = _Amounts[lastIndex]; uint256 lastUnitSeconds = _UnitSeconds[lastIndex]; uint256 newAmount; uint256 newUnitSeconds; if (lastMinedDay == currentDay) { if (adding) { newAmount = lastMinedAmount.add(amount); newUnitSeconds = lastUnitSeconds.add( amount.mul(secondsUntilEndOfDay) ); } else { require(lastMinedAmount >= amount, "2: not enough mine"); newAmount = lastMinedAmount.sub(amount); newUnitSeconds = lastUnitSeconds.sub( amount.mul(secondsUntilEndOfDay) ); } _Amounts[lastIndex] = newAmount; _UnitSeconds[lastIndex] = newUnitSeconds; } else { if (adding) { newAmount = lastMinedAmount.add(amount); newUnitSeconds = lastMinedAmount.mul(1 days).add( amount.mul(secondsUntilEndOfDay) ); } else { require(lastMinedAmount >= amount, "3: not enough mine"); newAmount = lastMinedAmount.sub(amount); newUnitSeconds = lastMinedAmount.mul(1 days).sub( amount.mul(secondsUntilEndOfDay) ); } _Days.push(currentDay); _Amounts.push(newAmount); _UnitSeconds.push(newUnitSeconds); } } } function _claim( uint256 upToDay, address miner, uint256 dayLastClaimedFor ) internal { uint256 rewards = _getRewardsDue(upToDay, miner, dayLastClaimedFor); require(rewards > 0, "no rewards"); minerDayLastClaimedFor[miner] = upToDay.sub(delayDays); strongToken.approve(address(sbStrongPool), rewards); sbStrongPool.mineFor(miner, rewards); emit Claimed(miner, rewards, _getCurrentDay()); } function _getRewardsDue( uint256 upToDay, address miner, uint256 dayLastClaimedFor ) internal view returns (uint256) { address[] memory tokens = sbTokens.getTokens(); uint256 rewards; for ( uint256 day = dayLastClaimedFor.add(1); day <= upToDay.sub(delayDays); day++ ) { uint256 communityDayMineSecondsUSD = sbController .getCommunityDayMineSecondsUSD(address(this), day); if (communityDayMineSecondsUSD == 0) { continue; } uint256 minerDayMineSecondsUSD = 0; uint256[] memory tokenPrices = sbTokens.getTokenPrices(day); for (uint256 i = 0; i < tokens.length; i++) { address token = tokens[i]; (, , uint256 minerMineSeconds) = _getMinerTokenData( miner, token, day ); uint256 amount = minerMineSeconds.mul(tokenPrices[i]).div(1e18); minerDayMineSecondsUSD = minerDayMineSecondsUSD.add(amount); } uint256 communityDayRewards = sbController .getCommunityDayRewards(address(this), day) .sub(dayServiceRewards[day]); uint256 amount = communityDayRewards .mul(minerDayMineSecondsUSD) .div(communityDayMineSecondsUSD); rewards = rewards.add(amount); } return rewards; } function _serviceExists(address service) internal view returns (bool) { return serviceTags[service].length > 0; } function _serviceTagExists(address service, string memory tag) internal view returns (bool) { for (uint256 i = 0; i < serviceTags[service].length; i++) { if ( keccak256(abi.encode(tag)) == keccak256(abi.encode(serviceTags[service][i])) ) { return true; } } return false; } function _getYearDayIsIn(uint256 day, uint256 startDay) internal pure returns (uint256) { return day.sub(startDay).div(366).add(1); // dividing by 366 makes day 1 and 365 be in year 1 } function _getCurrentDay() internal view returns (uint256) { return block.timestamp.div(1 days).add(1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface sbCommunityInterface { function getTokenData(address token, uint256 day) external view returns ( uint256, uint256, uint256 ); function receiveRewards(uint256 day, uint256 amount) external; function serviceAccepted(address service) external view returns (bool); function getMinerRewardPercentage() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface sbControllerInterface { function getDayMineSecondsUSDTotal(uint256 day) external view returns (uint256); function getCommunityDayMineSecondsUSD(address community, uint256 day) external view returns (uint256); function getCommunityDayRewards(address community, uint256 day) external view returns (uint256); function getStartDay() external view returns (uint256); function getMaxYears() external view returns (uint256); function getStrongPoolDailyRewards(uint256 day) external view returns (uint256); function communityAccepted(address community) external view returns (bool); function getCommunities() external view returns (address[] memory); function upToDate() external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface sbStrongPoolInterface { function serviceMinMined(address miner) external view returns (bool); function minerMinMined(address miner) external view returns (bool); function mineFor(address miner, uint256 amount) external; function getMineData(uint256 day) external view returns ( uint256, uint256, uint256 ); function receiveRewards(uint256 day, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface sbTokensInterface { function getTokens() external view returns (address[] memory); function getTokenPrices(uint256 day) external view returns (uint256[] memory); function tokenAccepted(address token) external view returns (bool); function upToDate() external view returns (bool); function getTokenPrice(address token, uint256 day) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface sbVotesInterface { function getCommunityData(address community, uint256 day) external view returns ( uint256, uint256, uint256 ); function getPriorProposalVotes(address account, uint256 blockNumber) external view returns (uint96); function receiveServiceRewards(uint256 day, uint256 amount) external; function receiveVoterRewards(uint256 day, uint256 amount) external; function updateVotes( address staker, uint256 rawAmount, bool adding ) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ERC20Mined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ERC20Unmined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ETHMined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ETHUnmined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"MinerRewardsPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"string","name":"tag","type":"string"}],"name":"ServiceAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"string","name":"tag","type":"string"}],"name":"TagAddedForService","type":"event"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"_getMinerTokenData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"string","name":"tag","type":"string"}],"name":"addService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"string","name":"tag","type":"string"}],"name":"addTag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"claimUpTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdminAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getDayServiceRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDelayDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"getMinerDayLastClaimedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinerRewardPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getMinerTokenData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAdminAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingSuperAdminAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"getRewardsDueAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"address","name":"miner","type":"address"}],"name":"getRewardsDueUpTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSbControllerAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSbStrongPoolAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSbTimelockAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSbTokensAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSbVotesAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"}],"name":"getServiceTags","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getServices","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrongAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSuperAdminAddressUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getTokenData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mineERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mineETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receiveRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"}],"name":"serviceAccepted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dayCount","type":"uint256"}],"name":"setDelayDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingSuperAdmin","type":"address"}],"name":"setPendingSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"superAdminUpdateMinerRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unmine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"updateMinerRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614092806100206000396000f3fe60806040526004361061023b5760003560e01c806376a8f6641161012e578063b81d29fd116100ab578063d46d17ca1161006f578063d46d17ca14610635578063e7f9cefd1461064a578063f1e5ff3e1461065f578063f36d52da1461067f578063f98260af1461069f5761023b565b8063b81d29fd146105b6578063c12eaff0146105d6578063c9ff8572146105eb578063d1058e5914610600578063d39ca7de146106155761023b565b806399ff8a2b116100f257806399ff8a2b1461052c5780639f292d761461054c578063a4bc4d7f1461056c578063aaa9a98414610581578063afd30430146105965761023b565b806376a8f6641461049357806377c76e46146104b35780638ed3ca6f146104e25780638fbc8c30146104f7578063957314e2146105175761023b565b8063426338b2116101bc5780636579bbe8116101805780636579bbe814610407578063667e3f611461040f5780636b35d2151461043c578063733fb91f1461045c57806375417851146104715761023b565b8063426338b21461037d5780634dd18bf51461039d5780635a306be0146103bd5780635a5256ef146103d25780635c6a741d146103e75761023b565b80632025dbb7116102035780632025dbb7146102e457806322817fd9146102f9578063335479a214610326578063358ff3d81461033b5780633e6968b6146103685761023b565b806304a3379f146102405780630c1803e81461026b5780630e18b6811461028d57806317d7de7c146102a25780631ba2295a146102c4575b600080fd5b34801561024c57600080fd5b506102556106bf565b6040516102629190613989565b60405180910390f35b34801561027757600080fd5b5061028b610286366004613686565b6106ce565b005b34801561029957600080fd5b5061028b6107cf565b3480156102ae57600080fd5b506102b76108b9565b6040516102629190613aac565b3480156102d057600080fd5b5061028b6102df366004613891565b61094e565b3480156102f057600080fd5b50610255610bce565b34801561030557600080fd5b5061031961031436600461362a565b610bdd565b6040516102629190613a41565b34801561033257600080fd5b50610255610cee565b34801561034757600080fd5b5061035b6103563660046138c1565b610cfd565b6040516102629190613fc4565b34801561037457600080fd5b5061035b610f4a565b34801561038957600080fd5b5061035b61039836600461362a565b610f59565b3480156103a957600080fd5b5061028b6103b836600461362a565b610fe8565b3480156103c957600080fd5b50610255611065565b3480156103de57600080fd5b50610255611074565b3480156103f357600080fd5b5061028b610402366004613724565b611083565b61028b6112bb565b34801561041b57600080fd5b5061042f61042a36600461362a565b6115c6565b6040516102629190613aa1565b34801561044857600080fd5b5061028b610457366004613724565b6115d1565b34801561046857600080fd5b5061025561198e565b34801561047d57600080fd5b5061048661199d565b60405161026291906139f4565b34801561049f57600080fd5b5061028b6104ae366004613686565b6119fe565b3480156104bf57600080fd5b506104d36104ce366004613646565b611bc4565b60405161026293929190613fdb565b3480156104ee57600080fd5b50610255611d47565b34801561050357600080fd5b5061028b610512366004613891565b611d56565b34801561052357600080fd5b5061028b611dec565b34801561053857600080fd5b5061028b610547366004613891565b611e3d565b34801561055857600080fd5b506104d3610567366004613724565b611e98565b34801561057857600080fd5b50610255611f78565b34801561058d57600080fd5b5061035b611f87565b3480156105a257600080fd5b5061035b6105b1366004613891565b611f8d565b3480156105c257600080fd5b506104d36105d1366004613646565b611f9f565b3480156105e257600080fd5b50610255612082565b3480156105f757600080fd5b50610255612091565b34801561060c57600080fd5b5061028b6120a0565b34801561062157600080fd5b5061028b61063036600461362a565b6120fa565b34801561064157600080fd5b5061035b612151565b34801561065657600080fd5b5061028b612157565b34801561066b57600080fd5b5061035b61067a36600461362a565b6121b3565b34801561068b57600080fd5b5061028b61069a3660046138f0565b6123e6565b3480156106ab57600080fd5b5061028b6106ba366004613891565b6126d2565b6003546001600160a01b031690565b6009546001600160a01b031633146107015760405162461bcd60e51b81526004016106f890613f40565b60405180910390fd5b61070a826126fc565b6107265760405162461bcd60e51b81526004016106f890613bc1565b6107308282612719565b1561074d5760405162461bcd60e51b81526004016106f890613e78565b6001600160a01b038216600090815260146020908152604082208054600181018255908352918190208351610789939190910191840190613597565b50816001600160a01b03167f6d0cef1b62b5fd4fbb8283cc973c9c2460bbbcde3e49c85f4607d034d5958773826040516107c39190613aac565b60405180910390a25050565b600a546001600160a01b0316331480156107e857503315155b6108045760405162461bcd60e51b81526004016106f890613cea565b60098054600a80546001600160a01b038082166001600160a01b03198086168217968790559092169092556040519282169390927ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc926108689286929116906139da565b60405180910390a1600a546040517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9916108ad9184916001600160a01b0316906139da565b60405180910390a15050565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905090565b6000601754116109705760405162461bcd60e51b81526004016106f890613c14565b6109786127da565b8111156109975760405162461bcd60e51b81526004016106f890613b9c565b33600090815260116020526040812054156109c15733600090815260116020526040902054610a52565b610a526001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c91906138a9565b906127f4565b9050610a696017548261283d90919063ffffffff16565b8211610a875760405162461bcd60e51b81526004016106f890613c95565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b019190613871565b610b1d5760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6b57600080fd5b505afa158015610b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba39190613871565b610bbf5760405162461bcd60e51b81526004016106f890613ee9565b610bca823383612862565b5050565b6015546001600160a01b031690565b6060610be8826126fc565b610c045760405162461bcd60e51b81526004016106f890613bc1565b6001600160a01b038216600090815260146020908152604080832080548251818502810185019093528083529193909284015b82821015610ce25760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610cce5780601f10610ca357610100808354040283529160200191610cce565b820191906000526020600020905b815481529060010190602001808311610cb157829003601f168201915b505050505081526020019060010190610c37565b5050505090505b919050565b6016546001600160a01b031690565b60008060175411610d205760405162461bcd60e51b81526004016106f890613c14565b610d286127da565b831115610d475760405162461bcd60e51b81526004016106f890613b9c565b6001600160a01b03821660009081526011602052604081205415610d83576001600160a01b038316600090815260116020526040902054610dd6565b610dd66001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b9050610ded6017548261283d90919063ffffffff16565b8411610dfd576000915050610f44565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b158015610e3f57600080fd5b505afa158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e779190613871565b610e935760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190613871565b610f355760405162461bcd60e51b81526004016106f890613ee9565b610f408484836129e3565b9150505b92915050565b6000610f546127da565b905090565b6001600160a01b03811660009081526011602052604081205415610f95576001600160a01b038216600090815260116020526040902054610f44565b610f446001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b6009546001600160a01b031633146110125760405162461bcd60e51b81526004016106f890613f40565b600a80546001600160a01b038381166001600160a01b03198316179092556040519116907fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9906108ad90839085906139da565b6004546001600160a01b031690565b6007546001600160a01b031690565b600081116110a35760405162461bcd60e51b81526004016106f890613c14565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e916110d291869101613989565b60206040518083038186803b1580156110ea57600080fd5b505afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190613871565b61113e5760405162461bcd60e51b81526004016106f890613e51565b60006111486127da565b9050611158338484600085612cbd565b6111658383600084612d22565b6001600160a01b0383166111e857604051339083156108fc029084906000818181858888f193505050501580156111a0573d6000803e3d6000fd5b5080336001600160a01b03167f88ef2f24f3715ff32630052a539436e032f89b51e6c7e343fd351598a193e00a846040516111db9190613fc4565b60405180910390a36112b6565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb9061121690339086906004016139c1565b602060405180830381600087803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112689190613871565b5080836001600160a01b0316336001600160a01b03167f54a8170e471278d56760ff241484b47f2c71150f746849909c77bb1c40c9fe7a856040516112ad9190613fc4565b60405180910390a45b505050565b600034116112db5760405162461bcd60e51b81526004016106f890613c14565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e9161130b9160009101613989565b60206040518083038186803b15801561132357600080fd5b505afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613871565b6113775760405162461bcd60e51b81526004016106f890613e51565b60006113816127da565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d357600080fd5b505afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906138a9565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0ff52636040518163ffffffff1660e01b815260040160206040518083038186803b15801561145d57600080fd5b505afa158015611471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149591906138a9565b905060006114a38484612d62565b9050818111156114c55760405162461bcd60e51b81526004016106f890613d43565b60065460405163a20c845160e01b81526001600160a01b039091169063a20c8451906114f5903390600401613989565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190613871565b6115615760405162461bcd60e51b81526004016106f890613b49565b61157033600034600188612cbd565b61157e600034600187612d22565b83336001600160a01b03167f897d709bd00d87199264abc08af2a1bbe38d01946060f6cad51df59d72982d71346040516115b89190613fc4565b60405180910390a350505050565b6000610f44826126fc565b600081116115f15760405162461bcd60e51b81526004016106f890613c14565b6001600160a01b0382166116175760405162461bcd60e51b81526004016106f890613ec4565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e9161164691869101613989565b60206040518083038186803b15801561165e57600080fd5b505afa158015611672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116969190613871565b6116b25760405162461bcd60e51b81526004016106f890613e51565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906116e29033903090869060040161399d565b602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117349190613871565b50600061173f6127da565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b15801561179157600080fd5b505afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c991906138a9565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0ff52636040518163ffffffff1660e01b815260040160206040518083038186803b15801561181b57600080fd5b505afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185391906138a9565b905060006118618484612d62565b9050818111156118835760405162461bcd60e51b81526004016106f890613d43565b60065460405163a20c845160e01b81526001600160a01b039091169063a20c8451906118b3903390600401613989565b60206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190613871565b61191f5760405162461bcd60e51b81526004016106f890613b49565b61192d338787600188612cbd565b61193a8686600187612d22565b83866001600160a01b0316336001600160a01b03167f2b22bb5fa37289d7004304e9fec69aa9b5461b26f1a199678a30f888861072e98860405161197e9190613fc4565b60405180910390a4505050505050565b6006546001600160a01b031690565b6060601380548060200260200160405190810160405280929190818152602001828054801561094457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119d7575050505050905090565b6009546001600160a01b03163314611a285760405162461bcd60e51b81526004016106f890613f40565b6006546040516376d53d6160e01b81526001600160a01b03909116906376d53d6190611a58908590600401613989565b60206040518083038186803b158015611a7057600080fd5b505afa158015611a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa89190613871565b611ac45760405162461bcd60e51b81526004016106f890613b49565b6001600160a01b038216611aea5760405162461bcd60e51b81526004016106f890613f8d565b611af3826126fc565b15611b105760405162461bcd60e51b81526004016106f890613dbd565b6013805460018082019092557f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b03851690811790915560009081526014602090815260408220805493840181558252908190208351611b8a939190910191840190613597565b50816001600160a01b03167fb33be4898b3eae72be50da48dea4d99c1e830cd6f31f9d534998c4fcaa91b62e826040516107c39190613aac565b6001600160a01b038084166000908152600b60209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015611c3657602002820191906000526020600020905b815481526020019060010190808311611c22575b5050506001600160a01b03808b166000908152600c60209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015611cac57602002820191906000526020600020905b815481526020019060010190808311611c98575b5050506001600160a01b03808c166000908152600d60209081526040808320938e1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015611d2257602002820191906000526020600020905b815481526020019060010190808311611d0e575b50505050509050611d358383838a612d79565b95509550955050505093509350939050565b6009546001600160a01b031690565b6015546001600160a01b031633148015611d6f57503315155b611d8b5760405162461bcd60e51b81526004016106f890613e9c565b6064811115611dac5760405162461bcd60e51b81526004016106f890613f63565b60028190556040517fad92c8177533d33ec325fe51843cd29c757f7eadcd30677eb94415e5bd5ae64f90611de1908390613fc4565b60405180910390a150565b6015546001600160a01b031615611e155760405162461bcd60e51b81526004016106f890613d8d565b601580546001600160a01b031916734b5057b2c87ec9e7c047fb00c0e406dff2fdacad179055565b6015546001600160a01b031633148015611e5657503315155b611e725760405162461bcd60e51b81526004016106f890613e9c565b6001811015611e935760405162461bcd60e51b81526004016106f890613c14565b601755565b6004805460405163576fbcaf60e11b8152600092839283926001600160a01b039091169163aedf795e91611ece91899101613989565b60206040518083038186803b158015611ee657600080fd5b505afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e9190613871565b611f3a5760405162461bcd60e51b81526004016106f890613e51565b611f426127da565b841115611f615760405162461bcd60e51b81526004016106f890613b9c565b611f6b8585612e9d565b9250925092509250925092565b6008546001600160a01b031690565b60175490565b60009081526012602052604090205490565b6004805460405163576fbcaf60e11b8152600092839283926001600160a01b039091169163aedf795e91611fd591899101613989565b60206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613871565b6120415760405162461bcd60e51b81526004016106f890613e51565b6120496127da565b8411156120685760405162461bcd60e51b81526004016106f890613b9c565b612073868686611bc4565b92509250925093509350939050565b600a546001600160a01b031690565b6005546001600160a01b031690565b6000601754116120c25760405162461bcd60e51b81526004016106f890613c14565b60006120cc6127da565b3360009081526011602052604081205491925090156109c15733600090815260116020526040902054610a52565b6015546001600160a01b03163314801561211357503315155b61212f5760405162461bcd60e51b81526004016106f890613e9c565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60025490565b6016546001600160a01b03163314801561217057503315155b61218c5760405162461bcd60e51b81526004016106f890613d14565b60168054601580546001600160a01b03199081166001600160a01b03841617909155169055565b600080601754116121d65760405162461bcd60e51b81526004016106f890613c14565b60006121e06127da565b6001600160a01b0384166000908152601160205260408120549192509015612220576001600160a01b038416600090815260116020526040902054612273565b6122736001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b905061228a6017548261283d90919063ffffffff16565b821161229b57600092505050610ce9565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b1580156122dd57600080fd5b505afa1580156122f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123159190613871565b6123315760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b15801561237f57600080fd5b505afa158015612393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b79190613871565b6123d35760405162461bcd60e51b81526004016106f890613ee9565b6123de8285836129e3565b949350505050565b600081116124065760405162461bcd60e51b81526004016106f890613c14565b6005546001600160a01b031633146124305760405162461bcd60e51b81526004016106f890613bea565b6003546005546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92612468929116903090869060040161399d565b602060405180830381600087803b15801561248257600080fd5b505af1158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190613871565b5060006064905060006124ec826124e6856124e0600254876127f490919063ffffffff16565b90612ffa565b90613034565b6007546040516303b5c12760e31b81529192506000916001600160a01b0390911690631dae09389061252490309089906004016139c1565b60606040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125749190613911565b92505050801580159061258657508115155b1561268a5760008581526012602052604090819020839055600354600754915163095ea7b360e01b81526001600160a01b039182169263095ea7b3926125d39291169086906004016139c1565b602060405180830381600087803b1580156125ed57600080fd5b505af1158015612601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126259190613871565b506007546040516262983d60e91b81526001600160a01b039091169063c5307a00906126579088908690600401613fcd565b600060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b505050505b847f61cb44cbea389abb97c617c7d16a62235c51f27da3406d3ec3c9ac87c0d0c8266126b686856127f4565b6040516126c39190613fc4565b60405180910390a25050505050565b6008546001600160a01b03163314611d8b5760405162461bcd60e51b81526004016106f890613f18565b6001600160a01b0316600090815260146020526040902054151590565b6000805b6001600160a01b0384166000908152601460205260409020548110156127d0576001600160a01b038416600090815260146020526040902080548290811061276157fe5b9060005260206000200160405160200161277b9190613abf565b60405160208183030381529060405280519060200120836040516020016127a29190613aac565b6040516020818303038152906040528051906020012014156127c8576001915050610f44565b60010161271d565b5060009392505050565b6000610f5460016127ee4262015180613034565b9061283d565b600061283683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613076565b9392505050565b6000828201838110156128365760405162461bcd60e51b81526004016106f890613c5e565b600061286f8484846129e3565b9050600081116128915760405162461bcd60e51b81526004016106f890613d69565b60175461289f9085906127f4565b6001600160a01b038085166000908152601160205260409081902092909255600354600654925163095ea7b360e01b81529082169263095ea7b3926128eb9291169085906004016139c1565b602060405180830381600087803b15801561290557600080fd5b505af1158015612919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293d9190613871565b506006546040516330d6a97560e01b81526001600160a01b03909116906330d6a9759061297090869085906004016139c1565b600060405180830381600087803b15801561298a57600080fd5b505af115801561299e573d6000803e3d6000fd5b505050506129aa6127da565b836001600160a01b03167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a836040516115b89190613fc4565b600480546040805163154d950160e31b815290516000936060936001600160a01b03169263aa6ca80892818301928792829003018186803b158015612a2757600080fd5b505afa158015612a3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a63919081019061374f565b9050600080612a7385600161283d565b90505b601754612a849088906127f4565b8111612cb357600554604051632a8c096960e01b81526000916001600160a01b031690632a8c096990612abd90309086906004016139c1565b60206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0d91906138a9565b905080612b1a5750612cab565b600480546040516329baa97760e01b81526000926060926001600160a01b0316916329baa97791612b4d91889101613fc4565b60006040518083038186803b158015612b6557600080fd5b505afa158015612b79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ba191908101906137ed565b905060005b8651811015612c29576000878281518110612bbd57fe5b602002602001015190506000612bd48c8389611bc4565b925050506000612c0c670de0b6b3a76400006124e6878781518110612bf557fe5b602002602001015185612ffa90919063ffffffff16565b9050612c18868261283d565b95505060019092019150612ba69050565b50600084815260126020526040808220546005549151634851cd4f60e11b8152612c85926001600160a01b0316906390a39a9e90612c6d9030908b906004016139c1565b60206040518083038186803b158015610a1457600080fd5b90506000612c97856124e68487612ffa565b9050612ca3878261283d565b965050505050505b600101612a76565b5095945050505050565b6001600160a01b038086166000818152600b60209081526040808320948916808452948252808320848452600c83528184208685528352818420948452600d8352818420958452949091529020612d188383838989896130a2565b5050505050505050565b6001600160a01b0384166000908152600e60209081526040808320600f835281842060109093529220612d598383838989896130a2565b50505050505050565b600061283660016127ee61016e6124e687876127f4565b83516000908190819080612d97578460008093509350935050612e93565b87600081518110612da457fe5b6020026020010151851015612dc3578460008093509350935050612e93565b6000612dd08260016127f4565b90506000898281518110612de057fe5b6020026020010151905080871415612e295786898381518110612dff57fe5b6020026020010151898481518110612e1357fe5b6020026020010151955095509550505050612e93565b80871115612e7d5786898381518110612e3e57fe5b6020026020010151612e6f620151808c8681518110612e5957fe5b6020026020010151612ffa90919063ffffffff16565b955095509550505050612e93565b612e898a8a8a8a61334f565b9550955095505050505b9450945094915050565b6001600160a01b0382166000908152600e6020908152604080832080548251818502810185019093528083528493849360609390929091830182828015612f0357602002820191906000526020600020905b815481526020019060010190808311612eef575b5050506001600160a01b0389166000908152600f602090815260409182902080548351818402810184019094528084529596506060959294509250830182828015612f6d57602002820191906000526020600020905b815481526020019060010190808311612f59575b5050506001600160a01b038a1660009081526010602090815260409182902080548351818402810184019094528084529596506060959294509250830182828015612fd757602002820191906000526020600020905b815481526020019060010190808311612fc3575b50505050509050612fea8383838a612d79565b9550955095505050509250925092565b60008261300957506000610f44565b8282028284828161301657fe5b04146128365760405162461bcd60e51b81526004016106f890613e10565b600061283683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613560565b6000818484111561309a5760405162461bcd60e51b81526004016106f89190613aac565b505050900390565b8554620151804281900660006130b883836127f4565b90508361313357851561311657895460018181018c5560008c815260208082209093018890558b549182018c558b81529190912001879055876130fb8883612ffa565b8154600181018355600092835260209092209091015561312e565b60405162461bcd60e51b81526004016106f890613cbe565b613343565b60006131408560016127f4565b905060008b828154811061315057fe5b9060005260206000200154905060008b838154811061316b57fe5b9060005260206000200154905060008b848154811061318657fe5b906000526020600020015490506000808a851415613247578b156131cb576131ae848e61283d565b91506131c46131bd8e89612ffa565b849061283d565b905061320e565b8c8410156131eb5760405162461bcd60e51b81526004016106f890613b70565b6131f5848e6127f4565b915061320b6132048e89612ffa565b84906127f4565b90505b818f878154811061321b57fe5b9060005260206000200181905550808e878154811061323657fe5b60009182526020909120015561333c565b8b1561327a57613257848e61283d565b91506132736132668e89612ffa565b6127ee8662015180612ffa565b90506132c3565b8c84101561329a5760405162461bcd60e51b81526004016106f890613c32565b6132a4848e6127f4565b91506132c06132b38e89612ffa565b610a4c8662015180612ffa565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b60008060008060009050600061337060018a516127f490919063ffffffff16565b9050600061338360026124e6848661283d565b90505b8183101561352757868a828151811061339b57fe5b602002602001015114156133ca57868982815181106133b657fe5b6020026020010151898381518110612e1357fe5b868a82815181106133d757fe5b60200260200101511115613484576000811180156134115750868a6133fd8360016127f4565b8151811061340757fe5b6020026020010151105b1561345b5786896134238360016127f4565b8151811061342d57fe5b6020026020010151612e6f620151808c6134516001876127f490919063ffffffff16565b81518110612e5957fe5b806134725786600080955095509550505050612e93565b61347d8160016127f4565b9150613511565b868a828151811061349157fe5b602002602001015110156135115789516134ac9060016127f4565b811080156134d65750868a6134c283600161283d565b815181106134cc57fe5b6020026020010151115b1561350357868982815181106134e857fe5b6020026020010151612e6f620151808c8581518110612e5957fe5b61350e81600161283d565b92505b61352060026124e6848661283d565b9050613386565b868a828151811061353457fe5b6020026020010151146135535786600080955095509550505050612e93565b868982815181106133b657fe5b600081836135815760405162461bcd60e51b81526004016106f89190613aac565b50600083858161358d57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106135d857805160ff1916838001178555613605565b82800160010185558215613605579182015b828111156136055782518255916020019190600101906135ea565b50613611929150613615565b5090565b5b808211156136115760008155600101613616565b60006020828403121561363b578081fd5b813561283681614044565b60008060006060848603121561365a578182fd5b833561366581614044565b9250602084013561367581614044565b929592945050506040919091013590565b60008060408385031215613698578182fd5b82356136a381614044565b915060208381013567ffffffffffffffff808211156136c0578384fd5b818601915086601f8301126136d3578384fd5b8135818111156136e1578485fd5b6136f3601f8201601f19168501613ff1565b91508082528784828501011115613708578485fd5b8084840185840137810190920192909252919491935090915050565b60008060408385031215613736578182fd5b823561374181614044565b946020939093013593505050565b60006020808385031215613761578182fd5b825167ffffffffffffffff811115613777578283fd5b8301601f81018513613787578283fd5b805161379a61379582614018565b613ff1565b81815283810190838501858402850186018910156137b6578687fd5b8694505b838510156137e15780516137cd81614044565b8352600194909401939185019185016137ba565b50979650505050505050565b600060208083850312156137ff578182fd5b825167ffffffffffffffff811115613815578283fd5b8301601f81018513613825578283fd5b805161383361379582614018565b818152838101908385018584028501860189101561384f578687fd5b8694505b838510156137e1578051835260019490940193918501918501613853565b600060208284031215613882578081fd5b81518015158114612836578182fd5b6000602082840312156138a2578081fd5b5035919050565b6000602082840312156138ba578081fd5b5051919050565b600080604083850312156138d3578182fd5b8235915060208301356138e581614044565b809150509250929050565b60008060408385031215613902578182fd5b50508035926020909101359150565b600080600060608486031215613925578283fd5b8351925060208401519150604084015190509250925092565b60008151808452815b8181101561396357602081850181015186830182015201613947565b818111156139745782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015613a355783516001600160a01b031683529284019291840191600101613a10565b50909695505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613a9457603f19888603018452613a8285835161393e565b94509285019290850190600101613a66565b5092979650505050505050565b901515815260200190565b600060208252612836602083018461393e565b60006020808301818452828554600180821660008114613ae65760018114613b0457613b3c565b60028304607f16855260ff1983166040890152606088019350613b3c565b60028304808652613b148a614038565b885b82811015613b325781548b820160400152908401908801613b16565b8a01604001955050505b5091979650505050505050565b6020808252600d908201526c1b9bdd081b5a5b881b5a5b9959609a1b604082015260600190565b602080825260129082015271323a206e6f7420656e6f756768206d696e6560701b604082015260600190565b6020808252600b908201526a696e76616c69642064617960a81b604082015260600190565b6020808252600f908201526e696e76616c6964207365727669636560881b604082015260600190565b60208082526010908201526f3737ba1039b121b7b73a3937b63632b960811b604082015260600190565b6020808252600490820152637a65726f60e01b604082015260600190565b602080825260129082015271333a206e6f7420656e6f756768206d696e6560701b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600f908201526e185b1c9958591e4818db185a5b5959608a1b604082015260600190565b602080825260129082015271313a206e6f7420656e6f756768206d696e6560701b604082015260600190565b60208082526010908201526f3737ba103832b73234b733a0b236b4b760811b604082015260600190565b6020808252601590820152743737ba103832b73234b733a9bab832b920b236b4b760591b604082015260600190565b6020808252600c908201526b34b73b30b634b2103cb2b0b960a11b604082015260600190565b6020808252600a90820152696e6f207265776172647360b01b604082015260600190565b6020808252601690820152751cdd5c195c90591b5a5b88185b1c9958591e481cd95d60521b604082015260600190565b6020808252600e908201526d736572766963652065786973747360901b604082015260600190565b6020808252601190820152706e65656420746f6b656e2070726963657360781b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600d908201526c34b73b30b634b2103a37b5b2b760991b604082015260600190565b6020808252600a90820152697461672065786973747360b01b604082015260600190565b6020808252600e908201526d3737ba1039bab832b920b236b4b760911b604082015260600190565b6020808252600b908201526a0dcde40dad2dcca408aa8960ab1b604082015260600190565b6020808252601590820152741b995959081c995dd85c991cc81c995b19585cd959605a1b604082015260600190565b6020808252600e908201526d6e6f7420736254696d656c6f636b60901b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b60208082526010908201526f067726561746572207468616e203130360841b604082015260600190565b60208082526018908201527f73657276696365206e6f74207a65726f20616464726573730000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561401057600080fd5b604052919050565b600067ffffffffffffffff82111561402e578081fd5b5060209081020190565b60009081526020902090565b6001600160a01b038116811461405957600080fd5b5056fea2646970667358221220bf53080da8ea3a573c32f5a39773393cb26071bcfa2a5d619b7eef38d9aa29c764736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806376a8f6641161012e578063b81d29fd116100ab578063d46d17ca1161006f578063d46d17ca14610635578063e7f9cefd1461064a578063f1e5ff3e1461065f578063f36d52da1461067f578063f98260af1461069f5761023b565b8063b81d29fd146105b6578063c12eaff0146105d6578063c9ff8572146105eb578063d1058e5914610600578063d39ca7de146106155761023b565b806399ff8a2b116100f257806399ff8a2b1461052c5780639f292d761461054c578063a4bc4d7f1461056c578063aaa9a98414610581578063afd30430146105965761023b565b806376a8f6641461049357806377c76e46146104b35780638ed3ca6f146104e25780638fbc8c30146104f7578063957314e2146105175761023b565b8063426338b2116101bc5780636579bbe8116101805780636579bbe814610407578063667e3f611461040f5780636b35d2151461043c578063733fb91f1461045c57806375417851146104715761023b565b8063426338b21461037d5780634dd18bf51461039d5780635a306be0146103bd5780635a5256ef146103d25780635c6a741d146103e75761023b565b80632025dbb7116102035780632025dbb7146102e457806322817fd9146102f9578063335479a214610326578063358ff3d81461033b5780633e6968b6146103685761023b565b806304a3379f146102405780630c1803e81461026b5780630e18b6811461028d57806317d7de7c146102a25780631ba2295a146102c4575b600080fd5b34801561024c57600080fd5b506102556106bf565b6040516102629190613989565b60405180910390f35b34801561027757600080fd5b5061028b610286366004613686565b6106ce565b005b34801561029957600080fd5b5061028b6107cf565b3480156102ae57600080fd5b506102b76108b9565b6040516102629190613aac565b3480156102d057600080fd5b5061028b6102df366004613891565b61094e565b3480156102f057600080fd5b50610255610bce565b34801561030557600080fd5b5061031961031436600461362a565b610bdd565b6040516102629190613a41565b34801561033257600080fd5b50610255610cee565b34801561034757600080fd5b5061035b6103563660046138c1565b610cfd565b6040516102629190613fc4565b34801561037457600080fd5b5061035b610f4a565b34801561038957600080fd5b5061035b61039836600461362a565b610f59565b3480156103a957600080fd5b5061028b6103b836600461362a565b610fe8565b3480156103c957600080fd5b50610255611065565b3480156103de57600080fd5b50610255611074565b3480156103f357600080fd5b5061028b610402366004613724565b611083565b61028b6112bb565b34801561041b57600080fd5b5061042f61042a36600461362a565b6115c6565b6040516102629190613aa1565b34801561044857600080fd5b5061028b610457366004613724565b6115d1565b34801561046857600080fd5b5061025561198e565b34801561047d57600080fd5b5061048661199d565b60405161026291906139f4565b34801561049f57600080fd5b5061028b6104ae366004613686565b6119fe565b3480156104bf57600080fd5b506104d36104ce366004613646565b611bc4565b60405161026293929190613fdb565b3480156104ee57600080fd5b50610255611d47565b34801561050357600080fd5b5061028b610512366004613891565b611d56565b34801561052357600080fd5b5061028b611dec565b34801561053857600080fd5b5061028b610547366004613891565b611e3d565b34801561055857600080fd5b506104d3610567366004613724565b611e98565b34801561057857600080fd5b50610255611f78565b34801561058d57600080fd5b5061035b611f87565b3480156105a257600080fd5b5061035b6105b1366004613891565b611f8d565b3480156105c257600080fd5b506104d36105d1366004613646565b611f9f565b3480156105e257600080fd5b50610255612082565b3480156105f757600080fd5b50610255612091565b34801561060c57600080fd5b5061028b6120a0565b34801561062157600080fd5b5061028b61063036600461362a565b6120fa565b34801561064157600080fd5b5061035b612151565b34801561065657600080fd5b5061028b612157565b34801561066b57600080fd5b5061035b61067a36600461362a565b6121b3565b34801561068b57600080fd5b5061028b61069a3660046138f0565b6123e6565b3480156106ab57600080fd5b5061028b6106ba366004613891565b6126d2565b6003546001600160a01b031690565b6009546001600160a01b031633146107015760405162461bcd60e51b81526004016106f890613f40565b60405180910390fd5b61070a826126fc565b6107265760405162461bcd60e51b81526004016106f890613bc1565b6107308282612719565b1561074d5760405162461bcd60e51b81526004016106f890613e78565b6001600160a01b038216600090815260146020908152604082208054600181018255908352918190208351610789939190910191840190613597565b50816001600160a01b03167f6d0cef1b62b5fd4fbb8283cc973c9c2460bbbcde3e49c85f4607d034d5958773826040516107c39190613aac565b60405180910390a25050565b600a546001600160a01b0316331480156107e857503315155b6108045760405162461bcd60e51b81526004016106f890613cea565b60098054600a80546001600160a01b038082166001600160a01b03198086168217968790559092169092556040519282169390927ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc926108689286929116906139da565b60405180910390a1600a546040517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9916108ad9184916001600160a01b0316906139da565b60405180910390a15050565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b5050505050905090565b6000601754116109705760405162461bcd60e51b81526004016106f890613c14565b6109786127da565b8111156109975760405162461bcd60e51b81526004016106f890613b9c565b33600090815260116020526040812054156109c15733600090815260116020526040902054610a52565b610a526001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4c91906138a9565b906127f4565b9050610a696017548261283d90919063ffffffff16565b8211610a875760405162461bcd60e51b81526004016106f890613c95565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b019190613871565b610b1d5760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6b57600080fd5b505afa158015610b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba39190613871565b610bbf5760405162461bcd60e51b81526004016106f890613ee9565b610bca823383612862565b5050565b6015546001600160a01b031690565b6060610be8826126fc565b610c045760405162461bcd60e51b81526004016106f890613bc1565b6001600160a01b038216600090815260146020908152604080832080548251818502810185019093528083529193909284015b82821015610ce25760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610cce5780601f10610ca357610100808354040283529160200191610cce565b820191906000526020600020905b815481529060010190602001808311610cb157829003601f168201915b505050505081526020019060010190610c37565b5050505090505b919050565b6016546001600160a01b031690565b60008060175411610d205760405162461bcd60e51b81526004016106f890613c14565b610d286127da565b831115610d475760405162461bcd60e51b81526004016106f890613b9c565b6001600160a01b03821660009081526011602052604081205415610d83576001600160a01b038316600090815260116020526040902054610dd6565b610dd66001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b9050610ded6017548261283d90919063ffffffff16565b8411610dfd576000915050610f44565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b158015610e3f57600080fd5b505afa158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e779190613871565b610e935760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190613871565b610f355760405162461bcd60e51b81526004016106f890613ee9565b610f408484836129e3565b9150505b92915050565b6000610f546127da565b905090565b6001600160a01b03811660009081526011602052604081205415610f95576001600160a01b038216600090815260116020526040902054610f44565b610f446001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b6009546001600160a01b031633146110125760405162461bcd60e51b81526004016106f890613f40565b600a80546001600160a01b038381166001600160a01b03198316179092556040519116907fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9906108ad90839085906139da565b6004546001600160a01b031690565b6007546001600160a01b031690565b600081116110a35760405162461bcd60e51b81526004016106f890613c14565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e916110d291869101613989565b60206040518083038186803b1580156110ea57600080fd5b505afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190613871565b61113e5760405162461bcd60e51b81526004016106f890613e51565b60006111486127da565b9050611158338484600085612cbd565b6111658383600084612d22565b6001600160a01b0383166111e857604051339083156108fc029084906000818181858888f193505050501580156111a0573d6000803e3d6000fd5b5080336001600160a01b03167f88ef2f24f3715ff32630052a539436e032f89b51e6c7e343fd351598a193e00a846040516111db9190613fc4565b60405180910390a36112b6565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb9061121690339086906004016139c1565b602060405180830381600087803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112689190613871565b5080836001600160a01b0316336001600160a01b03167f54a8170e471278d56760ff241484b47f2c71150f746849909c77bb1c40c9fe7a856040516112ad9190613fc4565b60405180910390a45b505050565b600034116112db5760405162461bcd60e51b81526004016106f890613c14565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e9161130b9160009101613989565b60206040518083038186803b15801561132357600080fd5b505afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613871565b6113775760405162461bcd60e51b81526004016106f890613e51565b60006113816127da565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d357600080fd5b505afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906138a9565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0ff52636040518163ffffffff1660e01b815260040160206040518083038186803b15801561145d57600080fd5b505afa158015611471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149591906138a9565b905060006114a38484612d62565b9050818111156114c55760405162461bcd60e51b81526004016106f890613d43565b60065460405163a20c845160e01b81526001600160a01b039091169063a20c8451906114f5903390600401613989565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190613871565b6115615760405162461bcd60e51b81526004016106f890613b49565b61157033600034600188612cbd565b61157e600034600187612d22565b83336001600160a01b03167f897d709bd00d87199264abc08af2a1bbe38d01946060f6cad51df59d72982d71346040516115b89190613fc4565b60405180910390a350505050565b6000610f44826126fc565b600081116115f15760405162461bcd60e51b81526004016106f890613c14565b6001600160a01b0382166116175760405162461bcd60e51b81526004016106f890613ec4565b6004805460405163576fbcaf60e11b81526001600160a01b039091169163aedf795e9161164691869101613989565b60206040518083038186803b15801561165e57600080fd5b505afa158015611672573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116969190613871565b6116b25760405162461bcd60e51b81526004016106f890613e51565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906116e29033903090869060040161399d565b602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117349190613871565b50600061173f6127da565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b15801561179157600080fd5b505afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c991906138a9565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0ff52636040518163ffffffff1660e01b815260040160206040518083038186803b15801561181b57600080fd5b505afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185391906138a9565b905060006118618484612d62565b9050818111156118835760405162461bcd60e51b81526004016106f890613d43565b60065460405163a20c845160e01b81526001600160a01b039091169063a20c8451906118b3903390600401613989565b60206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190613871565b61191f5760405162461bcd60e51b81526004016106f890613b49565b61192d338787600188612cbd565b61193a8686600187612d22565b83866001600160a01b0316336001600160a01b03167f2b22bb5fa37289d7004304e9fec69aa9b5461b26f1a199678a30f888861072e98860405161197e9190613fc4565b60405180910390a4505050505050565b6006546001600160a01b031690565b6060601380548060200260200160405190810160405280929190818152602001828054801561094457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119d7575050505050905090565b6009546001600160a01b03163314611a285760405162461bcd60e51b81526004016106f890613f40565b6006546040516376d53d6160e01b81526001600160a01b03909116906376d53d6190611a58908590600401613989565b60206040518083038186803b158015611a7057600080fd5b505afa158015611a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa89190613871565b611ac45760405162461bcd60e51b81526004016106f890613b49565b6001600160a01b038216611aea5760405162461bcd60e51b81526004016106f890613f8d565b611af3826126fc565b15611b105760405162461bcd60e51b81526004016106f890613dbd565b6013805460018082019092557f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b03851690811790915560009081526014602090815260408220805493840181558252908190208351611b8a939190910191840190613597565b50816001600160a01b03167fb33be4898b3eae72be50da48dea4d99c1e830cd6f31f9d534998c4fcaa91b62e826040516107c39190613aac565b6001600160a01b038084166000908152600b60209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015611c3657602002820191906000526020600020905b815481526020019060010190808311611c22575b5050506001600160a01b03808b166000908152600c60209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015611cac57602002820191906000526020600020905b815481526020019060010190808311611c98575b5050506001600160a01b03808c166000908152600d60209081526040808320938e1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015611d2257602002820191906000526020600020905b815481526020019060010190808311611d0e575b50505050509050611d358383838a612d79565b95509550955050505093509350939050565b6009546001600160a01b031690565b6015546001600160a01b031633148015611d6f57503315155b611d8b5760405162461bcd60e51b81526004016106f890613e9c565b6064811115611dac5760405162461bcd60e51b81526004016106f890613f63565b60028190556040517fad92c8177533d33ec325fe51843cd29c757f7eadcd30677eb94415e5bd5ae64f90611de1908390613fc4565b60405180910390a150565b6015546001600160a01b031615611e155760405162461bcd60e51b81526004016106f890613d8d565b601580546001600160a01b031916734b5057b2c87ec9e7c047fb00c0e406dff2fdacad179055565b6015546001600160a01b031633148015611e5657503315155b611e725760405162461bcd60e51b81526004016106f890613e9c565b6001811015611e935760405162461bcd60e51b81526004016106f890613c14565b601755565b6004805460405163576fbcaf60e11b8152600092839283926001600160a01b039091169163aedf795e91611ece91899101613989565b60206040518083038186803b158015611ee657600080fd5b505afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e9190613871565b611f3a5760405162461bcd60e51b81526004016106f890613e51565b611f426127da565b841115611f615760405162461bcd60e51b81526004016106f890613b9c565b611f6b8585612e9d565b9250925092509250925092565b6008546001600160a01b031690565b60175490565b60009081526012602052604090205490565b6004805460405163576fbcaf60e11b8152600092839283926001600160a01b039091169163aedf795e91611fd591899101613989565b60206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613871565b6120415760405162461bcd60e51b81526004016106f890613e51565b6120496127da565b8411156120685760405162461bcd60e51b81526004016106f890613b9c565b612073868686611bc4565b92509250925093509350939050565b600a546001600160a01b031690565b6005546001600160a01b031690565b6000601754116120c25760405162461bcd60e51b81526004016106f890613c14565b60006120cc6127da565b3360009081526011602052604081205491925090156109c15733600090815260116020526040902054610a52565b6015546001600160a01b03163314801561211357503315155b61212f5760405162461bcd60e51b81526004016106f890613e9c565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60025490565b6016546001600160a01b03163314801561217057503315155b61218c5760405162461bcd60e51b81526004016106f890613d14565b60168054601580546001600160a01b03199081166001600160a01b03841617909155169055565b600080601754116121d65760405162461bcd60e51b81526004016106f890613c14565b60006121e06127da565b6001600160a01b0384166000908152601160205260408120549192509015612220576001600160a01b038416600090815260116020526040902054612273565b6122736001600560009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1457600080fd5b905061228a6017548261283d90919063ffffffff16565b821161229b57600092505050610ce9565b6004805460408051631e094d8160e21b815290516001600160a01b03909216926378253604928282019260209290829003018186803b1580156122dd57600080fd5b505afa1580156122f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123159190613871565b6123315760405162461bcd60e51b81526004016106f890613de5565b600560009054906101000a90046001600160a01b03166001600160a01b031663782536046040518163ffffffff1660e01b815260040160206040518083038186803b15801561237f57600080fd5b505afa158015612393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b79190613871565b6123d35760405162461bcd60e51b81526004016106f890613ee9565b6123de8285836129e3565b949350505050565b600081116124065760405162461bcd60e51b81526004016106f890613c14565b6005546001600160a01b031633146124305760405162461bcd60e51b81526004016106f890613bea565b6003546005546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92612468929116903090869060040161399d565b602060405180830381600087803b15801561248257600080fd5b505af1158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190613871565b5060006064905060006124ec826124e6856124e0600254876127f490919063ffffffff16565b90612ffa565b90613034565b6007546040516303b5c12760e31b81529192506000916001600160a01b0390911690631dae09389061252490309089906004016139c1565b60606040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125749190613911565b92505050801580159061258657508115155b1561268a5760008581526012602052604090819020839055600354600754915163095ea7b360e01b81526001600160a01b039182169263095ea7b3926125d39291169086906004016139c1565b602060405180830381600087803b1580156125ed57600080fd5b505af1158015612601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126259190613871565b506007546040516262983d60e91b81526001600160a01b039091169063c5307a00906126579088908690600401613fcd565b600060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b505050505b847f61cb44cbea389abb97c617c7d16a62235c51f27da3406d3ec3c9ac87c0d0c8266126b686856127f4565b6040516126c39190613fc4565b60405180910390a25050505050565b6008546001600160a01b03163314611d8b5760405162461bcd60e51b81526004016106f890613f18565b6001600160a01b0316600090815260146020526040902054151590565b6000805b6001600160a01b0384166000908152601460205260409020548110156127d0576001600160a01b038416600090815260146020526040902080548290811061276157fe5b9060005260206000200160405160200161277b9190613abf565b60405160208183030381529060405280519060200120836040516020016127a29190613aac565b6040516020818303038152906040528051906020012014156127c8576001915050610f44565b60010161271d565b5060009392505050565b6000610f5460016127ee4262015180613034565b9061283d565b600061283683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613076565b9392505050565b6000828201838110156128365760405162461bcd60e51b81526004016106f890613c5e565b600061286f8484846129e3565b9050600081116128915760405162461bcd60e51b81526004016106f890613d69565b60175461289f9085906127f4565b6001600160a01b038085166000908152601160205260409081902092909255600354600654925163095ea7b360e01b81529082169263095ea7b3926128eb9291169085906004016139c1565b602060405180830381600087803b15801561290557600080fd5b505af1158015612919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293d9190613871565b506006546040516330d6a97560e01b81526001600160a01b03909116906330d6a9759061297090869085906004016139c1565b600060405180830381600087803b15801561298a57600080fd5b505af115801561299e573d6000803e3d6000fd5b505050506129aa6127da565b836001600160a01b03167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a836040516115b89190613fc4565b600480546040805163154d950160e31b815290516000936060936001600160a01b03169263aa6ca80892818301928792829003018186803b158015612a2757600080fd5b505afa158015612a3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a63919081019061374f565b9050600080612a7385600161283d565b90505b601754612a849088906127f4565b8111612cb357600554604051632a8c096960e01b81526000916001600160a01b031690632a8c096990612abd90309086906004016139c1565b60206040518083038186803b158015612ad557600080fd5b505afa158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0d91906138a9565b905080612b1a5750612cab565b600480546040516329baa97760e01b81526000926060926001600160a01b0316916329baa97791612b4d91889101613fc4565b60006040518083038186803b158015612b6557600080fd5b505afa158015612b79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ba191908101906137ed565b905060005b8651811015612c29576000878281518110612bbd57fe5b602002602001015190506000612bd48c8389611bc4565b925050506000612c0c670de0b6b3a76400006124e6878781518110612bf557fe5b602002602001015185612ffa90919063ffffffff16565b9050612c18868261283d565b95505060019092019150612ba69050565b50600084815260126020526040808220546005549151634851cd4f60e11b8152612c85926001600160a01b0316906390a39a9e90612c6d9030908b906004016139c1565b60206040518083038186803b158015610a1457600080fd5b90506000612c97856124e68487612ffa565b9050612ca3878261283d565b965050505050505b600101612a76565b5095945050505050565b6001600160a01b038086166000818152600b60209081526040808320948916808452948252808320848452600c83528184208685528352818420948452600d8352818420958452949091529020612d188383838989896130a2565b5050505050505050565b6001600160a01b0384166000908152600e60209081526040808320600f835281842060109093529220612d598383838989896130a2565b50505050505050565b600061283660016127ee61016e6124e687876127f4565b83516000908190819080612d97578460008093509350935050612e93565b87600081518110612da457fe5b6020026020010151851015612dc3578460008093509350935050612e93565b6000612dd08260016127f4565b90506000898281518110612de057fe5b6020026020010151905080871415612e295786898381518110612dff57fe5b6020026020010151898481518110612e1357fe5b6020026020010151955095509550505050612e93565b80871115612e7d5786898381518110612e3e57fe5b6020026020010151612e6f620151808c8681518110612e5957fe5b6020026020010151612ffa90919063ffffffff16565b955095509550505050612e93565b612e898a8a8a8a61334f565b9550955095505050505b9450945094915050565b6001600160a01b0382166000908152600e6020908152604080832080548251818502810185019093528083528493849360609390929091830182828015612f0357602002820191906000526020600020905b815481526020019060010190808311612eef575b5050506001600160a01b0389166000908152600f602090815260409182902080548351818402810184019094528084529596506060959294509250830182828015612f6d57602002820191906000526020600020905b815481526020019060010190808311612f59575b5050506001600160a01b038a1660009081526010602090815260409182902080548351818402810184019094528084529596506060959294509250830182828015612fd757602002820191906000526020600020905b815481526020019060010190808311612fc3575b50505050509050612fea8383838a612d79565b9550955095505050509250925092565b60008261300957506000610f44565b8282028284828161301657fe5b04146128365760405162461bcd60e51b81526004016106f890613e10565b600061283683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613560565b6000818484111561309a5760405162461bcd60e51b81526004016106f89190613aac565b505050900390565b8554620151804281900660006130b883836127f4565b90508361313357851561311657895460018181018c5560008c815260208082209093018890558b549182018c558b81529190912001879055876130fb8883612ffa565b8154600181018355600092835260209092209091015561312e565b60405162461bcd60e51b81526004016106f890613cbe565b613343565b60006131408560016127f4565b905060008b828154811061315057fe5b9060005260206000200154905060008b838154811061316b57fe5b9060005260206000200154905060008b848154811061318657fe5b906000526020600020015490506000808a851415613247578b156131cb576131ae848e61283d565b91506131c46131bd8e89612ffa565b849061283d565b905061320e565b8c8410156131eb5760405162461bcd60e51b81526004016106f890613b70565b6131f5848e6127f4565b915061320b6132048e89612ffa565b84906127f4565b90505b818f878154811061321b57fe5b9060005260206000200181905550808e878154811061323657fe5b60009182526020909120015561333c565b8b1561327a57613257848e61283d565b91506132736132668e89612ffa565b6127ee8662015180612ffa565b90506132c3565b8c84101561329a5760405162461bcd60e51b81526004016106f890613c32565b6132a4848e6127f4565b91506132c06132b38e89612ffa565b610a4c8662015180612ffa565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b60008060008060009050600061337060018a516127f490919063ffffffff16565b9050600061338360026124e6848661283d565b90505b8183101561352757868a828151811061339b57fe5b602002602001015114156133ca57868982815181106133b657fe5b6020026020010151898381518110612e1357fe5b868a82815181106133d757fe5b60200260200101511115613484576000811180156134115750868a6133fd8360016127f4565b8151811061340757fe5b6020026020010151105b1561345b5786896134238360016127f4565b8151811061342d57fe5b6020026020010151612e6f620151808c6134516001876127f490919063ffffffff16565b81518110612e5957fe5b806134725786600080955095509550505050612e93565b61347d8160016127f4565b9150613511565b868a828151811061349157fe5b602002602001015110156135115789516134ac9060016127f4565b811080156134d65750868a6134c283600161283d565b815181106134cc57fe5b6020026020010151115b1561350357868982815181106134e857fe5b6020026020010151612e6f620151808c8581518110612e5957fe5b61350e81600161283d565b92505b61352060026124e6848661283d565b9050613386565b868a828151811061353457fe5b6020026020010151146135535786600080955095509550505050612e93565b868982815181106133b657fe5b600081836135815760405162461bcd60e51b81526004016106f89190613aac565b50600083858161358d57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106135d857805160ff1916838001178555613605565b82800160010185558215613605579182015b828111156136055782518255916020019190600101906135ea565b50613611929150613615565b5090565b5b808211156136115760008155600101613616565b60006020828403121561363b578081fd5b813561283681614044565b60008060006060848603121561365a578182fd5b833561366581614044565b9250602084013561367581614044565b929592945050506040919091013590565b60008060408385031215613698578182fd5b82356136a381614044565b915060208381013567ffffffffffffffff808211156136c0578384fd5b818601915086601f8301126136d3578384fd5b8135818111156136e1578485fd5b6136f3601f8201601f19168501613ff1565b91508082528784828501011115613708578485fd5b8084840185840137810190920192909252919491935090915050565b60008060408385031215613736578182fd5b823561374181614044565b946020939093013593505050565b60006020808385031215613761578182fd5b825167ffffffffffffffff811115613777578283fd5b8301601f81018513613787578283fd5b805161379a61379582614018565b613ff1565b81815283810190838501858402850186018910156137b6578687fd5b8694505b838510156137e15780516137cd81614044565b8352600194909401939185019185016137ba565b50979650505050505050565b600060208083850312156137ff578182fd5b825167ffffffffffffffff811115613815578283fd5b8301601f81018513613825578283fd5b805161383361379582614018565b818152838101908385018584028501860189101561384f578687fd5b8694505b838510156137e1578051835260019490940193918501918501613853565b600060208284031215613882578081fd5b81518015158114612836578182fd5b6000602082840312156138a2578081fd5b5035919050565b6000602082840312156138ba578081fd5b5051919050565b600080604083850312156138d3578182fd5b8235915060208301356138e581614044565b809150509250929050565b60008060408385031215613902578182fd5b50508035926020909101359150565b600080600060608486031215613925578283fd5b8351925060208401519150604084015190509250925092565b60008151808452815b8181101561396357602081850181015186830182015201613947565b818111156139745782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015613a355783516001600160a01b031683529284019291840191600101613a10565b50909695505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613a9457603f19888603018452613a8285835161393e565b94509285019290850190600101613a66565b5092979650505050505050565b901515815260200190565b600060208252612836602083018461393e565b60006020808301818452828554600180821660008114613ae65760018114613b0457613b3c565b60028304607f16855260ff1983166040890152606088019350613b3c565b60028304808652613b148a614038565b885b82811015613b325781548b820160400152908401908801613b16565b8a01604001955050505b5091979650505050505050565b6020808252600d908201526c1b9bdd081b5a5b881b5a5b9959609a1b604082015260600190565b602080825260129082015271323a206e6f7420656e6f756768206d696e6560701b604082015260600190565b6020808252600b908201526a696e76616c69642064617960a81b604082015260600190565b6020808252600f908201526e696e76616c6964207365727669636560881b604082015260600190565b60208082526010908201526f3737ba1039b121b7b73a3937b63632b960811b604082015260600190565b6020808252600490820152637a65726f60e01b604082015260600190565b602080825260129082015271333a206e6f7420656e6f756768206d696e6560701b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600f908201526e185b1c9958591e4818db185a5b5959608a1b604082015260600190565b602080825260129082015271313a206e6f7420656e6f756768206d696e6560701b604082015260600190565b60208082526010908201526f3737ba103832b73234b733a0b236b4b760811b604082015260600190565b6020808252601590820152743737ba103832b73234b733a9bab832b920b236b4b760591b604082015260600190565b6020808252600c908201526b34b73b30b634b2103cb2b0b960a11b604082015260600190565b6020808252600a90820152696e6f207265776172647360b01b604082015260600190565b6020808252601690820152751cdd5c195c90591b5a5b88185b1c9958591e481cd95d60521b604082015260600190565b6020808252600e908201526d736572766963652065786973747360901b604082015260600190565b6020808252601190820152706e65656420746f6b656e2070726963657360781b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600d908201526c34b73b30b634b2103a37b5b2b760991b604082015260600190565b6020808252600a90820152697461672065786973747360b01b604082015260600190565b6020808252600e908201526d3737ba1039bab832b920b236b4b760911b604082015260600190565b6020808252600b908201526a0dcde40dad2dcca408aa8960ab1b604082015260600190565b6020808252601590820152741b995959081c995dd85c991cc81c995b19585cd959605a1b604082015260600190565b6020808252600e908201526d6e6f7420736254696d656c6f636b60901b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b60208082526010908201526f067726561746572207468616e203130360841b604082015260600190565b60208082526018908201527f73657276696365206e6f74207a65726f20616464726573730000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561401057600080fd5b604052919050565b600067ffffffffffffffff82111561402e578081fd5b5060209081020190565b60009081526020902090565b6001600160a01b038116811461405957600080fd5b5056fea2646970667358221220bf53080da8ea3a573c32f5a39773393cb26071bcfa2a5d619b7eef38d9aa29c764736f6c634300060c0033
Deployed Bytecode Sourcemap
284:23655:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8043:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6691:330;;;;;;;;;;-1:-1:-1;6691:330:3;;;;;:::i;:::-;;:::i;:::-;;7300:412;;;;;;;;;;;;;:::i;8725:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11681:571::-;;;;;;;;;;-1:-1:-1;11681:571:3;;;;;:::i;:::-;;:::i;3210:100::-;;;;;;;;;;;;;:::i;6473:212::-;;;;;;;;;;-1:-1:-1;6473:212:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3316:114::-;;;;;;;;;;;;;:::i;12884:658::-;;;;;;;;;;-1:-1:-1;12884:658:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8814:95::-;;;;;;;;;;;;;:::i;13548:278::-;;;;;;;;;;-1:-1:-1;13548:278:3;;;;;:::i;:::-;;:::i;7027:267::-;;;;;;;;;;-1:-1:-1;7027:267:3;;;;;:::i;:::-;;:::i;8155:105::-;;;;;;;;;;;;;:::i;8385:103::-;;;;;;;;;;;;;:::i;10440:632::-;;;;;;;;;;-1:-1:-1;10440:632:3;;;;;:::i;:::-;;:::i;8915:685::-;;;:::i;4809:118::-;;;;;;;;;;-1:-1:-1;4809:118:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9606:828::-;;;;;;;;;;-1:-1:-1;9606:828:3;;;;;:::i;:::-;;:::i;8266:113::-;;;;;;;;;;;;;:::i;6373:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5931:436::-;;;;;;;;;;-1:-1:-1;5931:436:3;;;;;:::i;:::-;;:::i;14243:496::-;;;;;;;;;;-1:-1:-1;14243:496:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;7718:90::-;;;;;;;;;;;;;:::i;3436:374::-;;;;;;;;;;-1:-1:-1;3436:374:3;;;;;:::i;:::-;;:::i;2504:182::-;;;;;;;;;;;;;:::i;3816:247::-;;;;;;;;;;-1:-1:-1;3816:247:3;;;;;:::i;:::-;;:::i;4458:345::-;;;;;;;;;;-1:-1:-1;4458:345:3;;;;;:::i;:::-;;:::i;8494:100::-;;;;;;;;;;;;;:::i;4069:87::-;;;;;;;;;;;;;:::i;8600:119::-;;;;;;;;;;-1:-1:-1;8600:119:3;;;;;:::i;:::-;;:::i;13832:405::-;;;;;;;;;;-1:-1:-1;13832:405:3;;;;;:::i;:::-;;:::i;7814:104::-;;;;;;;;;;;;;:::i;7924:113::-;;;;;;;;;;;;;:::i;11078:597::-;;;;;;;;;;;;;:::i;2692:247::-;;;;;;;;;;-1:-1:-1;2692:247:3;;;;;:::i;:::-;;:::i;5812:113::-;;;;;;;;;;;;;:::i;2945:259::-;;;;;;;;;;;;;:::i;12258:620::-;;;;;;;;;;-1:-1:-1;12258:620:3;;;;;:::i;:::-;;:::i;4933:873::-;;;;;;;;;;-1:-1:-1;4933:873:3;;;;;:::i;:::-;;:::i;4162:290::-;;;;;;;;;;-1:-1:-1;4162:290:3;;;;;:::i;:::-;;:::i;8043:106::-;8130:11;;-1:-1:-1;;;;;8130:11:3;8043:106;:::o;6691:330::-;6782:5;;-1:-1:-1;;;;;6782:5:3;6768:10;:19;6760:41;;;;-1:-1:-1;;;6760:41:3;;;;;;;:::i;:::-;;;;;;;;;6819:23;6834:7;6819:14;:23::i;:::-;6811:51;;;;-1:-1:-1;;;6811:51:3;;;;;;;:::i;:::-;6881:31;6899:7;6908:3;6881:17;:31::i;:::-;6880:32;6872:55;;;;-1:-1:-1;;;6872:55:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;6937:20:3;;;;;;:11;:20;;;;;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7001:7;-1:-1:-1;;;;;6982:32:3;;7010:3;6982:32;;;;;;:::i;:::-;;;;;;;;6691:330;;:::o;7300:412::-;7375:12;;-1:-1:-1;;;;;7375:12:3;7361:10;:26;:54;;;;-1:-1:-1;7391:10:3;:24;;7361:54;7340:117;;;;-1:-1:-1;;;7340:117:3;;;;;;;:::i;:::-;7486:5;;;7527:12;;;-1:-1:-1;;;;;7527:12:3;;;-1:-1:-1;;;;;;7549:20:3;;;;;;;;;7579:25;;;;;;7619;;7486:5;;;;7527:12;;7619:25;;;;7486:5;;7638;;;7619:25;:::i;:::-;;;;;;;;7692:12;;7659:46;;;;;;7675:15;;-1:-1:-1;;;;;7692:12:3;;7659:46;:::i;:::-;;;;;;;;7300:412;;:::o;8725:83::-;8797:4;8790:11;;;;;;;;-1:-1:-1;;8790:11:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8765:13;;8790:11;;8797:4;;8790:11;;8797:4;8790:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8725:83;:::o;11681:571::-;11750:1;11738:9;;:13;11730:30;;;;-1:-1:-1;;;11730:30:3;;;;;;;:::i;:::-;11785:16;:14;:16::i;:::-;11778:3;:23;;11770:47;;;;-1:-1:-1;;;11770:47:3;;;;;;;:::i;:::-;11878:10;11827:25;11855:34;;;:22;:34;;;;;;:39;:136;;11980:10;11957:34;;;;:22;:34;;;;;;11855:136;;;11909:33;11940:1;11909:12;;;;;;;;;-1:-1:-1;;;;;11909:12:3;-1:-1:-1;;;;;11909:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;;:33::i;:::-;11827:164;;12015:32;12037:9;;12015:17;:21;;:32;;;;:::i;:::-;12009:3;:38;12001:66;;;;-1:-1:-1;;;12001:66:3;;;;;;;:::i;:::-;12085:8;;;:19;;;-1:-1:-1;;;12085:19:3;;;;-1:-1:-1;;;;;12085:8:3;;;;:17;;:19;;;;;;;;;;;;:8;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12077:49;;;;-1:-1:-1;;;12077:49:3;;;;;;;:::i;:::-;12144:12;;;;;;;;;-1:-1:-1;;;;;12144:12:3;-1:-1:-1;;;;;12144:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12136:57;;;;-1:-1:-1;;;12136:57:3;;;;;;;:::i;:::-;12203:42;12210:3;12215:10;12227:17;12203:6;:42::i;:::-;11681:571;;:::o;3210:100::-;3293:10;;-1:-1:-1;;;;;3293:10:3;3210:100;:::o;6473:212::-;6559:15;6598:23;6613:7;6598:14;:23::i;:::-;6590:51;;;;-1:-1:-1;;;6590:51:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;6658:20:3;;;;;;:11;:20;;;;;;;;6651:27;;;;;;;;;;;;;;;;;;;6658:20;;6651:27;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6651:27:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6473:212;;;;:::o;3316:114::-;3406:17;;-1:-1:-1;;;;;3406:17:3;3316:114;:::o;12884:658::-;12984:7;13027:1;13015:9;;:13;13007:30;;;;-1:-1:-1;;;13007:30:3;;;;;;;:::i;:::-;13062:16;:14;:16::i;:::-;13055:3;:23;;13047:47;;;;-1:-1:-1;;;13047:47:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;13132:29:3;;13104:25;13132:29;;;:22;:29;;;;;;:34;:126;;-1:-1:-1;;;;;13229:29:3;;;;;;:22;:29;;;;;;13132:126;;;13181:33;13212:1;13181:12;;;;;;;;;-1:-1:-1;;;;;13181:12:3;-1:-1:-1;;;;;13181:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;13104:154;;13280:32;13302:9;;13280:17;:21;;:32;;;;:::i;:::-;13274:3;:38;13268:80;;13336:1;13329:8;;;;;13268:80;13365:8;;;:19;;;-1:-1:-1;;;13365:19:3;;;;-1:-1:-1;;;;;13365:8:3;;;;:17;;:19;;;;;;;;;;;;:8;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13357:49;;;;-1:-1:-1;;;13357:49:3;;;;;;;:::i;:::-;13424:12;;;;;;;;;-1:-1:-1;;;;;13424:12:3;-1:-1:-1;;;;;13424:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13416:57;;;;-1:-1:-1;;;13416:57:3;;;;;;;:::i;:::-;13490:45;13505:3;13510:5;13517:17;13490:14;:45::i;:::-;13483:52;;;12884:658;;;;;:::o;8814:95::-;8860:7;8886:16;:14;:16::i;:::-;8879:23;;8814:95;:::o;13548:278::-;-1:-1:-1;;;;;13685:29:3;;13643:7;13685:29;;;:22;:29;;;;;;:34;:134;;-1:-1:-1;;;;;13790:29:3;;;;;;:22;:29;;;;;;13685:134;;;13738:33;13769:1;13738:12;;;;;;;;;-1:-1:-1;;;;;13738:12:3;-1:-1:-1;;;;;13738:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7027:267;7116:5;;-1:-1:-1;;;;;7116:5:3;7102:10;:19;7094:41;;;;-1:-1:-1;;;7094:41:3;;;;;;;:::i;:::-;7171:12;;;-1:-1:-1;;;;;7193:30:3;;;-1:-1:-1;;;;;;7193:30:3;;;;;;7238:49;;7171:12;;;7238:49;;;;7171:12;;7208:15;;7238:49;:::i;8155:105::-;8244:8;;-1:-1:-1;;;;;8244:8:3;8155:105;:::o;8385:103::-;8473:7;;-1:-1:-1;;;;;8473:7:3;8385:103;:::o;10440:632::-;10521:1;10512:6;:10;10504:27;;;;-1:-1:-1;;;10504:27:3;;;;;;;:::i;:::-;10549:8;;;:29;;-1:-1:-1;;;10549:29:3;;-1:-1:-1;;;;;10549:8:3;;;;:22;;:29;;10572:5;;10549:29;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10541:55;;;;-1:-1:-1;;;10541:55:3;;;;;;;:::i;:::-;10607:18;10628:16;:14;:16::i;:::-;10607:37;;10654:67;10676:10;10688:5;10695:6;10703:5;10710:10;10654:21;:67::i;:::-;10731:50;10748:5;10755:6;10763:5;10770:10;10731:16;:50::i;:::-;-1:-1:-1;;;;;10796:12:3;;10792:274;;10824:27;;:10;;:27;;;;;10844:6;;10824:27;;;;10844:6;10824:10;:27;;;;;;;;;;;;;;;;;;;;;10901:10;10881;-1:-1:-1;;;;;10870:42:3;;10893:6;10870:42;;;;;;:::i;:::-;;;;;;;;10792:274;;;10943:42;;-1:-1:-1;;;10943:42:3;;-1:-1:-1;;;;;10943:22:3;;;;;:42;;10966:10;;10978:6;;10943:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11044:10;11029:5;-1:-1:-1;;;;;11004:51:3;11017:10;-1:-1:-1;;;;;11004:51:3;;11036:6;11004:51;;;;;;:::i;:::-;;;;;;;;10792:274;10440:632;;;:::o;8915:685::-;8979:1;8967:9;:13;8959:30;;;;-1:-1:-1;;;8959:30:3;;;;;;;:::i;:::-;9007:8;;;:27;;-1:-1:-1;;;9007:27:3;;-1:-1:-1;;;;;9007:8:3;;;;:22;;:27;;:8;;:27;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8999:53;;;;-1:-1:-1;;;8999:53:3;;;;;;;:::i;:::-;9062:18;9083:16;:14;:16::i;:::-;9062:37;;9109:16;9128:12;;;;;;;;;-1:-1:-1;;;;;9128:12:3;-1:-1:-1;;;;;9128:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9109:45;;9164:17;9184:12;;;;;;;;;-1:-1:-1;;;;;9184:12:3;-1:-1:-1;;;;;9184:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9164:46;;9220:12;9235:37;9251:10;9263:8;9235:15;:37::i;:::-;9220:52;;9298:9;9290:4;:17;;9282:42;;;;-1:-1:-1;;;9282:42:3;;;;;;;:::i;:::-;9342:12;;:38;;-1:-1:-1;;;9342:38:3;;-1:-1:-1;;;;;9342:12:3;;;;:26;;:38;;9369:10;;9342:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9334:64;;;;-1:-1:-1;;;9334:64:3;;;;;;;:::i;:::-;9408:67;9430:10;1359:1;9447:9;9458:4;9464:10;9408:21;:67::i;:::-;9485:50;1359:1;9507:9;9518:4;9524:10;9485:16;:50::i;:::-;9582:10;9559;-1:-1:-1;;;;;9550:43:3;;9571:9;9550:43;;;;;;:::i;:::-;;;;;;;;8915:685;;;;:::o;4809:118::-;4874:4;4897:23;4912:7;4897:14;:23::i;9606:828::-;9690:1;9681:6;:10;9673:27;;;;-1:-1:-1;;;9673:27:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;9718:12:3;;9710:36;;;;-1:-1:-1;;;9710:36:3;;;;;;;:::i;:::-;9764:8;;;:29;;-1:-1:-1;;;9764:29:3;;-1:-1:-1;;;;;9764:8:3;;;;:22;;:29;;9787:5;;9764:29;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9756:55;;;;-1:-1:-1;;;9756:55:3;;;;;;;:::i;:::-;9821:61;;-1:-1:-1;;;9821:61:3;;-1:-1:-1;;;;;9821:26:3;;;;;:61;;9848:10;;9868:4;;9875:6;;9821:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9892:18;9913:16;:14;:16::i;:::-;9892:37;;9939:16;9958:12;;;;;;;;;-1:-1:-1;;;;;9958:12:3;-1:-1:-1;;;;;9958:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9939:45;;9994:17;10014:12;;;;;;;;;-1:-1:-1;;;;;10014:12:3;-1:-1:-1;;;;;10014:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9994:46;;10050:12;10065:37;10081:10;10093:8;10065:15;:37::i;:::-;10050:52;;10128:9;10120:4;:17;;10112:42;;;;-1:-1:-1;;;10112:42:3;;;;;;;:::i;:::-;10172:12;;:38;;-1:-1:-1;;;10172:38:3;;-1:-1:-1;;;;;10172:12:3;;;;:26;;:38;;10199:10;;10172:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10164:64;;;;-1:-1:-1;;;10164:64:3;;;;;;;:::i;:::-;10238:66;10260:10;10272:5;10279:6;10287:4;10293:10;10238:21;:66::i;:::-;10314:49;10331:5;10338:6;10346:4;10352:10;10314:16;:49::i;:::-;10416:10;10401:5;-1:-1:-1;;;;;10378:49:3;10389:10;-1:-1:-1;;;;;10378:49:3;;10408:6;10378:49;;;;;;:::i;:::-;;;;;;;;9606:828;;;;;;:::o;8266:113::-;8359:12;;-1:-1:-1;;;;;8359:12:3;8266:113;:::o;6373:94::-;6417:16;6452:8;6445:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6445:15:3;;;;;;;;;;;;;;;;;;;;;;6373:94;:::o;5931:436::-;6026:5;;-1:-1:-1;;;;;6026:5:3;6012:10;:19;6004:41;;;;-1:-1:-1;;;6004:41:3;;;;;;;:::i;:::-;6063:12;;:37;;-1:-1:-1;;;6063:37:3;;-1:-1:-1;;;;;6063:12:3;;;;:28;;:37;;6092:7;;6063:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6055:63;;;;-1:-1:-1;;;6055:63:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;6136:21:3;;6128:58;;;;-1:-1:-1;;;6128:58:3;;;;;;;:::i;:::-;6205:23;6220:7;6205:14;:23::i;:::-;6204:24;6196:51;;;;-1:-1:-1;;;6196:51:3;;;;;;;:::i;:::-;6257:8;:22;;;;;;;;;;;;;-1:-1:-1;;;;;;6257:22:3;-1:-1:-1;;;;;6257:22:3;;;;;;;;-1:-1:-1;6289:20:3;;;:11;6257:22;6289:20;;;;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6347:7;-1:-1:-1;;;;;6334:26:3;;6356:3;6334:26;;;;;;:::i;14243:496::-;-1:-1:-1;;;;;14501:21:3;;;14402:7;14501:21;;;:14;:21;;;;;;;;:28;;;;;;;;;;;14476:53;;;;;;;;;;;;;;;;;14402:7;;;;;;14476:22;;14501:28;14476:53;;;14501:28;14476:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;14567:24:3;;;;;;;:17;:24;;;;;;;;:31;;;;;;;;;;;;14539:59;;;;;;;;;;;;;;;;;14476:53;;-1:-1:-1;14539:25:3;;:59;;-1:-1:-1;14567:31:3;-1:-1:-1;14539:59:3;;14567:31;14539:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;14640:28:3;;;;;;;:21;:28;;;;;;;;:35;;;;;;;;;;;;14608:67;;;;;;;;;;;;;;;;;14539:59;;-1:-1:-1;14608:29:3;;:67;;-1:-1:-1;14640:35:3;-1:-1:-1;14608:67:3;;14640:35;14608:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14692:40;14697:5;14704:8;14714:12;14728:3;14692:4;:40::i;:::-;14685:47;;;;;;;;;14243:496;;;;;;;:::o;7718:90::-;7796:5;;-1:-1:-1;;;;;7796:5:3;7718:90;:::o;3436:374::-;3569:10;;-1:-1:-1;;;;;3569:10:3;3555;:24;:52;;;;-1:-1:-1;3583:10:3;:24;;3555:52;3534:113;;;;-1:-1:-1;;;3534:113:3;;;;;;;:::i;:::-;3679:3;3665:10;:17;;3657:46;;;;-1:-1:-1;;;3657:46:3;;;;;;;:::i;:::-;3713:21;:34;;;3762:41;;;;;;3737:10;;3762:41;:::i;:::-;;;;;;;;3436:374;:::o;2504:182::-;2554:10;;-1:-1:-1;;;;;2554:10:3;:24;2546:59;;;;-1:-1:-1;;;2546:59:3;;;;;;;:::i;:::-;2615:10;:64;;-1:-1:-1;;;;;;2615:64:3;2636:42;2615:64;;;2504:182::o;3816:247::-;3908:10;;-1:-1:-1;;;;;3908:10:3;3894;:24;:52;;;;-1:-1:-1;3922:10:3;:24;;3894:52;3873:113;;;;-1:-1:-1;;;3873:113:3;;;;;;;:::i;:::-;4016:1;4004:8;:13;;3996:30;;;;-1:-1:-1;;;3996:30:3;;;;;;;:::i;:::-;4036:9;:20;3816:247::o;4458:345::-;4650:8;;;:29;;-1:-1:-1;;;4650:29:3;;4568:7;;;;;;-1:-1:-1;;;;;4650:8:3;;;;:22;;:29;;4673:5;;4650:29;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4642:55;;;;-1:-1:-1;;;4642:55:3;;;;;;;:::i;:::-;4722:16;:14;:16::i;:::-;4715:3;:23;;4707:47;;;;-1:-1:-1;;;4707:47:3;;;;;;;:::i;:::-;4771:25;4785:5;4792:3;4771:13;:25::i;:::-;4764:32;;;;;;4458:345;;;;;:::o;8494:100::-;8577:10;;-1:-1:-1;;;;;8577:10:3;8494:100;:::o;4069:87::-;4140:9;;4069:87;:::o;8600:119::-;8664:7;8690:22;;;:17;:22;;;;;;;8600:119::o;13832:405::-;14072:8;;;:29;;-1:-1:-1;;;14072:29:3;;13990:7;;;;;;-1:-1:-1;;;;;14072:8:3;;;;:22;;:29;;14095:5;;14072:29;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14064:55;;;;-1:-1:-1;;;14064:55:3;;;;;;;:::i;:::-;14144:16;:14;:16::i;:::-;14137:3;:23;;14129:47;;;;-1:-1:-1;;;14129:47:3;;;;;;;:::i;:::-;14193:37;14212:5;14219;14226:3;14193:18;:37::i;:::-;14186:44;;;;;;13832:405;;;;;;;:::o;7814:104::-;7899:12;;-1:-1:-1;;;;;7899:12:3;7814:104;:::o;7924:113::-;8017:12;;-1:-1:-1;;;;;8017:12:3;7924:113;:::o;11078:597::-;11135:1;11123:9;;:13;11115:30;;;;-1:-1:-1;;;11115:30:3;;;;;;;:::i;:::-;11155:18;11176:16;:14;:16::i;:::-;11253:10;11202:25;11230:34;;;:22;:34;;;;;;11155:37;;-1:-1:-1;11202:25:3;11230:39;:136;;11355:10;11332:34;;;;:22;:34;;;;;;11230:136;;2692:247;2804:10;;-1:-1:-1;;;;;2804:10:3;2790;:24;:52;;;;-1:-1:-1;2818:10:3;:24;;2790:52;2769:113;;;;-1:-1:-1;;;2769:113:3;;;;;;;:::i;:::-;2892:17;:40;;-1:-1:-1;;;;;;2892:40:3;-1:-1:-1;;;;;2892:40:3;;;;;;;;;;2692:247::o;5812:113::-;5897:21;;5812:113;:::o;2945:259::-;3025:17;;-1:-1:-1;;;;;3025:17:3;3011:10;:31;:59;;;;-1:-1:-1;3046:10:3;:24;;3011:59;2990:127;;;;-1:-1:-1;;;2990:127:3;;;;;;;:::i;:::-;3140:17;;;3127:10;:30;;-1:-1:-1;;;;;;3127:30:3;;;-1:-1:-1;;;;;3140:17:3;;3127:30;;;;3167;;;2945:259::o;12258:620::-;12320:7;12359:1;12347:9;;:13;12339:30;;;;-1:-1:-1;;;12339:30:3;;;;;;;:::i;:::-;12379:18;12400:16;:14;:16::i;:::-;-1:-1:-1;;;;;12454:29:3;;12426:25;12454:29;;;:22;:29;;;;;;12379:37;;-1:-1:-1;12426:25:3;12454:34;:126;;-1:-1:-1;;;;;12551:29:3;;;;;;:22;:29;;;;;;12454:126;;;12503:33;12534:1;12503:12;;;;;;;;;-1:-1:-1;;;;;12503:12:3;-1:-1:-1;;;;;12503:24:3;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;12426:154;;12609:32;12631:9;;12609:17;:21;;:32;;;;:::i;:::-;12596:10;:45;12590:87;;12665:1;12658:8;;;;;;12590:87;12694:8;;;:19;;;-1:-1:-1;;;12694:19:3;;;;-1:-1:-1;;;;;12694:8:3;;;;:17;;:19;;;;;;;;;;;;:8;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12686:49;;;;-1:-1:-1;;;12686:49:3;;;;;;;:::i;:::-;12753:12;;;;;;;;;-1:-1:-1;;;;;12753:12:3;-1:-1:-1;;;;;12753:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12745:57;;;;-1:-1:-1;;;12745:57:3;;;;;;;:::i;:::-;12819:52;12834:10;12846:5;12853:17;12819:14;:52::i;:::-;12812:59;12258:620;-1:-1:-1;;;;12258:620:3:o;4933:873::-;5022:1;5013:6;:10;5005:27;;;;-1:-1:-1;;;5005:27:3;;;;;;;:::i;:::-;5072:12;;-1:-1:-1;;;;;5072:12:3;5050:10;:35;5042:64;;;;-1:-1:-1;;;5042:64:3;;;;;;;:::i;:::-;5116:11;;5149:12;;5116:70;;-1:-1:-1;;;5116:70:3;;-1:-1:-1;;;;;5116:11:3;;;;:24;;:70;;5149:12;;;5172:4;;5179:6;;5116:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5196:18;5217:3;5196:24;;5230:21;5254:104;5347:10;5254:75;5322:6;5254:50;5282:21;;5254:10;:27;;:50;;;;:::i;:::-;:67;;:75::i;:::-;:92;;:104::i;:::-;5405:7;;:78;;-1:-1:-1;;;5405:78:3;;5230:128;;-1:-1:-1;5373:28:3;;-1:-1:-1;;;;;5405:7:3;;;;:24;;:78;;5451:4;;5470:3;;5405:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5368:115;-1:-1:-1;;;5497:25:3;;;;;:47;;-1:-1:-1;5526:18:3;;;5497:47;5493:245;;;5560:22;;;;:17;:22;;;;;;;:38;;;5612:11;;5640:7;;5612:52;;-1:-1:-1;;;5612:52:3;;-1:-1:-1;;;;;5612:11:3;;;;:19;;:52;;5640:7;;;5585:13;;5612:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;5678:7:3;;:49;;-1:-1:-1;;;5678:49:3;;-1:-1:-1;;;;;5678:7:3;;;;:29;;:49;;5708:3;;5713:13;;5678:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5493:245;5768:3;5752:47;5773:25;:6;5784:13;5773:10;:25::i;:::-;5752:47;;;;;;:::i;:::-;;;;;;;;4933:873;;;;;:::o;4162:290::-;4260:10;;-1:-1:-1;;;;;4260:10:3;4246;:24;4238:51;;;;-1:-1:-1;;;4238:51:3;;;;;;;:::i;23041:125::-;-1:-1:-1;;;;;23128:20:3;23105:4;23128:20;;;:11;:20;;;;;:27;:31;;;23041:125::o;23172:412::-;23282:4;;23302:254;-1:-1:-1;;;;;23326:20:3;;;;;;:11;:20;;;;;:27;23322:31;;23302:254;;;-1:-1:-1;;;;;23462:20:3;;;;;;:11;:20;;;;;:23;;23483:1;;23462:23;;;;;;;;;;;;;23451:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;23441:46;;;;;;23416:3;23405:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;23395:26;;;;;;:92;23374:172;;;23527:4;23520:11;;;;;23374:172;23355:3;;23302:254;;;-1:-1:-1;23572:5:3;;23172:412;-1:-1:-1;;;23172:412:3:o;23821:116::-;23870:7;23896:34;23928:1;23896:27;:15;23916:6;23896:19;:27::i;:::-;:31;;:34::i;1321:134:1:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;1321:134;-1:-1:-1;;;1321:134:1:o;874:176::-;932:7;963:5;;;986:6;;;;978:46;;;;-1:-1:-1;;;978:46:1;;;;;;;:::i;21025:469:3:-;21149:15;21167:49;21182:7;21191:5;21198:17;21167:14;:49::i;:::-;21149:67;;21244:1;21234:7;:11;21226:34;;;;-1:-1:-1;;;21226:34:3;;;;;;;:::i;:::-;21314:9;;21302:22;;:7;;:11;:22::i;:::-;-1:-1:-1;;;;;21270:29:3;;;;;;;:22;:29;;;;;;;:54;;;;21334:11;;21362:12;;21334:51;;-1:-1:-1;;;21334:51:3;;:11;;;;:19;;:51;;21362:12;;;21377:7;;21334:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21395:12:3;;:36;;-1:-1:-1;;;21395:36:3;;-1:-1:-1;;;;;21395:12:3;;;;:20;;:36;;21416:5;;21423:7;;21395:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21470:16;:14;:16::i;:::-;21454:5;-1:-1:-1;;;;;21446:41:3;;21461:7;21446:41;;;;;;:::i;21500:1535::-;21681:8;;;:20;;;-1:-1:-1;;;21681:20:3;;;;21636:7;;21655:23;;-1:-1:-1;;;;;21681:8:3;;:18;;:20;;;;21636:7;;21681:20;;;;;:8;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21681:20:3;;;;;;;;;;;;:::i;:::-;21655:46;-1:-1:-1;21711:15:3;;21768:24;:17;21790:1;21768:21;:24::i;:::-;21754:38;;21736:1269;21825:9;;21813:22;;:7;;:11;:22::i;:::-;21806:3;:29;21736:1269;;21916:12;;:79;;-1:-1:-1;;;21916:79:3;;21879:34;;-1:-1:-1;;;;;21916:12:3;;:59;;:79;;21984:4;;21991:3;;21916:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21879:116;-1:-1:-1;22013:31:3;22009:78;;22064:8;;;22009:78;22179:8;;;:28;;-1:-1:-1;;;22179:28:3;;22100:30;;22148:28;;-1:-1:-1;;;;;22179:8:3;;:23;;:28;;22203:3;;22179:28;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22179:28:3;;;;;;;;;;;;:::i;:::-;22148:59;;22226:9;22221:426;22245:6;:13;22241:1;:17;22221:426;;;22283:13;22299:6;22306:1;22299:9;;;;;;;;;;;;;;22283:25;;22331:24;22359:115;22399:5;22426;22453:3;22359:18;:115::i;:::-;22326:148;;;;22492:14;22509:46;22550:4;22509:36;22530:11;22542:1;22530:14;;;;;;;;;;;;;;22509:16;:20;;:36;;;;:::i;:46::-;22492:63;-1:-1:-1;22598:34:3;:22;22492:63;22598:26;:34::i;:::-;22573:59;-1:-1:-1;;22260:3:3;;;;;-1:-1:-1;22221:426:3;;-1:-1:-1;22221:426:3;;-1:-1:-1;22660:27:3;22784:22;;;:17;:22;;;;;;;22690:12;;:72;;-1:-1:-1;;;22690:72:3;;:117;;-1:-1:-1;;;;;22690:12:3;;:52;;:72;;22751:4;;22802:3;;22690:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:117;22660:147;-1:-1:-1;22821:14:3;22838:113;22924:26;22838:64;22660:147;22879:22;22838:40;:64::i;:113::-;22821:130;-1:-1:-1;22975:19:3;:7;22821:130;22975:11;:19::i;:::-;22965:29;;21736:1269;;;;;;21849:5;;21736:1269;;;-1:-1:-1;23021:7:3;21500:1535;-1:-1:-1;;;;;21500:1535:3:o;15163:460::-;-1:-1:-1;;;;;15364:21:3;;;15338:23;15364:21;;;:14;:21;;;;;;;;:28;;;;;;;;;;;;15431:24;;;:17;:24;;;;;:31;;;;;;;;15505:28;;;:21;:28;;;;;:35;;;;;;;;;15550:66;15364:28;15431:31;15505:35;15589:6;15597;15605:10;15550:7;:66::i;:::-;15163:460;;;;;;;;:::o;15629:396::-;-1:-1:-1;;;;;15802:16:3;;15776:23;15802:16;;;:9;:16;;;;;;;;15857:12;:19;;;;;15919:16;:23;;;;;15952:66;15802:16;15857:19;15919:23;15991:6;15999;16007:10;15952:7;:66::i;:::-;15629:396;;;;;;;:::o;23590:225::-;23693:7;23723:33;23754:1;23723:26;23745:3;23723:17;:3;23731:8;23723:7;:17::i;16031:837::-;16326:12;;16238:7;;;;;;16352:8;16348:57;;16384:3;16389:1;16392;16376:18;;;;;;;;;16348:57;16424:5;16430:1;16424:8;;;;;;;;;;;;;;16418:3;:14;16414:63;;;16456:3;16461:1;16464;16448:18;;;;;;;;;16414:63;16486:17;16506:10;:3;16514:1;16506:7;:10::i;:::-;16486:30;;16526:20;16549:5;16555:9;16549:16;;;;;;;;;;;;;;16526:39;;16586:12;16579:3;:19;16575:229;;;16622:3;16627:8;16636:9;16627:19;;;;;;;;;;;;;;16648:12;16661:9;16648:23;;;;;;;;;;;;;;16614:58;;;;;;;;;;;16575:229;16699:12;16693:3;:18;16689:115;;;16735:3;16740:8;16749:9;16740:19;;;;;;;;;;;;;;16761:31;16785:6;16761:8;16770:9;16761:19;;;;;;;;;;;;;;:23;;:31;;;;:::i;:::-;16727:66;;;;;;;;;;;16689:115;16820:41;16826:5;16833:8;16843:12;16857:3;16820:5;:41::i;:::-;16813:48;;;;;;;;;16031:837;;;;;;;;;:::o;14745:412::-;-1:-1:-1;;;;;14955:16:3;;14856:7;14955:16;;;:9;:16;;;;;;;;14930:41;;;;;;;;;;;;;;;;;14856:7;;;;14930:22;;:41;;14955:16;;14930:41;;14955:16;14930:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;15009:19:3;;;;;;:12;:19;;;;;;;;;14981:47;;;;;;;;;;;;;;;;;14930:41;;-1:-1:-1;14981:25:3;;:47;;-1:-1:-1;15009:19:3;-1:-1:-1;14981:47:3;;15009:19;14981:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;15070:23:3;;;;;;:16;:23;;;;;;;;;15038:55;;;;;;;;;;;;;;;;;14981:47;;-1:-1:-1;15038:29:3;;:55;;-1:-1:-1;15070:23:3;-1:-1:-1;15038:55:3;;15070:23;15038:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15110:40;15115:5;15122:8;15132:12;15146:3;15110:4;:40::i;:::-;15103:47;;;;;;;;;14745:412;;;;;:::o;2180:459:1:-;2238:7;2479:6;2475:45;;-1:-1:-1;2508:1:1;2501:8;;2475:45;2542:5;;;2546:1;2542;:5;:1;2565:5;;;;;:10;2557:56;;;;-1:-1:-1;;;2557:56:1;;;;;;;:::i;3101:130::-;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;1746:187::-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:1;;;;;;;;:::i;:::-;-1:-1:-1;;;1902:5:1;;;1746:187::o;18498:2521:3:-;18736:12;;18782:6;18831:15;:31;;;18722:11;18903:63;18782:6;18831:31;18903:17;:63::i;:::-;18872:94;-1:-1:-1;18981:8:3;18977:2036;;19009:6;19005:250;;;19035:22;;;;;;;;-1:-1:-1;19035:22:3;;;;;;;;;;;;;19075:21;;;;;;;;;;;;;;;;;;19114:12;19132:32;19089:6;19143:20;19132:10;:32::i;:::-;19114:51;;;;;;;-1:-1:-1;19114:51:3;;;;;;;;;;;19005:250;;;19204:36;;-1:-1:-1;;;19204:36:3;;;;;;;:::i;:::-;18977:2036;;;19285:17;19305:10;:3;19313:1;19305:7;:10::i;:::-;19285:30;;19329:20;19352:5;19358:9;19352:16;;;;;;;;;;;;;;;;19329:39;;19382:23;19408:8;19417:9;19408:19;;;;;;;;;;;;;;;;19382:45;;19441:23;19467:12;19480:9;19467:23;;;;;;;;;;;;;;;;19441:49;;19505:17;19536:22;19593:10;19577:12;:26;19573:1430;;;19627:6;19623:532;;;19669:27;:15;19689:6;19669:19;:27::i;:::-;19657:39;-1:-1:-1;19735:99:3;19780:32;:6;19791:20;19780:10;:32::i;:::-;19735:15;;:19;:99::i;:::-;19718:116;;19623:532;;;19908:6;19889:15;:25;;19881:56;;;;-1:-1:-1;;;19881:56:3;;;;;;;:::i;:::-;19971:27;:15;19991:6;19971:19;:27::i;:::-;19959:39;-1:-1:-1;20037:99:3;20082:32;:6;20093:20;20082:10;:32::i;:::-;20037:15;;:19;:99::i;:::-;20020:116;;19623:532;20194:9;20172:8;20181:9;20172:19;;;;;;;;;;;;;;;:31;;;;20247:14;20221:12;20234:9;20221:23;;;;;;;;;;;;;;;;;:40;19573:1430;;;20304:6;20300:556;;;20346:27;:15;20366:6;20346:19;:27::i;:::-;20334:39;-1:-1:-1;20412:111:3;20469:32;:6;20480:20;20469:10;:32::i;:::-;20412:27;:15;20432:6;20412:19;:27::i;:111::-;20395:128;;20300:556;;;20597:6;20578:15;:25;;20570:56;;;;-1:-1:-1;;;20570:56:3;;;;;;;:::i;:::-;20660:27;:15;20680:6;20660:19;:27::i;:::-;20648:39;-1:-1:-1;20726:111:3;20783:32;:6;20794:20;20783:10;:32::i;:::-;20726:27;:15;20746:6;20726:19;:27::i;:111::-;20709:128;;20300:556;20873:5;20884:10;20873:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20913:8;20927:9;20913:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20955:12;20973:14;20955:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19573:1430;18977:2036;;;;;;;18498:2521;;;;;;;;;;:::o;16874:1618::-;17082:7;17103;17124;17156:12;17171:1;17156:16;;17182:13;17198:19;17215:1;17198:5;:12;:16;;:19;;;;:::i;:::-;17182:35;-1:-1:-1;17227:14:3;17244:22;17264:1;17244:15;17182:35;17254:4;17244:9;:15::i;:22::-;17227:39;;17276:1049;17290:5;17283:4;:12;17276:1049;;;17332:3;17315:5;17321:6;17315:13;;;;;;;;;;;;;;:20;17311:959;;;17363:3;17368:8;17377:6;17368:16;;;;;;;;;;;;;;17386:12;17399:6;17386:20;;;;;;;17311:959;17448:3;17432:5;17438:6;17432:13;;;;;;;;;;;;;;:19;17428:842;;;17484:1;17475:6;:10;:40;;;;-1:-1:-1;17512:3:3;17489:5;17495:13;:6;17506:1;17495:10;:13::i;:::-;17489:20;;;;;;;;;;;;;;:26;17475:40;17471:255;;;17572:3;17601:8;17610:13;:6;17621:1;17610:10;:13::i;:::-;17601:23;;;;;;;;;;;;;;17650:35;17678:6;17650:8;17659:13;17670:1;17659:6;:10;;:13;;;;:::i;:::-;17650:23;;;;;;;17471:255;17747:11;17743:76;;17790:3;17795:1;17798;17782:18;;;;;;;;;;;17743:76;17844:13;:6;17855:1;17844:10;:13::i;:::-;17836:21;;17428:842;;;17898:3;17882:5;17888:6;17882:13;;;;;;;;;;;;;;:19;17878:392;;;17955:12;;:19;;17972:1;17955:16;:19::i;:::-;17946:6;:28;:58;;;;-1:-1:-1;18001:3:3;17978:5;17984:13;:6;17995:1;17984:10;:13::i;:::-;17978:20;;;;;;;;;;;;;;:26;17946:58;17921:297;;;18078:3;18107:8;18116:6;18107:16;;;;;;;;;;;;;;18149:28;18170:6;18149:8;18158:6;18149:16;;;;;;;17921:297;18242:13;:6;18253:1;18242:10;:13::i;:::-;18235:20;;17878:392;18292:22;18312:1;18292:15;:5;18302:4;18292:9;:15::i;:22::-;18283:31;;17276:1049;;;18355:3;18338:5;18344:6;18338:13;;;;;;;;;;;;;;:20;18334:152;;18382:3;18387:1;18390;18374:18;;;;;;;;;;;18334:152;18431:3;18436:8;18445:6;18436:16;;;;;;;3713:272:1;3799:7;3833:12;3826:5;3818:28;;;;-1:-1:-1;;;3818:28:1;;;;;;;;:::i;:::-;;3856:9;3872:1;3868;:5;;;;;;;3713:272;-1:-1:-1;;;;;3713:272:1:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;2643:241;;2747:2;2735:9;2726:7;2722:23;2718:32;2715:2;;;-1:-1;;2753:12;2715:2;85:6;72:20;97:33;124:5;97:33;:::i;2891:491::-;;;;3029:2;3017:9;3008:7;3004:23;3000:32;2997:2;;;-1:-1;;3035:12;2997:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3087:63;-1:-1;3187:2;3226:22;;72:20;97:33;72:20;97:33;:::i;:::-;2991:391;;3195:63;;-1:-1;;;3295:2;3334:22;;;;2432:20;;2991:391::o;3389:472::-;;;3520:2;3508:9;3499:7;3495:23;3491:32;3488:2;;;-1:-1;;3526:12;3488:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3578:63;-1:-1;3706:2;3691:18;;;3678:32;3730:18;3719:30;;;3716:2;;;-1:-1;;3752:12;3716:2;3828:6;3817:9;3813:22;;;2017:3;2010:4;2002:6;1998:17;1994:27;1984:2;;-1:-1;;2025:12;1984:2;2072:6;2059:20;3730:18;37680:6;37677:30;37674:2;;;-1:-1;;37710:12;37674:2;2094:65;37783:9;37764:17;;-1:-1;;37760:33;37841:15;;2094:65;:::i;:::-;2085:74;;2179:6;2172:5;2165:21;2283:3;3706:2;2274:6;2207;2265:16;;2262:25;2259:2;;;-1:-1;;2290:12;2259:2;40607:6;3706:2;2207:6;2203:17;3706:2;2241:5;2237:16;40584:30;40645:16;;;;;40638:27;;;;3482:379;;2241:5;;-1:-1;3482:379;;-1:-1;;3482:379::o;3868:366::-;;;3989:2;3977:9;3968:7;3964:23;3960:32;3957:2;;;-1:-1;;3995:12;3957:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4047:63;4147:2;4186:22;;;;2432:20;;-1:-1;;;3951:283::o;4241:392::-;;4381:2;;4369:9;4360:7;4356:23;4352:32;4349:2;;;-1:-1;;4387:12;4349:2;4438:17;4432:24;4476:18;4468:6;4465:30;4462:2;;;-1:-1;;4498:12;4462:2;4585:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;4518:99;4343:290;-1:-1;;;;;;;4343:290::o;4640:392::-;;4780:2;;4768:9;4759:7;4755:23;4751:32;4748:2;;;-1:-1;;4786:12;4748:2;4837:17;4831:24;4875:18;4867:6;4864:30;4861:2;;;-1:-1;;4897:12;4861:2;4984:22;;1170:4;1158:17;;1154:27;-1:-1;1144:2;;-1:-1;;1185:12;1144:2;1225:6;1219:13;1247:80;1262:64;1319:6;1262:64;:::i;1247:80::-;1355:21;;;1412:14;;;;1387:17;;;1501;;;1492:27;;;;1489:36;-1:-1;1486:2;;;-1:-1;;1528:12;1486:2;-1:-1;1554:10;;1548:217;1573:6;1570:1;1567:13;1548:217;;;2580:13;;1641:61;;1595:1;1588:9;;;;;1716:14;;;;1744;;1548:217;;5039:257;;5151:2;5139:9;5130:7;5126:23;5122:32;5119:2;;;-1:-1;;5157:12;5119:2;1860:6;1854:13;41266:5;39913:13;39906:21;41244:5;41241:32;41231:2;;-1:-1;;41277:12;5303:241;;5407:2;5395:9;5386:7;5382:23;5378:32;5375:2;;;-1:-1;;5413:12;5375:2;-1:-1;2432:20;;5369:175;-1:-1;5369:175::o;5551:263::-;;5666:2;5654:9;5645:7;5641:23;5637:32;5634:2;;;-1:-1;;5672:12;5634:2;-1:-1;2580:13;;5628:186;-1:-1;5628:186::o;5821:366::-;;;5942:2;5930:9;5921:7;5917:23;5913:32;5910:2;;;-1:-1;;5948:12;5910:2;2445:6;2432:20;6000:63;;6100:2;6143:9;6139:22;72:20;97:33;124:5;97:33;:::i;:::-;6108:63;;;;5904:283;;;;;:::o;6194:366::-;;;6315:2;6303:9;6294:7;6290:23;6286:32;6283:2;;;-1:-1;;6321:12;6283:2;-1:-1;;2432:20;;;6473:2;6512:22;;;2432:20;;-1:-1;6277:283::o;6567:535::-;;;;6716:2;6704:9;6695:7;6691:23;6687:32;6684:2;;;-1:-1;;6722:12;6684:2;2586:6;2580:13;6774:74;;6885:2;6939:9;6935:22;2580:13;6893:74;;7004:2;7058:9;7054:22;2580:13;7012:74;;6678:424;;;;;:::o;9677:327::-;;9812:5;38467:12;39162:6;39157:3;39150:19;-1:-1;40752:101;40766:6;40763:1;40760:13;40752:101;;;39199:4;40833:11;;;;;40827:18;40814:11;;;;;40807:39;40781:10;40752:101;;;40868:6;40865:1;40862:13;40859:2;;;-1:-1;39199:4;40924:6;39194:3;40915:16;;40908:27;40859:2;-1:-1;37783:9;41024:14;-1:-1;;41020:28;9960:39;;;;39199:4;9960:39;;9759:245;-1:-1;;9759:245::o;20151:222::-;-1:-1;;;;;40001:54;;;;7703:37;;20278:2;20263:18;;20249:124::o;20625:460::-;-1:-1;;;;;40001:54;;;7572:58;;40001:54;;;;20988:2;20973:18;;7703:37;21071:2;21056:18;;20102:37;;;;20816:2;20801:18;;20787:298::o;21092:349::-;-1:-1;;;;;40001:54;;;;7572:58;;21427:2;21412:18;;20102:37;21255:2;21240:18;;21226:215::o;21448:333::-;-1:-1;;;;;40001:54;;;7703:37;;40001:54;;21767:2;21752:18;;7703:37;21603:2;21588:18;;21574:207::o;22579:370::-;22756:2;22770:47;;;38467:12;;22741:18;;;39150:19;;;22579:370;;22756:2;37988:14;;;;39190;;;;22579:370;8311:260;8336:6;8333:1;8330:13;8311:260;;;8397:13;;-1:-1;;;;;40001:54;7703:37;;38880:14;;;;7263;;;;3730:18;8351:9;8311:260;;;-1:-1;22823:116;;22727:222;-1:-1;;;;;;22727:222::o;22956:410::-;;23153:2;;23142:9;23138:18;23153:2;23174:17;23167:47;23228:128;8853:5;38467:12;39162:6;39157:3;39150:19;39190:14;23142:9;39190:14;8865:103;;39190:14;23153:2;9025:6;9021:17;23142:9;9012:27;;9000:39;;23153:2;9120:5;37988:14;-1:-1;9159:360;9184:6;9181:1;9178:13;9159:360;;;9236:20;;23142:9;9240:4;9236:20;;9231:3;9224:33;7413:66;7475:3;9291:6;9285:13;7413:66;:::i;:::-;9305:92;-1:-1;9498:14;;;;38880;;;;9206:1;9199:9;9159:360;;;-1:-1;23220:136;;23124:242;-1:-1;;;;;;;23124:242::o;23373:210::-;39913:13;;39906:21;9631:34;;23494:2;23479:18;;23465:118::o;23590:310::-;;23737:2;23758:17;23751:47;23812:78;23737:2;23726:9;23722:18;23876:6;23812:78;:::i;23907:304::-;;24051:2;;24040:9;24036:18;24051:2;24072:17;24065:47;-1:-1;10509:5;10503:12;10543:1;;10532:9;10528:17;10556:1;10551:248;;;;10810:1;10805:402;;;;10521:686;;10551:248;10625:1;10610:17;;10629:4;10606:28;39150:19;;-1:-1;;10738:25;;39190:14;;;10726:38;10778:14;;;;-1:-1;10551:248;;10805:402;10874:1;10863:9;10859:17;39162:6;39157:3;39150:19;10983:38;11015:5;10983:38;:::i;:::-;-1:-1;11045:130;11059:6;11056:1;11053:13;11045:130;;;11118:14;;11105:11;;;39190:14;11105:11;11098:35;11152:15;;;;11074:12;;11045:130;;;11189:11;;39190:14;11189:11;;-1:-1;;;10521:686;-1:-1;24118:83;;24022:189;-1:-1;;;;;;;24022:189::o;24218:416::-;24418:2;24432:47;;;11446:2;24403:18;;;39150:19;-1:-1;;;39190:14;;;11462:36;11517:12;;;24389:245::o;24641:416::-;24841:2;24855:47;;;11768:2;24826:18;;;39150:19;-1:-1;;;39190:14;;;11784:41;11844:12;;;24812:245::o;25064:416::-;25264:2;25278:47;;;12095:2;25249:18;;;39150:19;-1:-1;;;39190:14;;;12111:34;12164:12;;;25235:245::o;25487:416::-;25687:2;25701:47;;;12415:2;25672:18;;;39150:19;-1:-1;;;39190:14;;;12431:38;12488:12;;;25658:245::o;25910:416::-;26110:2;26124:47;;;12739:2;26095:18;;;39150:19;-1:-1;;;39190:14;;;12755:39;12813:12;;;26081:245::o;26333:416::-;26533:2;26547:47;;;13064:1;26518:18;;;39150:19;-1:-1;;;39190:14;;;13079:27;13125:12;;;26504:245::o;26756:416::-;26956:2;26970:47;;;13376:2;26941:18;;;39150:19;-1:-1;;;39190:14;;;13392:41;13452:12;;;26927:245::o;27179:416::-;27379:2;27393:47;;;13703:2;27364:18;;;39150:19;13739:29;39190:14;;;13719:50;13788:12;;;27350:245::o;27602:416::-;27802:2;27816:47;;;14039:2;27787:18;;;39150:19;-1:-1;;;39190:14;;;14055:38;14112:12;;;27773:245::o;28025:416::-;28225:2;28239:47;;;14363:2;28210:18;;;39150:19;-1:-1;;;39190:14;;;14379:41;14439:12;;;28196:245::o;28448:416::-;28648:2;28662:47;;;14690:2;28633:18;;;39150:19;-1:-1;;;39190:14;;;14706:39;14764:12;;;28619:245::o;28871:416::-;29071:2;29085:47;;;15015:2;29056:18;;;39150:19;-1:-1;;;39190:14;;;15031:44;15094:12;;;29042:245::o;29294:416::-;29494:2;29508:47;;;15345:2;29479:18;;;39150:19;-1:-1;;;39190:14;;;15361:35;15415:12;;;29465:245::o;29717:416::-;29917:2;29931:47;;;15666:2;29902:18;;;39150:19;-1:-1;;;39190:14;;;15682:33;15734:12;;;29888:245::o;30140:416::-;30340:2;30354:47;;;15985:2;30325:18;;;39150:19;-1:-1;;;39190:14;;;16001:45;16065:12;;;30311:245::o;30563:416::-;30763:2;30777:47;;;16316:2;30748:18;;;39150:19;-1:-1;;;39190:14;;;16332:37;16388:12;;;30734:245::o;30986:416::-;31186:2;31200:47;;;16639:2;31171:18;;;39150:19;-1:-1;;;39190:14;;;16655:40;16714:12;;;31157:245::o;31409:416::-;31609:2;31623:47;;;16965:2;31594:18;;;39150:19;17001:34;39190:14;;;16981:55;-1:-1;;;17056:12;;;17049:25;17093:12;;;31580:245::o;31832:416::-;32032:2;32046:47;;;17344:2;32017:18;;;39150:19;-1:-1;;;39190:14;;;17360:36;17415:12;;;32003:245::o;32255:416::-;32455:2;32469:47;;;17666:2;32440:18;;;39150:19;-1:-1;;;39190:14;;;17682:33;17734:12;;;32426:245::o;32678:416::-;32878:2;32892:47;;;17985:2;32863:18;;;39150:19;-1:-1;;;39190:14;;;18001:37;18057:12;;;32849:245::o;33101:416::-;33301:2;33315:47;;;18308:2;33286:18;;;39150:19;-1:-1;;;39190:14;;;18324:34;18377:12;;;33272:245::o;33524:416::-;33724:2;33738:47;;;18628:2;33709:18;;;39150:19;-1:-1;;;39190:14;;;18644:44;18707:12;;;33695:245::o;33947:416::-;34147:2;34161:47;;;18958:2;34132:18;;;39150:19;-1:-1;;;39190:14;;;18974:37;19030:12;;;34118:245::o;34370:416::-;34570:2;34584:47;;;19281:1;34555:18;;;39150:19;-1:-1;;;39190:14;;;19296:32;19347:12;;;34541:245::o;34793:416::-;34993:2;35007:47;;;19598:2;34978:18;;;39150:19;-1:-1;;;39190:14;;;19614:39;19672:12;;;34964:245::o;35216:416::-;35416:2;35430:47;;;19923:2;35401:18;;;39150:19;19959:26;39190:14;;;19939:47;20005:12;;;35387:245::o;35639:222::-;20102:37;;;35766:2;35751:18;;35737:124::o;35868:333::-;20102:37;;;36187:2;36172:18;;20102:37;36023:2;36008:18;;35994:207::o;36208:444::-;20102:37;;;36555:2;36540:18;;20102:37;;;;36638:2;36623:18;;20102:37;36391:2;36376:18;;36362:290::o;36659:256::-;36721:2;36715:9;36747:17;;;36822:18;36807:34;;36843:22;;;36804:62;36801:2;;;36879:1;;36869:12;36801:2;36721;36888:22;36699:216;;-1:-1;36699:216::o;36922:304::-;;37081:18;37073:6;37070:30;37067:2;;;-1:-1;;37103:12;37067:2;-1:-1;37148:4;37136:17;;;37201:15;;37004:222::o;38199:158::-;;38294:14;;;38336:4;38323:18;;;38253:104::o;41061:117::-;-1:-1;;;;;40001:54;;41120:35;;41110:2;;41169:1;;41159:12;41110:2;41104:74;:::o
Swarm Source
ipfs://bf53080da8ea3a573c32f5a39773393cb26071bcfa2a5d619b7eef38d9aa29c7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.