More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xe91a535b99070c5c3744a90a7ec43ecdcccfa4a3105927261de7c02d42e88013 | Claim Launch Rew... | (pending) | 4 days ago | IN | 0 ETH | (Pending) | |||
Withdraw Benefit... | 12604800 | 1134 days ago | IN | 0 ETH | 0.00103515 | ||||
Claim Launch Rew... | 11094178 | 1366 days ago | IN | 0 ETH | 0.03029308 | ||||
Withdraw Expired... | 10648072 | 1435 days ago | IN | 0 ETH | 0.01233975 | ||||
Withdraw Benefit... | 10647946 | 1435 days ago | IN | 0 ETH | 0.02480681 | ||||
Withdraw Benefit... | 10619981 | 1439 days ago | IN | 0 ETH | 0.00752916 | ||||
Withdraw Benefit... | 10582015 | 1445 days ago | IN | 0 ETH | 0.0058909 | ||||
Withdraw Benefit... | 10573968 | 1446 days ago | IN | 0 ETH | 0.007893 | ||||
Withdraw Benefit... | 10555200 | 1449 days ago | IN | 0 ETH | 0.01354621 | ||||
Claim Launch Rew... | 10549955 | 1450 days ago | IN | 0 ETH | 0.01163112 | ||||
Withdraw Benefit... | 10549921 | 1450 days ago | IN | 0 ETH | 0.00594832 | ||||
Give Launch Rewa... | 10540049 | 1452 days ago | IN | 0 ETH | 0.01901863 | ||||
Claim Launch Rew... | 10536757 | 1452 days ago | IN | 0 ETH | 0.01390754 | ||||
New Staking | 10533942 | 1453 days ago | IN | 0 ETH | 0.01918312 | ||||
Claim Launch Rew... | 10531393 | 1453 days ago | IN | 0 ETH | 0.0120776 | ||||
Claim Launch Rew... | 10529523 | 1453 days ago | IN | 0 ETH | 0.01738443 | ||||
Withdraw Benefit... | 10529516 | 1453 days ago | IN | 0 ETH | 0.03324306 | ||||
Claim Launch Rew... | 10528037 | 1453 days ago | IN | 0 ETH | 0.01738443 | ||||
Withdraw Benefit... | 10524330 | 1454 days ago | IN | 0 ETH | 0.00406797 | ||||
Claim Launch Rew... | 10520936 | 1455 days ago | IN | 0 ETH | 0.02762391 | ||||
Claim Launch Rew... | 10520641 | 1455 days ago | IN | 0 ETH | 0.01434045 | ||||
New Staking | 10520406 | 1455 days ago | IN | 0 ETH | 0.01369248 | ||||
Give Launch Rewa... | 10520264 | 1455 days ago | IN | 0 ETH | 0.00226708 | ||||
Topup Reward Buc... | 10520249 | 1455 days ago | IN | 0 ETH | 0.00245757 | ||||
Withdraw Benefit... | 10514218 | 1456 days ago | IN | 0 ETH | 0.01071445 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TimeAlly
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.5.10; import './SafeMath.sol'; import './Eraswap.sol'; import './NRTManager.sol'; /* Potential bugs: this contract is designed assuming NRT Release will happen every month. There might be issues when the NRT scheduled - added stakingMonth property in Staking struct fix withdraw fractionFrom15 luck pool - done add loanactive contition to take loan - done ensure stakingMonth in the struct is being used every where instead of calculation - done remove local variables uncesessary final the earthSecondsInMonth amount in TimeAlly as well in NRT add events for required functions */ /// @author The EraSwap Team /// @title TimeAlly Smart Contract /// @dev all require statement message strings are commented to make contract deployable by lower the deploying gas fee contract TimeAlly { using SafeMath for uint256; struct Staking { uint256 exaEsAmount; uint256 timestamp; uint256 stakingMonth; uint256 stakingPlanId; uint256 status; /// @dev 1 => active; 2 => loaned; 3 => withdrawed; 4 => cancelled; 5 => nomination mode uint256 loanId; uint256 totalNominationShares; mapping (uint256 => bool) isMonthClaimed; mapping (address => uint256) nomination; } struct StakingPlan { uint256 months; uint256 fractionFrom15; /// @dev fraction of NRT released. Alotted to TimeAlly is 15% of NRT // bool isPlanActive; /// @dev when plan is inactive, new stakings must not be able to select this plan. Old stakings which already selected this plan will continue themselves as per plan. bool isUrgentLoanAllowed; /// @dev if urgent loan is not allowed then staker can take loan only after 75% (hard coded) of staking months } struct Loan { uint256 exaEsAmount; uint256 timestamp; uint256 loanPlanId; uint256 status; // @dev 1 => not repayed yet; 2 => repayed uint256[] stakingIds; } struct LoanPlan { uint256 loanMonths; uint256 loanRate; // @dev amount of charge to pay, this will be sent to luck pool uint256 maxLoanAmountPercent; /// @dev max loan user can take depends on this percent of the plan and the stakings user wishes to put for the loan } uint256 public deployedTimestamp; address public owner; Eraswap public token; NRTManager public nrtManager; /// @dev 1 Year = 365.242 days for taking care of leap years uint256 public earthSecondsInMonth = 2629744; // uint256 earthSecondsInMonth = 30 * 12 * 60 * 60; /// @dev there was a decision for following 360 day year StakingPlan[] public stakingPlans; LoanPlan[] public loanPlans; // user activity details: mapping(address => Staking[]) public stakings; mapping(address => Loan[]) public loans; mapping(address => uint256) public launchReward; /// @dev TimeAlly month to exaEsAmount mapping. mapping (uint256 => uint256) public totalActiveStakings; /// @notice NRT being received from NRT Manager every month is stored in this array /// @dev current month is the length of this array uint256[] public timeAllyMonthlyNRT; event NewStaking ( address indexed _userAddress, uint256 indexed _stakePlanId, uint256 _exaEsAmount, uint256 _stakingId ); event PrincipalWithdrawl ( address indexed _userAddress, uint256 _stakingId ); event NomineeNew ( address indexed _userAddress, uint256 indexed _stakingId, address indexed _nomineeAddress ); event NomineeWithdraw ( address indexed _userAddress, uint256 indexed _stakingId, address indexed _nomineeAddress, uint256 _liquid, uint256 _accrued ); event BenefitWithdrawl ( address indexed _userAddress, uint256 _stakingId, uint256[] _months, uint256 _halfBenefit ); event NewLoan ( address indexed _userAddress, uint256 indexed _loanPlanId, uint256 _exaEsAmount, uint256 _loanInterest, uint256 _loanId ); event RepayLoan ( address indexed _userAddress, uint256 _loanId ); modifier onlyNRTManager() { require( msg.sender == address(nrtManager) // , 'only NRT manager can call' ); _; } modifier onlyOwner() { require( msg.sender == owner // , 'only deployer can call' ); _; } /// @notice sets up TimeAlly contract when deployed /// @param _tokenAddress - is EraSwap contract address /// @param _nrtAddress - is NRT Manager contract address constructor(address _tokenAddress, address _nrtAddress) public { owner = msg.sender; token = Eraswap(_tokenAddress); nrtManager = NRTManager(_nrtAddress); deployedTimestamp = now; timeAllyMonthlyNRT.push(0); /// @dev first month there is no NRT released } /// @notice this function is used by NRT manager to communicate NRT release to TimeAlly function increaseMonth(uint256 _timeAllyNRT) public onlyNRTManager { timeAllyMonthlyNRT.push(_timeAllyNRT); } /// @notice TimeAlly month is dependent on the monthly NRT release /// @return current month is the TimeAlly month function getCurrentMonth() public view returns (uint256) { return timeAllyMonthlyNRT.length - 1; } /// @notice this function is used by owner to create plans for new stakings /// @param _months - is number of staking months of a plan. for eg. 12 months /// @param _fractionFrom15 - NRT fraction (max 15%) benefit to be given to user. rest is sent back to NRT in Luck Pool /// @param _isUrgentLoanAllowed - if urgent loan is not allowed then staker can take loan only after 75% of time elapsed function createStakingPlan(uint256 _months, uint256 _fractionFrom15, bool _isUrgentLoanAllowed) public onlyOwner { stakingPlans.push(StakingPlan({ months: _months, fractionFrom15: _fractionFrom15, // isPlanActive: true, isUrgentLoanAllowed: _isUrgentLoanAllowed })); } /// @notice this function is used by owner to create plans for new loans /// @param _loanMonths - number of months or duration of loan, loan taker must repay the loan before this period /// @param _loanRate - this is total % of loaning amount charged while taking loan, this charge is sent to luckpool in NRT manager which ends up distributed back to the community again function createLoanPlan(uint256 _loanMonths, uint256 _loanRate, uint256 _maxLoanAmountPercent) public onlyOwner { require(_maxLoanAmountPercent <= 100 // , 'everyone should not be able to take loan more than 100 percent of their stakings' ); loanPlans.push(LoanPlan({ loanMonths: _loanMonths, loanRate: _loanRate, maxLoanAmountPercent: _maxLoanAmountPercent })); } /// @notice takes ES from user and locks it for a time according to plan selected by user /// @param _exaEsAmount - amount of ES tokens (in 18 decimals thats why 'exa') that user wishes to stake /// @param _stakingPlanId - plan for staking function newStaking(uint256 _exaEsAmount, uint256 _stakingPlanId) public { /// @dev 0 ES stakings would get 0 ES benefits and might cause confusions as transaction would confirm but total active stakings will not increase require(_exaEsAmount > 0 // , 'staking amount should be non zero' ); require(token.transferFrom(msg.sender, address(this), _exaEsAmount) // , 'could not transfer tokens' ); uint256 stakeEndMonth = getCurrentMonth() + stakingPlans[_stakingPlanId].months; // @dev update the totalActiveStakings array so that staking would be automatically inactive after the stakingPlanMonthhs for( uint256 month = getCurrentMonth() + 1; month <= stakeEndMonth; month++ ) { totalActiveStakings[month] = totalActiveStakings[month].add(_exaEsAmount); } stakings[msg.sender].push(Staking({ exaEsAmount: _exaEsAmount, timestamp: now, stakingMonth: getCurrentMonth(), stakingPlanId: _stakingPlanId, status: 1, loanId: 0, totalNominationShares: 0 })); emit NewStaking(msg.sender, _stakingPlanId, _exaEsAmount, stakings[msg.sender].length - 1); } /// @notice this function is used to see total stakings of any user of TimeAlly /// @param _userAddress - address of user /// @return number of stakings of _userAddress function getNumberOfStakingsByUser(address _userAddress) public view returns (uint256) { return stakings[_userAddress].length; } /// @notice this function is used to topup reward balance in smart contract. Rewards are transferable. Anyone with reward balance can only claim it as a new staking. /// @dev Allowance is required before topup. /// @param _exaEsAmount - amount to add to your rewards for sending rewards to others function topupRewardBucket(uint256 _exaEsAmount) public { require(token.transferFrom(msg.sender, address(this), _exaEsAmount)); launchReward[msg.sender] = launchReward[msg.sender].add(_exaEsAmount); } /// @notice this function is used to send rewards to multiple users /// @param _addresses - array of address to send rewards /// @param _exaEsAmountArray - array of ExaES amounts sent to each address of _addresses with same index function giveLaunchReward(address[] memory _addresses, uint256[] memory _exaEsAmountArray) public onlyOwner { for(uint256 i = 0; i < _addresses.length; i++) { launchReward[msg.sender] = launchReward[msg.sender].sub(_exaEsAmountArray[i]); launchReward[_addresses[i]] = launchReward[_addresses[i]].add(_exaEsAmountArray[i]); } } /// @notice this function is used by rewardees to claim their accrued rewards. This is also used by stakers to restake their 50% benefit received as rewards /// @param _stakingPlanId - rewardee can choose plan while claiming rewards as stakings function claimLaunchReward(uint256 _stakingPlanId) public { // require(stakingPlans[_stakingPlanId].isPlanActive // // , 'selected plan is not active' // ); require(launchReward[msg.sender] > 0 // , 'launch reward should be non zero' ); uint256 reward = launchReward[msg.sender]; launchReward[msg.sender] = 0; // @dev logic similar to newStaking function uint256 stakeEndMonth = getCurrentMonth() + stakingPlans[_stakingPlanId].months; // @dev update the totalActiveStakings array so that staking would be automatically inactive after the stakingPlanMonthhs for( uint256 month = getCurrentMonth() + 1; month <= stakeEndMonth; month++ ) { totalActiveStakings[month] = totalActiveStakings[month].add(reward); /// @dev reward means locked ES which only staking option } stakings[msg.sender].push(Staking({ exaEsAmount: reward, timestamp: now, stakingMonth: getCurrentMonth(), stakingPlanId: _stakingPlanId, status: 1, loanId: 0, totalNominationShares: 0 })); emit NewStaking(msg.sender, _stakingPlanId, reward, stakings[msg.sender].length - 1); } /// @notice used internally to see if staking is active or not. does not include if staking is claimed. /// @param _userAddress - address of user /// @param _stakingId - staking id /// @param _atMonth - particular month to check staking active /// @return true is staking is in correct time frame and also no loan on it function isStakingActive( address _userAddress, uint256 _stakingId, uint256 _atMonth ) public view returns (bool) { //uint256 stakingMonth = stakings[_userAddress][_stakingId].timestamp.sub(deployedTimestamp).div(earthSecondsInMonth); return ( /// @dev _atMonth should be a month after which staking starts stakings[_userAddress][_stakingId].stakingMonth + 1 <= _atMonth /// @dev _atMonth should be a month before which staking ends && stakings[_userAddress][_stakingId].stakingMonth + stakingPlans[ stakings[_userAddress][_stakingId].stakingPlanId ].months >= _atMonth /// @dev staking should have active status && stakings[_userAddress][_stakingId].status == 1 /// @dev if _atMonth is current Month, then withdrawal should be allowed only after 30 days interval since staking && ( getCurrentMonth() != _atMonth || now >= stakings[_userAddress][_stakingId].timestamp .add( getCurrentMonth() .sub(stakings[_userAddress][_stakingId].stakingMonth) .mul(earthSecondsInMonth) ) ) ); } /// @notice this function is used for seeing the benefits of a staking of any user /// @param _userAddress - address of user /// @param _stakingId - staking id /// @param _months - array of months user is interested to see benefits. /// @return amount of ExaES of benefits of entered months function seeBenefitOfAStakingByMonths( address _userAddress, uint256 _stakingId, uint256[] memory _months ) public view returns (uint256) { uint256 benefitOfAllMonths; for(uint256 i = 0; i < _months.length; i++) { /// @dev this require statement is converted into if statement for easier UI fetching. If there is no benefit for a month or already claimed, it will consider benefit of that month as 0 ES. But same is not done for withdraw function. // require( // isStakingActive(_userAddress, _stakingId, _months[i]) // && !stakings[_userAddress][_stakingId].isMonthClaimed[_months[i]] // // , 'staking must be active' // ); if(isStakingActive(_userAddress, _stakingId, _months[i]) && !stakings[_userAddress][_stakingId].isMonthClaimed[_months[i]]) { uint256 benefit = stakings[_userAddress][_stakingId].exaEsAmount .mul(timeAllyMonthlyNRT[ _months[i] ]) .div(totalActiveStakings[ _months[i] ]); benefitOfAllMonths = benefitOfAllMonths.add(benefit); } } return benefitOfAllMonths.mul( stakingPlans[stakings[_userAddress][_stakingId].stakingPlanId].fractionFrom15 ).div(15); } /// @notice this function is used for withdrawing the benefits of a staking of any user /// @param _stakingId - staking id /// @param _months - array of months user is interested to withdraw benefits of staking. function withdrawBenefitOfAStakingByMonths( uint256 _stakingId, uint256[] memory _months ) public { uint256 _benefitOfAllMonths; for(uint256 i = 0; i < _months.length; i++) { // require( // isStakingActive(msg.sender, _stakingId, _months[i]) // && !stakings[msg.sender][_stakingId].isMonthClaimed[_months[i]] // // , 'staking must be active' // ); if(isStakingActive(msg.sender, _stakingId, _months[i]) && !stakings[msg.sender][_stakingId].isMonthClaimed[_months[i]]) { uint256 _benefit = stakings[msg.sender][_stakingId].exaEsAmount .mul(timeAllyMonthlyNRT[ _months[i] ]) .div(totalActiveStakings[ _months[i] ]); _benefitOfAllMonths = _benefitOfAllMonths.add(_benefit); stakings[msg.sender][_stakingId].isMonthClaimed[_months[i]] = true; } } uint256 _luckPool = _benefitOfAllMonths .mul( uint256(15).sub(stakingPlans[stakings[msg.sender][_stakingId].stakingPlanId].fractionFrom15) ) .div( 15 ); require( token.transfer(address(nrtManager), _luckPool) ); require( nrtManager.UpdateLuckpool(_luckPool) ); _benefitOfAllMonths = _benefitOfAllMonths.sub(_luckPool); uint256 _halfBenefit = _benefitOfAllMonths.div(2); require( token.transfer(msg.sender, _halfBenefit) ); launchReward[msg.sender] = launchReward[msg.sender].add(_halfBenefit); // emit event emit BenefitWithdrawl(msg.sender, _stakingId, _months, _halfBenefit); } /// @notice this function is used to withdraw the principle amount of multiple stakings which have their tenure completed /// @param _stakingIds - input which stakings to withdraw function withdrawExpiredStakings(uint256[] memory _stakingIds) public { for(uint256 i = 0; i < _stakingIds.length; i++) { require(now >= stakings[msg.sender][_stakingIds[i]].timestamp .add(stakingPlans[ stakings[msg.sender][_stakingIds[i]].stakingPlanId ].months.mul(earthSecondsInMonth)) // , 'cannot withdraw before staking ends' ); stakings[msg.sender][_stakingIds[i]].status = 3; token.transfer(msg.sender, stakings[msg.sender][_stakingIds[i]].exaEsAmount); emit PrincipalWithdrawl(msg.sender, _stakingIds[i]); } } /// @notice this function is used to estimate the maximum amount of loan that any user can take with their stakings /// @param _userAddress - address of user /// @param _stakingIds - array of staking ids which should be used to estimate max loan amount /// @param _loanPlanId - the loan plan user wishes to take loan. /// @return max loaning amount function seeMaxLoaningAmountOnUserStakings(address _userAddress, uint256[] memory _stakingIds, uint256 _loanPlanId) public view returns (uint256) { uint256 _currentMonth = getCurrentMonth(); //require(_currentMonth >= _atMonth, 'cannot see future stakings'); uint256 userStakingsExaEsAmount; for(uint256 i = 0; i < _stakingIds.length; i++) { if(isStakingActive(_userAddress, _stakingIds[i], _currentMonth) && ( // @dev if urgent loan is not allowed then loan can be taken only after staking period is completed 75% stakingPlans[ stakings[_userAddress][_stakingIds[i]].stakingPlanId ].isUrgentLoanAllowed || now > stakings[_userAddress][_stakingIds[i]].timestamp + stakingPlans[ stakings[_userAddress][_stakingIds[i]].stakingPlanId ].months.mul(earthSecondsInMonth).mul(75).div(100) ) ) { userStakingsExaEsAmount = userStakingsExaEsAmount .add(stakings[_userAddress][_stakingIds[i]].exaEsAmount .mul(loanPlans[_loanPlanId].maxLoanAmountPercent) .div(100) // .mul(stakingPlans[ stakings[_userAddress][_stakingIds[i]].stakingPlanId ].fractionFrom15) // .div(15) ); } } return userStakingsExaEsAmount; //.mul( uint256(100).sub(loanPlans[_loanPlanId].loanRate) ).div(100); } /// @notice this function is used to take loan on multiple stakings /// @param _loanPlanId - user can select this plan which defines loan duration and loan interest /// @param _exaEsAmount - loan amount, this will also be the loan repay amount, the interest will first be deducted from this and then amount will be credited /// @param _stakingIds - staking ids user wishes to encash for taking the loan function takeLoanOnSelfStaking(uint256 _loanPlanId, uint256 _exaEsAmount, uint256[] memory _stakingIds) public { // @dev when loan is to be taken, first calculate active stakings from given stakings array. this way we can get how much loan user can take and simultaneously mark stakings as claimed for next months number loan period uint256 _currentMonth = getCurrentMonth(); uint256 _userStakingsExaEsAmount; for(uint256 i = 0; i < _stakingIds.length; i++) { if( isStakingActive(msg.sender, _stakingIds[i], _currentMonth) && ( // @dev if urgent loan is not allowed then loan can be taken only after staking period is completed 75% stakingPlans[ stakings[msg.sender][_stakingIds[i]].stakingPlanId ].isUrgentLoanAllowed || now > stakings[msg.sender][_stakingIds[i]].timestamp + stakingPlans[ stakings[msg.sender][_stakingIds[i]].stakingPlanId ].months.mul(earthSecondsInMonth).mul(75).div(100) ) ) { // @dev store sum in a number _userStakingsExaEsAmount = _userStakingsExaEsAmount .add( stakings[msg.sender][ _stakingIds[i] ].exaEsAmount .mul(loanPlans[_loanPlanId].maxLoanAmountPercent) .div(100) ); // @dev subtract total active stakings uint256 stakingStartMonth = stakings[msg.sender][_stakingIds[i]].stakingMonth; uint256 stakeEndMonth = stakingStartMonth + stakingPlans[stakings[msg.sender][_stakingIds[i]].stakingPlanId].months; for(uint256 j = _currentMonth + 1; j <= stakeEndMonth; j++) { totalActiveStakings[j] = totalActiveStakings[j].sub(_userStakingsExaEsAmount); } // @dev make stakings inactive for(uint256 j = 1; j <= loanPlans[_loanPlanId].loanMonths; j++) { stakings[msg.sender][ _stakingIds[i] ].isMonthClaimed[ _currentMonth + j ] = true; stakings[msg.sender][ _stakingIds[i] ].status = 2; // means in loan } } } uint256 _maxLoaningAmount = _userStakingsExaEsAmount; if(_exaEsAmount > _maxLoaningAmount) { require(false // , 'cannot loan more than maxLoaningAmount' ); } uint256 _loanInterest = _exaEsAmount.mul(loanPlans[_loanPlanId].loanRate).div(100); uint256 _loanAmountToTransfer = _exaEsAmount.sub(_loanInterest); require( token.transfer(address(nrtManager), _loanInterest) ); require( nrtManager.UpdateLuckpool(_loanInterest) ); loans[msg.sender].push(Loan({ exaEsAmount: _exaEsAmount, timestamp: now, loanPlanId: _loanPlanId, status: 1, stakingIds: _stakingIds })); // @dev send user amount require( token.transfer(msg.sender, _loanAmountToTransfer) ); emit NewLoan(msg.sender, _loanPlanId, _exaEsAmount, _loanInterest, loans[msg.sender].length - 1); } /// @notice repay loan functionality /// @dev need to give allowance before this /// @param _loanId - select loan to repay function repayLoanSelf(uint256 _loanId) public { require(loans[msg.sender][_loanId].status == 1 // , 'can only repay pending loans' ); require(loans[msg.sender][_loanId].timestamp + loanPlans[ loans[msg.sender][_loanId].loanPlanId ].loanMonths.mul(earthSecondsInMonth) > now // , 'cannot repay expired loan' ); require(token.transferFrom(msg.sender, address(this), loans[msg.sender][_loanId].exaEsAmount) // , 'cannot receive enough tokens, please check if allowance is there' ); loans[msg.sender][_loanId].status = 2; // @dev get all stakings associated with this loan. and set next unclaimed months. then set status to 1 and also add to totalActiveStakings for(uint256 i = 0; i < loans[msg.sender][_loanId].stakingIds.length; i++) { uint256 _stakingId = loans[msg.sender][_loanId].stakingIds[i]; stakings[msg.sender][_stakingId].status = 1; uint256 stakingStartMonth = stakings[msg.sender][_stakingId].timestamp.sub(deployedTimestamp).div(earthSecondsInMonth); uint256 stakeEndMonth = stakingStartMonth + stakingPlans[stakings[msg.sender][_stakingId].stakingPlanId].months; for(uint256 j = getCurrentMonth() + 1; j <= stakeEndMonth; j++) { stakings[msg.sender][_stakingId].isMonthClaimed[i] = false; totalActiveStakings[j] = totalActiveStakings[j].add(stakings[msg.sender][_stakingId].exaEsAmount); } } // add repay event emit RepayLoan(msg.sender, _loanId); } function burnDefaultedLoans(address[] memory _addressArray, uint256[] memory _loanIdArray) public { uint256 _amountToBurn; for(uint256 i = 0; i < _addressArray.length; i++) { require( loans[ _addressArray[i] ][ _loanIdArray[i] ].status == 1 // , 'loan should not be repayed' ); require( now > loans[ _addressArray[i] ][ _loanIdArray[i] ].timestamp + loanPlans[ loans[ _addressArray[i] ][ _loanIdArray[i] ].loanPlanId ].loanMonths.mul(earthSecondsInMonth) // , 'loan should have crossed its loan period' ); uint256[] storage _stakingIdsOfLoan = loans[ _addressArray[i] ][ _loanIdArray[i] ].stakingIds; /// @dev add staking amounts of all stakings on which loan is taken for(uint256 j = 0; j < _stakingIdsOfLoan.length; j++) { _amountToBurn = _amountToBurn.add( stakings[ _addressArray[i] ][ _stakingIdsOfLoan[j] ].exaEsAmount ); } /// @dev sub loan amount _amountToBurn = _amountToBurn.sub( loans[ _addressArray[i] ][ _loanIdArray[i] ].exaEsAmount ); } require(token.transfer(address(nrtManager), _amountToBurn)); require(nrtManager.UpdateBurnBal(_amountToBurn)); // emit event } /// @notice this function is used to add nominee to a staking /// @param _stakingId - staking id /// @param _nomineeAddress - address of nominee to be added to staking /// @param _shares - amount of shares of the staking to the nominee /// @dev shares is compared with total shares issued in a staking to see the percent nominee can withdraw. Nominee can withdraw only after one year past the end of tenure of staking. Upto 1 year past the end of tenure of staking, owner can withdraw principle amount of staking as well as can CRUD nominees. Owner of staking is has this time to withdraw their staking, if they fail to do so, after that nominees are allowed to withdraw. Withdrawl by first nominee will trigger staking into nomination mode and owner of staking cannot withdraw the principle amount as it will be distributed with only nominees and only they can withdraw it. function addNominee(uint256 _stakingId, address _nomineeAddress, uint256 _shares) public { require(stakings[msg.sender][_stakingId].status == 1 // , 'staking should active' ); require(stakings[msg.sender][_stakingId].nomination[_nomineeAddress] == 0 // , 'should not be nominee already' ); stakings[msg.sender][_stakingId].totalNominationShares = stakings[msg.sender][_stakingId].totalNominationShares.add(_shares); stakings[msg.sender][_stakingId].nomination[_nomineeAddress] = _shares; emit NomineeNew(msg.sender, _stakingId, _nomineeAddress); } /// @notice this function is used to read the nomination of a nominee address of a staking of a user /// @param _userAddress - address of staking owner /// @param _stakingId - staking id /// @param _nomineeAddress - address of nominee /// @return nomination of the nominee function viewNomination(address _userAddress, uint256 _stakingId, address _nomineeAddress) public view returns (uint256) { return stakings[_userAddress][_stakingId].nomination[_nomineeAddress]; } // /// @notice this function is used to update nomination of a nominee of sender's staking // /// @param _stakingId - staking id // /// @param _nomineeAddress - address of nominee // /// @param _shares - shares to be updated for the nominee // function updateNominee(uint256 _stakingId, address _nomineeAddress, uint256 _shares) public { // require(stakings[msg.sender][_stakingId].status == 1 // // , 'staking should active' // ); // uint256 _oldShares = stakings[msg.sender][_stakingId].nomination[_nomineeAddress]; // if(_shares > _oldShares) { // uint256 _diff = _shares.sub(_oldShares); // stakings[msg.sender][_stakingId].totalNominationShares = stakings[msg.sender][_stakingId].totalNominationShares.add(_diff); // stakings[msg.sender][_stakingId].nomination[_nomineeAddress] = stakings[msg.sender][_stakingId].nomination[_nomineeAddress].add(_diff); // } else if(_shares < _oldShares) { // uint256 _diff = _oldShares.sub(_shares); // stakings[msg.sender][_stakingId].nomination[_nomineeAddress] = stakings[msg.sender][_stakingId].nomination[_nomineeAddress].sub(_diff); // stakings[msg.sender][_stakingId].totalNominationShares = stakings[msg.sender][_stakingId].totalNominationShares.sub(_diff); // } // } /// @notice this function is used to remove nomination of a address /// @param _stakingId - staking id /// @param _nomineeAddress - address of nominee function removeNominee(uint256 _stakingId, address _nomineeAddress) public { require(stakings[msg.sender][_stakingId].status == 1, 'staking should active'); uint256 _oldShares = stakings[msg.sender][_stakingId].nomination[msg.sender]; stakings[msg.sender][_stakingId].nomination[_nomineeAddress] = 0; stakings[msg.sender][_stakingId].totalNominationShares = stakings[msg.sender][_stakingId].totalNominationShares.sub(_oldShares); } /// @notice this function is used by nominee to withdraw their share of a staking after 1 year of the end of tenure of staking /// @param _userAddress - address of user /// @param _stakingId - staking id function nomineeWithdraw(address _userAddress, uint256 _stakingId) public { // end time stamp > 0 uint256 currentTime = now; require( currentTime > (stakings[_userAddress][_stakingId].timestamp + stakingPlans[stakings[_userAddress][_stakingId].stakingPlanId].months * earthSecondsInMonth + 12 * earthSecondsInMonth ) // , 'cannot nominee withdraw before ' ); uint256 _nomineeShares = stakings[_userAddress][_stakingId].nomination[msg.sender]; require(_nomineeShares > 0 // , 'Not a nominee of this staking' ); //uint256 _totalShares = ; // set staking to nomination mode if it isn't. if(stakings[_userAddress][_stakingId].status != 5) { stakings[_userAddress][_stakingId].status = 5; } // adding principal account uint256 _pendingLiquidAmountInStaking = stakings[_userAddress][_stakingId].exaEsAmount; uint256 _pendingAccruedAmountInStaking; // uint256 _stakingStartMonth = stakings[_userAddress][_stakingId].timestamp.sub(deployedTimestamp).div(earthSecondsInMonth); uint256 _stakeEndMonth = stakings[_userAddress][_stakingId].stakingMonth + stakingPlans[stakings[_userAddress][_stakingId].stakingPlanId].months; // adding monthly benefits which are not claimed for( uint256 i = stakings[_userAddress][_stakingId].stakingMonth; //_stakingStartMonth; i < _stakeEndMonth; i++ ) { if( stakings[_userAddress][_stakingId].isMonthClaimed[i] ) { uint256 _effectiveAmount = stakings[_userAddress][_stakingId].exaEsAmount .mul(stakingPlans[stakings[_userAddress][_stakingId].stakingPlanId].fractionFrom15) .div(15); uint256 _monthlyBenefit = _effectiveAmount .mul(timeAllyMonthlyNRT[i]) .div(totalActiveStakings[i]); _pendingLiquidAmountInStaking = _pendingLiquidAmountInStaking.add(_monthlyBenefit.div(2)); _pendingAccruedAmountInStaking = _pendingAccruedAmountInStaking.add(_monthlyBenefit.div(2)); } } // now we have _pendingLiquidAmountInStaking && _pendingAccruedAmountInStaking // on which user's share will be calculated and sent // marking nominee as claimed by removing his shares stakings[_userAddress][_stakingId].nomination[msg.sender] = 0; uint256 _nomineeLiquidShare = _pendingLiquidAmountInStaking .mul(_nomineeShares) .div(stakings[_userAddress][_stakingId].totalNominationShares); token.transfer(msg.sender, _nomineeLiquidShare); uint256 _nomineeAccruedShare = _pendingAccruedAmountInStaking .mul(_nomineeShares) .div(stakings[_userAddress][_stakingId].totalNominationShares); launchReward[msg.sender] = launchReward[msg.sender].add(_nomineeAccruedShare); // emit a event emit NomineeWithdraw(_userAddress, _stakingId, msg.sender, _nomineeLiquidShare, _nomineeAccruedShare); } }
pragma solidity ^0.5.2; import "./ERC20Capped.sol"; import "./ERC20Burnable.sol"; import "./ERC20Detailed.sol"; import "./ERC20Pausable.sol"; contract Eraswap is ERC20Detailed,ERC20Burnable,ERC20Capped,ERC20Pausable { event NRTManagerAdded(address NRTManager); constructor() public ERC20Detailed ("Era Swap", "ES", 18) ERC20Capped(9100000000000000000000000000) { mint(msg.sender, 910000000000000000000000000); } int256 public timeMachineDepth; // gives the time machine time function mou() public view returns(uint256) { if(timeMachineDepth < 0) { return now - uint256(timeMachineDepth); } else { return now + uint256(timeMachineDepth); } } // sets the time machine depth function setTimeMachineDepth(int256 _timeMachineDepth) public { timeMachineDepth = _timeMachineDepth; } function goToFuture(uint256 _seconds) public { timeMachineDepth += int256(_seconds); } function goToPast(uint256 _seconds) public { timeMachineDepth -= int256(_seconds); } /** * @dev Function to add NRT Manager to have minting rights * It will transfer the minting rights to NRTManager and revokes it from existing minter * @param NRTManager Address of NRT Manager C ontract */ function AddNRTManager(address NRTManager) public onlyMinter returns (bool) { addMinter(NRTManager); addPauser(NRTManager); renounceMinter(); renouncePauser(); emit NRTManagerAdded(NRTManager); return true; } }
pragma solidity ^0.5.2; import "./IERC20.sol"; import "./SafeMath.sol"; /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://eips.ethereum.org/EIPS/eip-20 * Originally based on code by FirstBlood: * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol * * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for * all accounts just by listening to said events. Note that this isn't required by the specification, and other * compliant implementations may not do it. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowed; uint256 private _totalSupply; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the balance of. * @return A uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) public view returns (uint256) { return _balances[owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowed[owner][spender]; } /** * @dev Transfer token to a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * 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 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) public returns (bool) { _transfer(from, to, value); _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue)); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when _allowed[msg.sender][spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) internal { require(to != address(0)); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the * proper events are emitted. * @param account The account that will receive the created tokens. * @param value The amount that will be created. */ function _mint(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.add(value); _balances[account] = _balances[account].add(value); emit Transfer(address(0), account, value); } /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Approve an address to spend another addresses' tokens. * @param owner The address that owns the tokens. * @param spender The address that will spend the tokens. * @param value The number of tokens that can be spent. */ function _approve(address owner, address spender, uint256 value) internal { require(spender != address(0)); require(owner != address(0)); _allowed[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burnFrom(address account, uint256 value) internal { _burn(account, value); _approve(account, msg.sender, _allowed[account][msg.sender].sub(value)); } }
pragma solidity ^0.5.2; import "./ERC20.sol"; /** * @title Burnable Token * @dev Token that can be irreversibly burned (destroyed). */ contract ERC20Burnable is ERC20 { /** * @dev Burns a specific amount of tokens. * @param value The amount of token to be burned. */ function burn(uint256 value) public { _burn(msg.sender, value); } /** * @dev Burns a specific amount of tokens from the target address and decrements allowance * @param from address The account whose tokens will be burned. * @param value uint256 The amount of token to be burned. */ function burnFrom(address from, uint256 value) public { _burnFrom(from, value); } }
pragma solidity ^0.5.2; import "./ERC20Mintable.sol"; /** * @title Capped token * @dev Mintable token with a token cap. */ contract ERC20Capped is ERC20Mintable { uint256 private _cap; constructor (uint256 cap) public { require(cap > 0); _cap = cap; } /** * @return the cap for the token minting. */ function cap() public view returns (uint256) { return _cap; } function _mint(address account, uint256 value) internal { require(totalSupply().add(value) <= _cap); super._mint(account, value); } }
pragma solidity ^0.5.2; import "./IERC20.sol"; /** * @title ERC20Detailed token * @dev The decimals are only for visualization purposes. * All the operations are done using the smallest and indivisible token unit, * just as on Ethereum all the operations are done in wei. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @return the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @return the symbol of the token. */ function symbol() public view returns (string memory) { return _symbol; } /** * @return the number of decimals of the token. */ function decimals() public view returns (uint8) { return _decimals; } }
pragma solidity ^0.5.2; import "./ERC20.sol"; import "./MinterRole.sol"; /** * @title ERC20Mintable * @dev ERC20 minting logic */ contract ERC20Mintable is ERC20, MinterRole { /** * @dev Function to mint tokens * @param to The address that will receive the minted tokens. * @param value The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function mint(address to, uint256 value) public onlyMinter returns (bool) { _mint(to, value); return true; } }
pragma solidity ^0.5.2; import "./ERC20.sol"; import "./Pausable.sol"; /** * @title Pausable token * @dev ERC20 modified with pausable transfers. */ contract ERC20Pausable is ERC20, Pausable { function transfer(address to, uint256 value) public whenNotPaused returns (bool) { return super.transfer(to, value); } function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) { return super.transferFrom(from, to, value); } function approve(address spender, uint256 value) public whenNotPaused returns (bool) { return super.approve(spender, value); } function increaseAllowance(address spender, uint addedValue) public whenNotPaused returns (bool success) { return super.increaseAllowance(spender, addedValue); } function decreaseAllowance(address spender, uint subtractedValue) public whenNotPaused returns (bool success) { return super.decreaseAllowance(spender, subtractedValue); } }
pragma solidity ^0.5.2; /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
pragma solidity ^0.5.2; import "./Roles.sol"; contract MinterRole { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender)); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(msg.sender); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } }
pragma solidity ^0.5.2; import "./Eraswap.sol"; import "./TimeAlly.sol"; contract NRTManager { using SafeMath for uint256; uint256 public lastNRTRelease; // variable to store last release date uint256 public monthlyNRTAmount; // variable to store Monthly NRT amount to be released uint256 public annualNRTAmount; // variable to store Annual NRT amount to be released uint256 public monthCount; // variable to store the count of months from the intial date uint256 public luckPoolBal; // Luckpool Balance uint256 public burnTokenBal; // tokens to be burned Eraswap token; address Owner; //Eraswap public eraswapToken; // different pool address address public newTalentsAndPartnerships = 0xb4024468D052B36b6904a47541dDE69E44594607; address public platformMaintenance = 0x922a2d6B0B2A24779B0623452AdB28233B456D9c; address public marketingAndRNR = 0xDFBC0aE48f3DAb5b0A1B154849Ee963430AA0c3E; address public kmPards = 0x4881964ac9AD9480585425716A8708f0EE66DA88; address public contingencyFunds = 0xF4E731a107D7FFb2785f696543dE8BF6EB558167; address public researchAndDevelopment = 0xb209B4cec04cE9C0E1Fa741dE0a8566bf70aDbe9; address public powerToken = 0xbc24BfAC401860ce536aeF9dE10EF0104b09f657; address public timeSwappers = 0x4b65109E11CF0Ff8fA58A7122a5E84e397C6Ceb8; // which include powerToken , curators ,timeTraders , daySwappers address public timeAlly; //address of timeAlly Contract uint256 public newTalentsAndPartnershipsBal; // variable to store last NRT released to the address; uint256 public platformMaintenanceBal; // variable to store last NRT released to the address; uint256 public marketingAndRNRBal; // variable to store last NRT released to the address; uint256 public kmPardsBal; // variable to store last NRT released to the address; uint256 public contingencyFundsBal; // variable to store last NRT released to the address; uint256 public researchAndDevelopmentBal; // variable to store last NRT released to the address; uint256 public powerTokenNRT; // variable to store last NRT released to the address; uint256 public timeAllyNRT; // variable to store last NRT released to the address; uint256 public timeSwappersNRT; // variable to store last NRT released to the address; // Event to watch NRT distribution // @param NRTReleased The amount of NRT released in the month event NRTDistributed(uint256 NRTReleased); /** * Event to watch Transfer of NRT to different Pool * @param pool - The pool name * @param sendAddress - The address of pool * @param value - The value of NRT released **/ event NRTTransfer(string pool, address sendAddress, uint256 value); // Event to watch Tokens Burned // @param amount The amount burned event TokensBurned(uint256 amount); /** * Event to watch the addition of pool address * @param pool - The pool name * @param sendAddress - The address of pool **/ event PoolAddressAdded(string pool, address sendAddress); // Event to watch LuckPool Updation // @param luckPoolBal The current luckPoolBal event LuckPoolUpdated(uint256 luckPoolBal); // Event to watch BurnTokenBal Updation // @param burnTokenBal The current burnTokenBal event BurnTokenBalUpdated(uint256 burnTokenBal); /** * @dev Throws if caller is not timeAlly */ modifier OnlyAllowed() { require(msg.sender == timeAlly || msg.sender == timeSwappers,"Only TimeAlly and Timeswapper is authorised"); _; } /** * @dev Throws if caller is not owner */ modifier OnlyOwner() { require(msg.sender == Owner,"Only Owner is authorised"); _; } /** * @dev Should burn tokens according to the total circulation * @return true if success */ function burnTokens() internal returns (bool){ if(burnTokenBal == 0){ return true; } else{ uint MaxAmount = ((token.totalSupply()).mul(2)).div(100); // max amount permitted to burn in a month if(MaxAmount >= burnTokenBal ){ token.burn(burnTokenBal); burnTokenBal = 0; } else{ burnTokenBal = burnTokenBal.sub(MaxAmount); token.burn(MaxAmount); } return true; } } /** * @dev To update pool addresses * @param pool - A List of pool addresses * Updates if pool address is not already set and if given address is not zero * @return true if success */ function UpdateAddresses (address[9] calldata pool) external OnlyOwner returns(bool){ if((pool[0] != address(0)) && (newTalentsAndPartnerships == address(0))){ newTalentsAndPartnerships = pool[0]; emit PoolAddressAdded( "NewTalentsAndPartnerships", newTalentsAndPartnerships); } if((pool[1] != address(0)) && (platformMaintenance == address(0))){ platformMaintenance = pool[1]; emit PoolAddressAdded( "PlatformMaintenance", platformMaintenance); } if((pool[2] != address(0)) && (marketingAndRNR == address(0))){ marketingAndRNR = pool[2]; emit PoolAddressAdded( "MarketingAndRNR", marketingAndRNR); } if((pool[3] != address(0)) && (kmPards == address(0))){ kmPards = pool[3]; emit PoolAddressAdded( "KmPards", kmPards); } if((pool[4] != address(0)) && (contingencyFunds == address(0))){ contingencyFunds = pool[4]; emit PoolAddressAdded( "ContingencyFunds", contingencyFunds); } if((pool[5] != address(0)) && (researchAndDevelopment == address(0))){ researchAndDevelopment = pool[5]; emit PoolAddressAdded( "ResearchAndDevelopment", researchAndDevelopment); } if((pool[6] != address(0)) && (powerToken == address(0))){ powerToken = pool[6]; emit PoolAddressAdded( "PowerToken", powerToken); } if((pool[7] != address(0)) && (timeSwappers == address(0))){ timeSwappers = pool[7]; emit PoolAddressAdded( "TimeSwapper", timeSwappers); } if((pool[8] != address(0)) && (timeAlly == address(0))){ timeAlly = pool[8]; emit PoolAddressAdded( "TimeAlly", timeAlly); } return true; } /** * @dev Function to update luckpool balance * @param amount Amount to be updated */ function UpdateLuckpool(uint256 amount) external OnlyAllowed returns(bool){ luckPoolBal = luckPoolBal.add(amount); emit LuckPoolUpdated(luckPoolBal); return true; } /** * @dev Function to trigger to update for burning of tokens * @param amount Amount to be updated */ function UpdateBurnBal(uint256 amount) external OnlyAllowed returns(bool){ burnTokenBal = burnTokenBal.add(amount); emit BurnTokenBalUpdated(burnTokenBal); return true; } /** * @dev To invoke monthly release * @return true if success */ function MonthlyNRTRelease() external returns (bool) { require(now.sub(lastNRTRelease)> 2629744,"NRT release happens once every month"); uint256 NRTBal = monthlyNRTAmount.add(luckPoolBal); // Total NRT available. // Calculating NRT to be released to each of the pools newTalentsAndPartnershipsBal = (NRTBal.mul(5)).div(100); platformMaintenanceBal = (NRTBal.mul(10)).div(100); marketingAndRNRBal = (NRTBal.mul(10)).div(100); kmPardsBal = (NRTBal.mul(10)).div(100); contingencyFundsBal = (NRTBal.mul(10)).div(100); researchAndDevelopmentBal = (NRTBal.mul(5)).div(100); powerTokenNRT = (NRTBal.mul(10)).div(100); timeAllyNRT = (NRTBal.mul(15)).div(100); timeSwappersNRT = (NRTBal.mul(25)).div(100); // sending tokens to respective wallets and emitting events token.mint(newTalentsAndPartnerships,newTalentsAndPartnershipsBal); emit NRTTransfer("newTalentsAndPartnerships", newTalentsAndPartnerships, newTalentsAndPartnershipsBal); token.mint(platformMaintenance,platformMaintenanceBal); emit NRTTransfer("platformMaintenance", platformMaintenance, platformMaintenanceBal); token.mint(marketingAndRNR,marketingAndRNRBal); emit NRTTransfer("marketingAndRNR", marketingAndRNR, marketingAndRNRBal); token.mint(kmPards,kmPardsBal); emit NRTTransfer("kmPards", kmPards, kmPardsBal); token.mint(contingencyFunds,contingencyFundsBal); emit NRTTransfer("contingencyFunds", contingencyFunds, contingencyFundsBal); token.mint(researchAndDevelopment,researchAndDevelopmentBal); emit NRTTransfer("researchAndDevelopment", researchAndDevelopment, researchAndDevelopmentBal); token.mint(powerToken,powerTokenNRT); emit NRTTransfer("powerToken", powerToken, powerTokenNRT); token.mint(timeAlly,timeAllyNRT); TimeAlly timeAllyContract = TimeAlly(timeAlly); timeAllyContract.increaseMonth(timeAllyNRT); emit NRTTransfer("stakingContract", timeAlly, timeAllyNRT); token.mint(timeSwappers,timeSwappersNRT); emit NRTTransfer("timeSwappers", timeSwappers, timeSwappersNRT); // Reseting NRT emit NRTDistributed(NRTBal); luckPoolBal = 0; lastNRTRelease = lastNRTRelease.add(2629744); // @dev adding seconds according to 1 Year = 365.242 days burnTokens(); // burning burnTokenBal emit TokensBurned(burnTokenBal); if(monthCount == 11){ monthCount = 0; annualNRTAmount = (annualNRTAmount.mul(90)).div(100); monthlyNRTAmount = annualNRTAmount.div(12); } else{ monthCount = monthCount.add(1); } return true; } /** * @dev Constructor */ constructor(address eraswaptoken) public{ token = Eraswap(eraswaptoken); lastNRTRelease = now; annualNRTAmount = 819000000000000000000000000; monthlyNRTAmount = annualNRTAmount.div(uint256(12)); monthCount = 0; Owner = msg.sender; } }
pragma solidity ^0.5.2; import "./PauserRole.sol"; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is PauserRole { event Paused(address account); event Unpaused(address account); bool private _paused; constructor () internal { _paused = false; } /** * @return true if the contract is paused, false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(msg.sender); } }
pragma solidity ^0.5.2; import "./Roles.sol"; contract PauserRole { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender)); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } }
pragma solidity ^0.5.2; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } }
pragma solidity ^0.5.2; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"nrtManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addressArray","type":"address[]"},{"name":"_loanIdArray","type":"uint256[]"}],"name":"burnDefaultedLoans","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"stakings","outputs":[{"name":"exaEsAmount","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"stakingMonth","type":"uint256"},{"name":"stakingPlanId","type":"uint256"},{"name":"status","type":"uint256"},{"name":"loanId","type":"uint256"},{"name":"totalNominationShares","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"timeAllyMonthlyNRT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_userAddress","type":"address"},{"name":"_stakingId","type":"uint256"},{"name":"_months","type":"uint256[]"}],"name":"seeBenefitOfAStakingByMonths","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_userAddress","type":"address"},{"name":"_stakingId","type":"uint256"},{"name":"_nomineeAddress","type":"address"}],"name":"viewNomination","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"totalActiveStakings","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stakingId","type":"uint256"},{"name":"_nomineeAddress","type":"address"}],"name":"removeNominee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_exaEsAmount","type":"uint256"}],"name":"topupRewardBucket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"earthSecondsInMonth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"stakingPlans","outputs":[{"name":"months","type":"uint256"},{"name":"fractionFrom15","type":"uint256"},{"name":"isUrgentLoanAllowed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_months","type":"uint256"},{"name":"_fractionFrom15","type":"uint256"},{"name":"_isUrgentLoanAllowed","type":"bool"}],"name":"createStakingPlan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"launchReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"},{"name":"_exaEsAmountArray","type":"uint256[]"}],"name":"giveLaunchReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_userAddress","type":"address"},{"name":"_stakingId","type":"uint256"}],"name":"nomineeWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"loans","outputs":[{"name":"exaEsAmount","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"loanPlanId","type":"uint256"},{"name":"status","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stakingId","type":"uint256"},{"name":"_months","type":"uint256[]"}],"name":"withdrawBenefitOfAStakingByMonths","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stakingId","type":"uint256"},{"name":"_nomineeAddress","type":"address"},{"name":"_shares","type":"uint256"}],"name":"addNominee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_userAddress","type":"address"}],"name":"getNumberOfStakingsByUser","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"loanPlans","outputs":[{"name":"loanMonths","type":"uint256"},{"name":"loanRate","type":"uint256"},{"name":"maxLoanAmountPercent","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_loanPlanId","type":"uint256"},{"name":"_exaEsAmount","type":"uint256"},{"name":"_stakingIds","type":"uint256[]"}],"name":"takeLoanOnSelfStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_loanMonths","type":"uint256"},{"name":"_loanRate","type":"uint256"},{"name":"_maxLoanAmountPercent","type":"uint256"}],"name":"createLoanPlan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_userAddress","type":"address"},{"name":"_stakingId","type":"uint256"},{"name":"_atMonth","type":"uint256"}],"name":"isStakingActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stakingPlanId","type":"uint256"}],"name":"claimLaunchReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentMonth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_loanId","type":"uint256"}],"name":"repayLoanSelf","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_userAddress","type":"address"},{"name":"_stakingIds","type":"uint256[]"},{"name":"_loanPlanId","type":"uint256"}],"name":"seeMaxLoaningAmountOnUserStakings","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exaEsAmount","type":"uint256"},{"name":"_stakingPlanId","type":"uint256"}],"name":"newStaking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deployedTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_timeAllyNRT","type":"uint256"}],"name":"increaseMonth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stakingIds","type":"uint256[]"}],"name":"withdrawExpiredStakings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_nrtAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":true,"name":"_stakePlanId","type":"uint256"},{"indexed":false,"name":"_exaEsAmount","type":"uint256"},{"indexed":false,"name":"_stakingId","type":"uint256"}],"name":"NewStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":false,"name":"_stakingId","type":"uint256"}],"name":"PrincipalWithdrawl","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":true,"name":"_stakingId","type":"uint256"},{"indexed":true,"name":"_nomineeAddress","type":"address"}],"name":"NomineeNew","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":true,"name":"_stakingId","type":"uint256"},{"indexed":true,"name":"_nomineeAddress","type":"address"},{"indexed":false,"name":"_liquid","type":"uint256"},{"indexed":false,"name":"_accrued","type":"uint256"}],"name":"NomineeWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":false,"name":"_stakingId","type":"uint256"},{"indexed":false,"name":"_months","type":"uint256[]"},{"indexed":false,"name":"_halfBenefit","type":"uint256"}],"name":"BenefitWithdrawl","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":true,"name":"_loanPlanId","type":"uint256"},{"indexed":false,"name":"_exaEsAmount","type":"uint256"},{"indexed":false,"name":"_loanInterest","type":"uint256"},{"indexed":false,"name":"_loanId","type":"uint256"}],"name":"NewLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_userAddress","type":"address"},{"indexed":false,"name":"_loanId","type":"uint256"}],"name":"RepayLoan","type":"event"}]
Contract Creation Code
6080604052622820706004553480156200001857600080fd5b5060405162005b6e38038062005b6e833981810160405260408110156200003e57600080fd5b81019080805190602001909291908051906020019092919050505033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600081905550600b600090806001815401808255809150509060018203906000526020600020016000909192909190915055505050615a0c80620001626000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806398c61c371161011a578063da9d8aa0116100ad578063e5fd04e61161007c578063e5fd04e614610eb3578063e6bbe42414610eeb578063e78c81c414610f09578063e83f784314610f37578063fc0c546a14610fef576101fb565b8063da9d8aa014610d43578063ddd1b67e14610d71578063dea6cf4314610d8f578063df90f7ce14610dbd576101fb565b8063cc44a2fd116100e9578063cc44a2fd14610b75578063d0e3268114610bc5578063d1cf31b314610c91578063d58424a314610cd3576101fb565b806398c61c371461098c5780639d0b8b4414610a03578063a4c0e90a14610ac5578063ad998fa014610b1d576101fb565b806353fcb2f3116101925780637acab857116101615780637acab8571461075057806388c5f296146107a85780638da5cb5b146108f4578063911e8bc61461093e576101fb565b806353fcb2f31461066c578063582e7e9e1461069a578063762e7a34146106b8578063778db8d41461070c576101fb565b80632c779774116101ce5780632c779774146104645780632e9721b61461055a5780634ec0692c146105dc5780634f916fb01461061e576101fb565b80630df5202f1461020057806316d3e9661461024a5780631849d8ea1461039657806323a15e6b14610422575b600080fd5b610208611039565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103946004803603604081101561026057600080fd5b810190808035906020019064010000000081111561027d57600080fd5b82018360208201111561028f57600080fd5b803590602001918460208302840111640100000000831117156102b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561031157600080fd5b82018360208201111561032357600080fd5b8035906020019184602083028401116401000000008311171561034557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061105f565b005b6103e2600480360360408110156103ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f0565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b61044e6004803603602081101561043857600080fd5b810190808035906020019092919050505061164c565b6040518082815260200191505060405180910390f35b6105446004803603606081101561047a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156104c157600080fd5b8201836020820111156104d357600080fd5b803590602001918460208302840111640100000000831117156104f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061166d565b6040518082815260200191505060405180910390f35b6105c66004803603606081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118da565b6040518082815260200191505060405180910390f35b610608600480360360208110156105f257600080fd5b810190808035906020019092919050505061197e565b6040518082815260200191505060405180910390f35b61066a6004803603604081101561063457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611996565b005b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611c74565b005b6106a2611e2d565b6040518082815260200191505060405180910390f35b6106e4600480360360208110156106ce57600080fd5b8101908080359060200190929190505050611e33565b6040518084815260200183815260200182151515158152602001935050505060405180910390f35b61074e6004803603606081101561072257600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611e77565b005b6107926004803603602081101561076657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f57565b6040518082815260200191505060405180910390f35b6108f2600480360360408110156107be57600080fd5b81019080803590602001906401000000008111156107db57600080fd5b8201836020820111156107ed57600080fd5b8035906020019184602083028401116401000000008311171561080f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561086f57600080fd5b82018360208201111561088157600080fd5b803590602001918460208302840111640100000000831117156108a357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611f6f565b005b6108fc612160565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61098a6004803603604081101561095457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612186565b005b6109d8600480360360408110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b56565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610ac360048036036040811015610a1957600080fd5b810190808035906020019092919080359060200190640100000000811115610a4057600080fd5b820183602082011115610a5257600080fd5b80359060200191846020830284011164010000000083111715610a7457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612ba0565b005b610b1b60048036036060811015610adb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132ce565b005b610b5f60048036036020811015610b3357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a5565b6040518082815260200191505060405180910390f35b610ba160048036036020811015610b8b57600080fd5b81019080803590602001909291905050506135f1565b60405180848152602001838152602001828152602001935050505060405180910390f35b610c8f60048036036060811015610bdb57600080fd5b81019080803590602001909291908035906020019092919080359060200190640100000000811115610c0c57600080fd5b820183602082011115610c1e57600080fd5b80359060200191846020830284011164010000000083111715610c4057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050613628565b005b610cd160048036036060811015610ca757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061407f565b005b610d2960048036036060811015610ce957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050614155565b604051808215151515815260200191505060405180910390f35b610d6f60048036036020811015610d5957600080fd5b810190808035906020019092919050505061441e565b005b610d79614712565b6040518082815260200191505060405180910390f35b610dbb60048036036020811015610da557600080fd5b8101908080359060200190929190505050614722565b005b610e9d60048036036060811015610dd357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1057600080fd5b820183602082011115610e2257600080fd5b80359060200191846020830284011164010000000083111715610e4457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050614e4b565b6040518082815260200191505060405180910390f35b610ee960048036036040811015610ec957600080fd5b81019080803590602001909291908035906020019092919050505061514f565b005b610ef361549c565b6040518082815260200191505060405180910390f35b610f3560048036036020811015610f1f57600080fd5b81019080803590602001909291905050506154a2565b005b610fed60048036036020811015610f4d57600080fd5b8101908080359060200190640100000000811115610f6a57600080fd5b820183602082011115610f7c57600080fd5b80359060200191846020830284011164010000000083111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061552b565b005b610ff76158a0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b83518110156114225760016008600086848151811061108257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208483815181106110d057fe5b6020026020010151815481106110e257fe5b906000526020600020906005020160030154146110fe57600080fd5b6111b260045460066008600088868151811061111657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086858151811061116457fe5b60200260200101518154811061117657fe5b9060005260206000209060050201600201548154811061119257fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600860008684815181106111c257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084838151811061121057fe5b60200260200101518154811061122257fe5b90600052602060002090600502016001015401421161124057600080fd5b60006008600086848151811061125257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208483815181106112a057fe5b6020026020010151815481106112b257fe5b9060005260206000209060050201600401905060008090505b818054905081101561137d5761136e600760008886815181106112ea57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083838154811061133857fe5b90600052602060002001548154811061134d57fe5b9060005260206000209060090201600001548561590090919063ffffffff16565b935080806001019150506112cb565b506114126008600087858151811061139157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208584815181106113df57fe5b6020026020010151815481106113f157fe5b9060005260206000209060050201600001548461591f90919063ffffffff16565b9250508080600101915050611067565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114ee57600080fd5b505af1158015611502573d6000803e3d6000fd5b505050506040513d602081101561151857600080fd5b810190808051906020019092919050505061153257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341aaa9b6826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b81019080805190602001909291905050506115eb57600080fd5b505050565b6007602052816000526040600020818154811061160957fe5b9060005260206000209060090201600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600b818154811061165957fe5b906000526020600020016000915090505481565b60008060008090505b83518110156118305761169d868686848151811061169057fe5b6020026020010151614155565b80156117335750600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106116ee57fe5b9060005260206000209060090201600701600085838151811061170d57fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16155b1561182357600061180a600a600087858151811061174d57fe5b60200260200101518152602001908152602001600020546117fc600b88868151811061177557fe5b60200260200101518154811061178757fe5b9060005260206000200154600760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a815481106117dc57fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b905061181f818461590090919063ffffffff16565b9250505b8080600101915050611676565b506118d0600f6118c26005600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888154811061188557fe5b906000526020600020906009020160030154815481106118a157fe5b906000526020600020906003020160010154846158c690919063ffffffff16565b61593f90919063ffffffff16565b9150509392505050565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061192657fe5b906000526020600020906009020160080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600a6020528060005260406000206000915090505481565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106119e257fe5b90600052602060002090600902016004015414611a67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7374616b696e672073686f756c6420616374697665000000000000000000000081525060200191505060405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611ab357fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611b5057fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110611bf057fe5b90600052602060002090600902016006015461591f90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611c5a57fe5b906000526020600020906009020160060181905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050506040513d6020811015611d7b57600080fd5b8101908080519060200190929190505050611d9557600080fd5b611de781600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60045481565b60058181548110611e4057fe5b90600052602060002090600302016000915090508060000154908060010154908060020160009054906101000a900460ff16905083565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed157600080fd5b6005604051806060016040528085815260200184815260200183151581525090806001815401808255809150509060018203906000526020600020906003020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550505050505050565b60096020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc957600080fd5b60008090505b825181101561215b5761203d828281518110611fe757fe5b6020026020010151600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461591f90919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120f882828151811061208f57fe5b6020026020010151600960008685815181106120a757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b6009600085848151811061210857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611fcf565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000429050600454600c026004546005600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106121e057fe5b906000526020600020906009020160030154815481106121fc57fe5b90600052602060002090600302016000015402600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061225957fe5b9060005260206000209060090201600101540101811161227857600080fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106122c457fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161232257600080fd5b6005600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061236e57fe5b906000526020600020906009020160040154146123e7576005600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106123d157fe5b9060005260206000209060090201600401819055505b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061243357fe5b90600052602060002090600902016000015490506000806005600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061249657fe5b906000526020600020906009020160030154815481106124b257fe5b906000526020600020906003020160000154600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061250e57fe5b9060005260206000209060090201600201540190506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061256f57fe5b90600052602060002090600902016002015490505b818110156127bc57600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481106125d657fe5b9060005260206000209060090201600701600082815260200190815260200160002060009054906101000a900460ff16156127af576000612707600f6126f96005600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208c8154811061266157fe5b9060005260206000209060090201600301548154811061267d57fe5b906000526020600020906003020160010154600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208c815481106126d957fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600061275a600a60008581526020019081526020016000205461274c600b868154811061273257fe5b9060005260206000200154856158c690919063ffffffff16565b61593f90919063ffffffff16565b905061278261277360028361593f90919063ffffffff16565b8761590090919063ffffffff16565b95506127aa61279b60028361593f90919063ffffffff16565b8661590090919063ffffffff16565b945050505b8080600101915050612584565b506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061280957fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006128dd600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088815481106128aa57fe5b9060005260206000209060090201600601546128cf87876158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298857600080fd5b505af115801561299c573d6000803e3d6000fd5b505050506040513d60208110156129b257600080fd5b8101908080519060200190929190505050506000612a46600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612a1357fe5b906000526020600020906009020160060154612a3888876158c690919063ffffffff16565b61593f90919063ffffffff16565b9050612a9a81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16888a73ffffffffffffffffffffffffffffffffffffffff167fa54cec59552c7f022eed79ede59f759697aa5787f43b11d61f17bfc5adaffb658585604051808381526020018281526020019250505060405180910390a4505050505050505050565b60086020528160005260406000208181548110612b6f57fe5b9060005260206000209060050201600091509150508060000154908060010154908060020154908060030154905084565b600080600090505b8251811015612dfa57612bcf3385858481518110612bc257fe5b6020026020010151614155565b8015612c655750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612c2057fe5b90600052602060002090600902016007016000848381518110612c3f57fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16155b15612ded576000612d3c600a6000868581518110612c7f57fe5b6020026020010151815260200190815260200160002054612d2e600b878681518110612ca757fe5b602002602001015181548110612cb957fe5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612d0e57fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b9050612d51818461590090919063ffffffff16565b92506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110612d9f57fe5b90600052602060002090600902016007016000868581518110612dbe57fe5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550505b8080600101915050612ba8565b506000612eaf600f612ea1612e926005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612e5457fe5b90600052602060002090600902016003015481548110612e7057fe5b906000526020600020906003020160010154600f61591f90919063ffffffff16565b856158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b505050506040513d6020811015612fa657600080fd5b8101908080519060200190929190505050612fc057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663382e2aab826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561303557600080fd5b505af1158015613049573d6000803e3d6000fd5b505050506040513d602081101561305f57600080fd5b810190808051906020019092919050505061307957600080fd5b61308c818361591f90919063ffffffff16565b915060006130a460028461593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561314f57600080fd5b505af1158015613163573d6000803e3d6000fd5b505050506040513d602081101561317957600080fd5b810190808051906020019092919050505061319357600080fd5b6131e581600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fecd133e3f2aac41ac2b504cb693ec285651c4563abdf7efea7314a56831730ac8686846040518084815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156132b2578082015181840152602081019050613297565b5050505090500194505050505060405180910390a25050505050565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061331a57fe5b9060005260206000209060090201600401541461333657600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061338257fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146133db57600080fd5b61344981600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061342957fe5b90600052602060002090600902016006015461590090919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061349357fe5b90600052602060002090600902016006018190555080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106134f357fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fc4e7fb51a42ce926bb404f8024c3c91a40af0654d9a96ada67c329b9c9bee4a260405160405180910390a4505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600681815481106135fe57fe5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6000613632614712565b9050600080600090505b8351811015613bc9576136633385838151811061365557fe5b602002602001015185614155565b801561384557506005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208583815181106136b757fe5b6020026020010151815481106136c957fe5b906000526020600020906009020160030154815481106136e557fe5b906000526020600020906003020160020160009054906101000a900460ff168061384457506137d160646137c3604b6137b56004546005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b898151811061376757fe5b60200260200101518154811061377957fe5b9060005260206000209060090201600301548154811061379557fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b6158c690919063ffffffff16565b61593f90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085838151811061381c57fe5b60200260200101518154811061382e57fe5b9060005260206000209060090201600101540142115b5b15613bbc5761390e6138ff60646138f160068a8154811061386257fe5b906000526020600020906003020160020154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208987815181106138bf57fe5b6020026020010151815481106138d157fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b8361590090919063ffffffff16565b91506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085838151811061395d57fe5b60200260200101518154811061396f57fe5b906000526020600020906009020160020154905060006005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208785815181106139d257fe5b6020026020010151815481106139e457fe5b90600052602060002090600902016003015481548110613a0057fe5b9060005260206000209060030201600001548201905060006001860190505b818111613a7057613a4c85600a60008481526020019081526020016000205461591f90919063ffffffff16565b600a6000838152602001908152602001600020819055508080600101915050613a1f565b506000600190505b60068981548110613a8557fe5b9060005260206000209060030201600001548111613bb8576001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888681518110613aea57fe5b602002602001015181548110613afc57fe5b90600052602060002090600902016007016000838901815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888681518110613b8457fe5b602002602001015181548110613b9657fe5b9060005260206000209060090201600401819055508080600101915050613a78565b5050505b808060010191505061363c565b50600081905080851115613be3576000613be257600080fd5b5b6000613c296064613c1b60068a81548110613bfa57fe5b906000526020600020906003020160010154896158c690919063ffffffff16565b61593f90919063ffffffff16565b90506000613c40828861591f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613d0d57600080fd5b505af1158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b8101908080519060200190929190505050613d5157600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663382e2aab836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613dc657600080fd5b505af1158015613dda573d6000803e3d6000fd5b505050506040513d6020811015613df057600080fd5b8101908080519060200190929190505050613e0a57600080fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052808981526020014281526020018a8152602001600181526020018881525090806001815401808255809150509060018203906000526020600020906005020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613ee0929190615965565b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f8d57600080fd5b505af1158015613fa1573d6000803e3d6000fd5b505050506040513d6020811015613fb757600080fd5b8101908080519060200190929190505050613fd157600080fd5b873373ffffffffffffffffffffffffffffffffffffffff167f583f4a449110798c282200ea42774808b8147fa4bcb89a6ca406dd0650e034e789856001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500360405180848152602001838152602001828152602001935050505060405180910390a35050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146140d957600080fd5b60648111156140e757600080fd5b600660405180606001604052808581526020018481526020018381525090806001815401808255809150509060018203906000526020600020906003020160009091929091909150600082015181600001556020820151816001015560408201518160020155505050505050565b6000816001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106141a457fe5b906000526020600020906009020160020154011115801561429b5750816005600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061420d57fe5b9060005260206000209060090201600301548154811061422957fe5b906000526020600020906003020160000154600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061428557fe5b9060005260206000209060090201600201540110155b801561430257506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106142ee57fe5b906000526020600020906009020160040154145b8015614415575081614312614712565b14158061441457506144106143a6600454614398600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061437057fe5b90600052602060002090600902016002015461438a614712565b61591f90919063ffffffff16565b6158c690919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106143f057fe5b90600052602060002090600902016001015461590090919063ffffffff16565b4210155b5b90509392505050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161446a57600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006005838154811061450257fe5b90600052602060002090600302016000015461451c614712565b0190506000600161452b614712565b0190505b8181116145805761455c83600a60008481526020019081526020016000205461590090919063ffffffff16565b600a600083815260200190815260200160002081905550808060010191505061452f565b50600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e001604052808481526020014281526020016145df614712565b81526020018581526020016001815260200160008152602001600081525090806001815401808255809150509060018203906000526020600020906009020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050823373ffffffffffffffffffffffffffffffffffffffff167f680a0e2e97ad7c29da7985e37b699f19857c055166f801e50d90661eae30fcc3846001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003604051808381526020018281526020019250505060405180910390a3505050565b60006001600b8054905003905090565b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061476e57fe5b9060005260206000209060050201600301541461478a57600080fd5b426148196004546006600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106147dd57fe5b906000526020600020906005020160020154815481106147f957fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061486357fe5b906000526020600020906005020160010154011161488057600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061490a57fe5b9060005260206000209060050201600001546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156149b857600080fd5b505af11580156149cc573d6000803e3d6000fd5b505050506040513d60208110156149e257600080fd5b81019080805190602001909291905050506149fc57600080fd5b6002600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614a4857fe5b90600052602060002090600502016003018190555060008090505b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614aad57fe5b906000526020600020906005020160040180549050811015614df9576000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614b1557fe5b90600052602060002090600502016004018281548110614b3157fe5b906000526020600020015490506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b8a57fe5b9060005260206000209060090201600401819055506000614c25600454614c17600054600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110614bf757fe5b90600052602060002090600902016001015461591f90919063ffffffff16565b61593f90919063ffffffff16565b905060006005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c7557fe5b90600052602060002090600902016003015481548110614c9157fe5b9060005260206000209060030201600001548201905060006001614cb3614712565b0190505b818111614de8576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110614d0a57fe5b9060005260206000209060090201600701600087815260200190815260200160002060006101000a81548160ff021916908315150217905550614dc4600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110614d9057fe5b906000526020600020906009020160000154600a60008481526020019081526020016000205461590090919063ffffffff16565b600a6000838152602001908152602001600020819055508080600101915050614cb7565b505050508080600101915050614a63565b503373ffffffffffffffffffffffffffffffffffffffff167fe228353b4f08fee02276a1e9e2cddfa948f9fa59f87f7e24c18ad1b420d7966a826040518082815260200191505060405180910390a250565b600080614e56614712565b9050600080600090505b855181101561514257614e8787878381518110614e7957fe5b602002602001015185614155565b801561506957506005600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878381518110614edb57fe5b602002602001015181548110614eed57fe5b90600052602060002090600902016003015481548110614f0957fe5b906000526020600020906003020160020160009054906101000a900460ff16806150685750614ff56064614fe7604b614fd96004546005600760008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208d8981518110614f8b57fe5b602002602001015181548110614f9d57fe5b90600052602060002090600902016003015481548110614fb957fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b6158c690919063ffffffff16565b61593f90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087838151811061504057fe5b60200260200101518154811061505257fe5b9060005260206000209060090201600101540142115b5b156151355761513261512360646151156006898154811061508657fe5b906000526020600020906003020160020154600760008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b87815181106150e357fe5b6020026020010151815481106150f557fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b8361590090919063ffffffff16565b91505b8080600101915050614e60565b5080925050509392505050565b6000821161515c57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561523957600080fd5b505af115801561524d573d6000803e3d6000fd5b505050506040513d602081101561526357600080fd5b810190808051906020019092919050505061527d57600080fd5b60006005828154811061528c57fe5b9060005260206000209060030201600001546152a6614712565b019050600060016152b5614712565b0190505b81811161530a576152e684600a60008481526020019081526020016000205461590090919063ffffffff16565b600a60008381526020019081526020016000208190555080806001019150506152b9565b50600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e00160405280858152602001428152602001615369614712565b81526020018481526020016001815260200160008152602001600081525090806001815401808255809150509060018203906000526020600020906009020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050813373ffffffffffffffffffffffffffffffffffffffff167f680a0e2e97ad7c29da7985e37b699f19857c055166f801e50d90661eae30fcc3856001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003604051808381526020018281526020019250505060405180910390a3505050565b60005481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146154fc57600080fd5b600b81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008090505b815181101561589c5761565b6155de6004546005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086868151811061559057fe5b6020026020010151815481106155a257fe5b906000526020600020906009020160030154815481106155be57fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084848151811061562957fe5b60200260200101518154811061563b57fe5b90600052602060002090600902016001015461590090919063ffffffff16565b42101561566757600080fd5b6003600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208383815181106156b457fe5b6020026020010151815481106156c657fe5b906000526020600020906009020160040181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085858151811061576557fe5b60200260200101518154811061577757fe5b9060005260206000209060090201600001546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156157f257600080fd5b505af1158015615806573d6000803e3d6000fd5b505050506040513d602081101561581c57600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff167f4854321cc9be1d947b907185d497d36fe671cfb8f0dcbcdc84a01be76f81bff283838151811061587257fe5b60200260200101516040518082815260200191505060405180910390a28080600101915050615531565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808314156158d957600090506158fa565b60008284029050828482816158ea57fe5b04146158f557600080fd5b809150505b92915050565b60008082840190508381101561591557600080fd5b8091505092915050565b60008282111561592e57600080fd5b600082840390508091505092915050565b600080821161594d57600080fd5b600082848161595857fe5b0490508091505092915050565b8280548282559060005260206000209081019282156159a1579160200282015b828111156159a0578251825591602001919060010190615985565b5b5090506159ae91906159b2565b5090565b6159d491905b808211156159d05760008160009055506001016159b8565b5090565b9056fea265627a7a72305820589f6b96b844e90eb24517ceddc62373fb1ad3d9dfccda50d83429c18557f63d64736f6c634300050a0032000000000000000000000000ef1344bdf80bef3ff4428d8becec3eea4a2cf57400000000000000000000000020ee679d73559e4c4b5e3b3042b61be723828d6c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806398c61c371161011a578063da9d8aa0116100ad578063e5fd04e61161007c578063e5fd04e614610eb3578063e6bbe42414610eeb578063e78c81c414610f09578063e83f784314610f37578063fc0c546a14610fef576101fb565b8063da9d8aa014610d43578063ddd1b67e14610d71578063dea6cf4314610d8f578063df90f7ce14610dbd576101fb565b8063cc44a2fd116100e9578063cc44a2fd14610b75578063d0e3268114610bc5578063d1cf31b314610c91578063d58424a314610cd3576101fb565b806398c61c371461098c5780639d0b8b4414610a03578063a4c0e90a14610ac5578063ad998fa014610b1d576101fb565b806353fcb2f3116101925780637acab857116101615780637acab8571461075057806388c5f296146107a85780638da5cb5b146108f4578063911e8bc61461093e576101fb565b806353fcb2f31461066c578063582e7e9e1461069a578063762e7a34146106b8578063778db8d41461070c576101fb565b80632c779774116101ce5780632c779774146104645780632e9721b61461055a5780634ec0692c146105dc5780634f916fb01461061e576101fb565b80630df5202f1461020057806316d3e9661461024a5780631849d8ea1461039657806323a15e6b14610422575b600080fd5b610208611039565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103946004803603604081101561026057600080fd5b810190808035906020019064010000000081111561027d57600080fd5b82018360208201111561028f57600080fd5b803590602001918460208302840111640100000000831117156102b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561031157600080fd5b82018360208201111561032357600080fd5b8035906020019184602083028401116401000000008311171561034557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061105f565b005b6103e2600480360360408110156103ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f0565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b61044e6004803603602081101561043857600080fd5b810190808035906020019092919050505061164c565b6040518082815260200191505060405180910390f35b6105446004803603606081101561047a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156104c157600080fd5b8201836020820111156104d357600080fd5b803590602001918460208302840111640100000000831117156104f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061166d565b6040518082815260200191505060405180910390f35b6105c66004803603606081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118da565b6040518082815260200191505060405180910390f35b610608600480360360208110156105f257600080fd5b810190808035906020019092919050505061197e565b6040518082815260200191505060405180910390f35b61066a6004803603604081101561063457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611996565b005b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611c74565b005b6106a2611e2d565b6040518082815260200191505060405180910390f35b6106e4600480360360208110156106ce57600080fd5b8101908080359060200190929190505050611e33565b6040518084815260200183815260200182151515158152602001935050505060405180910390f35b61074e6004803603606081101561072257600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611e77565b005b6107926004803603602081101561076657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f57565b6040518082815260200191505060405180910390f35b6108f2600480360360408110156107be57600080fd5b81019080803590602001906401000000008111156107db57600080fd5b8201836020820111156107ed57600080fd5b8035906020019184602083028401116401000000008311171561080f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561086f57600080fd5b82018360208201111561088157600080fd5b803590602001918460208302840111640100000000831117156108a357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611f6f565b005b6108fc612160565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61098a6004803603604081101561095457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612186565b005b6109d8600480360360408110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b56565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610ac360048036036040811015610a1957600080fd5b810190808035906020019092919080359060200190640100000000811115610a4057600080fd5b820183602082011115610a5257600080fd5b80359060200191846020830284011164010000000083111715610a7457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612ba0565b005b610b1b60048036036060811015610adb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132ce565b005b610b5f60048036036020811015610b3357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135a5565b6040518082815260200191505060405180910390f35b610ba160048036036020811015610b8b57600080fd5b81019080803590602001909291905050506135f1565b60405180848152602001838152602001828152602001935050505060405180910390f35b610c8f60048036036060811015610bdb57600080fd5b81019080803590602001909291908035906020019092919080359060200190640100000000811115610c0c57600080fd5b820183602082011115610c1e57600080fd5b80359060200191846020830284011164010000000083111715610c4057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050613628565b005b610cd160048036036060811015610ca757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061407f565b005b610d2960048036036060811015610ce957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050614155565b604051808215151515815260200191505060405180910390f35b610d6f60048036036020811015610d5957600080fd5b810190808035906020019092919050505061441e565b005b610d79614712565b6040518082815260200191505060405180910390f35b610dbb60048036036020811015610da557600080fd5b8101908080359060200190929190505050614722565b005b610e9d60048036036060811015610dd357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1057600080fd5b820183602082011115610e2257600080fd5b80359060200191846020830284011164010000000083111715610e4457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050614e4b565b6040518082815260200191505060405180910390f35b610ee960048036036040811015610ec957600080fd5b81019080803590602001909291908035906020019092919050505061514f565b005b610ef361549c565b6040518082815260200191505060405180910390f35b610f3560048036036020811015610f1f57600080fd5b81019080803590602001909291905050506154a2565b005b610fed60048036036020811015610f4d57600080fd5b8101908080359060200190640100000000811115610f6a57600080fd5b820183602082011115610f7c57600080fd5b80359060200191846020830284011164010000000083111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061552b565b005b610ff76158a0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b83518110156114225760016008600086848151811061108257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208483815181106110d057fe5b6020026020010151815481106110e257fe5b906000526020600020906005020160030154146110fe57600080fd5b6111b260045460066008600088868151811061111657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086858151811061116457fe5b60200260200101518154811061117657fe5b9060005260206000209060050201600201548154811061119257fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600860008684815181106111c257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084838151811061121057fe5b60200260200101518154811061122257fe5b90600052602060002090600502016001015401421161124057600080fd5b60006008600086848151811061125257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208483815181106112a057fe5b6020026020010151815481106112b257fe5b9060005260206000209060050201600401905060008090505b818054905081101561137d5761136e600760008886815181106112ea57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083838154811061133857fe5b90600052602060002001548154811061134d57fe5b9060005260206000209060090201600001548561590090919063ffffffff16565b935080806001019150506112cb565b506114126008600087858151811061139157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208584815181106113df57fe5b6020026020010151815481106113f157fe5b9060005260206000209060050201600001548461591f90919063ffffffff16565b9250508080600101915050611067565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114ee57600080fd5b505af1158015611502573d6000803e3d6000fd5b505050506040513d602081101561151857600080fd5b810190808051906020019092919050505061153257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341aaa9b6826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506040513d60208110156115d157600080fd5b81019080805190602001909291905050506115eb57600080fd5b505050565b6007602052816000526040600020818154811061160957fe5b9060005260206000209060090201600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600b818154811061165957fe5b906000526020600020016000915090505481565b60008060008090505b83518110156118305761169d868686848151811061169057fe5b6020026020010151614155565b80156117335750600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106116ee57fe5b9060005260206000209060090201600701600085838151811061170d57fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16155b1561182357600061180a600a600087858151811061174d57fe5b60200260200101518152602001908152602001600020546117fc600b88868151811061177557fe5b60200260200101518154811061178757fe5b9060005260206000200154600760008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208a815481106117dc57fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b905061181f818461590090919063ffffffff16565b9250505b8080600101915050611676565b506118d0600f6118c26005600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888154811061188557fe5b906000526020600020906009020160030154815481106118a157fe5b906000526020600020906003020160010154846158c690919063ffffffff16565b61593f90919063ffffffff16565b9150509392505050565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061192657fe5b906000526020600020906009020160080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600a6020528060005260406000206000915090505481565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106119e257fe5b90600052602060002090600902016004015414611a67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7374616b696e672073686f756c6420616374697665000000000000000000000081525060200191505060405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611ab357fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611b5057fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c1081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110611bf057fe5b90600052602060002090600902016006015461591f90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611c5a57fe5b906000526020600020906009020160060181905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050506040513d6020811015611d7b57600080fd5b8101908080519060200190929190505050611d9557600080fd5b611de781600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60045481565b60058181548110611e4057fe5b90600052602060002090600302016000915090508060000154908060010154908060020160009054906101000a900460ff16905083565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed157600080fd5b6005604051806060016040528085815260200184815260200183151581525090806001815401808255809150509060018203906000526020600020906003020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550505050505050565b60096020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc957600080fd5b60008090505b825181101561215b5761203d828281518110611fe757fe5b6020026020010151600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461591f90919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120f882828151811061208f57fe5b6020026020010151600960008685815181106120a757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b6009600085848151811061210857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611fcf565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000429050600454600c026004546005600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106121e057fe5b906000526020600020906009020160030154815481106121fc57fe5b90600052602060002090600302016000015402600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061225957fe5b9060005260206000209060090201600101540101811161227857600080fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106122c457fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161232257600080fd5b6005600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061236e57fe5b906000526020600020906009020160040154146123e7576005600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106123d157fe5b9060005260206000209060090201600401819055505b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061243357fe5b90600052602060002090600902016000015490506000806005600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061249657fe5b906000526020600020906009020160030154815481106124b257fe5b906000526020600020906003020160000154600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061250e57fe5b9060005260206000209060090201600201540190506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061256f57fe5b90600052602060002090600902016002015490505b818110156127bc57600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481106125d657fe5b9060005260206000209060090201600701600082815260200190815260200160002060009054906101000a900460ff16156127af576000612707600f6126f96005600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208c8154811061266157fe5b9060005260206000209060090201600301548154811061267d57fe5b906000526020600020906003020160010154600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208c815481106126d957fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600061275a600a60008581526020019081526020016000205461274c600b868154811061273257fe5b9060005260206000200154856158c690919063ffffffff16565b61593f90919063ffffffff16565b905061278261277360028361593f90919063ffffffff16565b8761590090919063ffffffff16565b95506127aa61279b60028361593f90919063ffffffff16565b8661590090919063ffffffff16565b945050505b8080600101915050612584565b506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061280957fe5b906000526020600020906009020160080160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006128dd600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088815481106128aa57fe5b9060005260206000209060090201600601546128cf87876158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298857600080fd5b505af115801561299c573d6000803e3d6000fd5b505050506040513d60208110156129b257600080fd5b8101908080519060200190929190505050506000612a46600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612a1357fe5b906000526020600020906009020160060154612a3888876158c690919063ffffffff16565b61593f90919063ffffffff16565b9050612a9a81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16888a73ffffffffffffffffffffffffffffffffffffffff167fa54cec59552c7f022eed79ede59f759697aa5787f43b11d61f17bfc5adaffb658585604051808381526020018281526020019250505060405180910390a4505050505050505050565b60086020528160005260406000208181548110612b6f57fe5b9060005260206000209060050201600091509150508060000154908060010154908060020154908060030154905084565b600080600090505b8251811015612dfa57612bcf3385858481518110612bc257fe5b6020026020010151614155565b8015612c655750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612c2057fe5b90600052602060002090600902016007016000848381518110612c3f57fe5b6020026020010151815260200190815260200160002060009054906101000a900460ff16155b15612ded576000612d3c600a6000868581518110612c7f57fe5b6020026020010151815260200190815260200160002054612d2e600b878681518110612ca757fe5b602002602001015181548110612cb957fe5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612d0e57fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b9050612d51818461590090919063ffffffff16565b92506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110612d9f57fe5b90600052602060002090600902016007016000868581518110612dbe57fe5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550505b8080600101915050612ba8565b506000612eaf600f612ea1612e926005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612e5457fe5b90600052602060002090600902016003015481548110612e7057fe5b906000526020600020906003020160010154600f61591f90919063ffffffff16565b856158c690919063ffffffff16565b61593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f7c57600080fd5b505af1158015612f90573d6000803e3d6000fd5b505050506040513d6020811015612fa657600080fd5b8101908080519060200190929190505050612fc057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663382e2aab826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561303557600080fd5b505af1158015613049573d6000803e3d6000fd5b505050506040513d602081101561305f57600080fd5b810190808051906020019092919050505061307957600080fd5b61308c818361591f90919063ffffffff16565b915060006130a460028461593f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561314f57600080fd5b505af1158015613163573d6000803e3d6000fd5b505050506040513d602081101561317957600080fd5b810190808051906020019092919050505061319357600080fd5b6131e581600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461590090919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fecd133e3f2aac41ac2b504cb693ec285651c4563abdf7efea7314a56831730ac8686846040518084815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156132b2578082015181840152602081019050613297565b5050505090500194505050505060405180910390a25050505050565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061331a57fe5b9060005260206000209060090201600401541461333657600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061338257fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146133db57600080fd5b61344981600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061342957fe5b90600052602060002090600902016006015461590090919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061349357fe5b90600052602060002090600902016006018190555080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106134f357fe5b906000526020600020906009020160080160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fc4e7fb51a42ce926bb404f8024c3c91a40af0654d9a96ada67c329b9c9bee4a260405160405180910390a4505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600681815481106135fe57fe5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6000613632614712565b9050600080600090505b8351811015613bc9576136633385838151811061365557fe5b602002602001015185614155565b801561384557506005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208583815181106136b757fe5b6020026020010151815481106136c957fe5b906000526020600020906009020160030154815481106136e557fe5b906000526020600020906003020160020160009054906101000a900460ff168061384457506137d160646137c3604b6137b56004546005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b898151811061376757fe5b60200260200101518154811061377957fe5b9060005260206000209060090201600301548154811061379557fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b6158c690919063ffffffff16565b61593f90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085838151811061381c57fe5b60200260200101518154811061382e57fe5b9060005260206000209060090201600101540142115b5b15613bbc5761390e6138ff60646138f160068a8154811061386257fe5b906000526020600020906003020160020154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208987815181106138bf57fe5b6020026020010151815481106138d157fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b8361590090919063ffffffff16565b91506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085838151811061395d57fe5b60200260200101518154811061396f57fe5b906000526020600020906009020160020154905060006005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208785815181106139d257fe5b6020026020010151815481106139e457fe5b90600052602060002090600902016003015481548110613a0057fe5b9060005260206000209060030201600001548201905060006001860190505b818111613a7057613a4c85600a60008481526020019081526020016000205461591f90919063ffffffff16565b600a6000838152602001908152602001600020819055508080600101915050613a1f565b506000600190505b60068981548110613a8557fe5b9060005260206000209060030201600001548111613bb8576001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888681518110613aea57fe5b602002602001015181548110613afc57fe5b90600052602060002090600902016007016000838901815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020888681518110613b8457fe5b602002602001015181548110613b9657fe5b9060005260206000209060090201600401819055508080600101915050613a78565b5050505b808060010191505061363c565b50600081905080851115613be3576000613be257600080fd5b5b6000613c296064613c1b60068a81548110613bfa57fe5b906000526020600020906003020160010154896158c690919063ffffffff16565b61593f90919063ffffffff16565b90506000613c40828861591f90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613d0d57600080fd5b505af1158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b8101908080519060200190929190505050613d5157600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663382e2aab836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613dc657600080fd5b505af1158015613dda573d6000803e3d6000fd5b505050506040513d6020811015613df057600080fd5b8101908080519060200190929190505050613e0a57600080fd5b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a001604052808981526020014281526020018a8152602001600181526020018881525090806001815401808255809150509060018203906000526020600020906005020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613ee0929190615965565b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f8d57600080fd5b505af1158015613fa1573d6000803e3d6000fd5b505050506040513d6020811015613fb757600080fd5b8101908080519060200190929190505050613fd157600080fd5b873373ffffffffffffffffffffffffffffffffffffffff167f583f4a449110798c282200ea42774808b8147fa4bcb89a6ca406dd0650e034e789856001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500360405180848152602001838152602001828152602001935050505060405180910390a35050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146140d957600080fd5b60648111156140e757600080fd5b600660405180606001604052808581526020018481526020018381525090806001815401808255809150509060018203906000526020600020906003020160009091929091909150600082015181600001556020820151816001015560408201518160020155505050505050565b6000816001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106141a457fe5b906000526020600020906009020160020154011115801561429b5750816005600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061420d57fe5b9060005260206000209060090201600301548154811061422957fe5b906000526020600020906003020160000154600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061428557fe5b9060005260206000209060090201600201540110155b801561430257506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106142ee57fe5b906000526020600020906009020160040154145b8015614415575081614312614712565b14158061441457506144106143a6600454614398600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811061437057fe5b90600052602060002090600902016002015461438a614712565b61591f90919063ffffffff16565b6158c690919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106143f057fe5b90600052602060002090600902016001015461590090919063ffffffff16565b4210155b5b90509392505050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161446a57600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006005838154811061450257fe5b90600052602060002090600302016000015461451c614712565b0190506000600161452b614712565b0190505b8181116145805761455c83600a60008481526020019081526020016000205461590090919063ffffffff16565b600a600083815260200190815260200160002081905550808060010191505061452f565b50600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e001604052808481526020014281526020016145df614712565b81526020018581526020016001815260200160008152602001600081525090806001815401808255809150509060018203906000526020600020906009020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050823373ffffffffffffffffffffffffffffffffffffffff167f680a0e2e97ad7c29da7985e37b699f19857c055166f801e50d90661eae30fcc3846001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003604051808381526020018281526020019250505060405180910390a3505050565b60006001600b8054905003905090565b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061476e57fe5b9060005260206000209060050201600301541461478a57600080fd5b426148196004546006600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106147dd57fe5b906000526020600020906005020160020154815481106147f957fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061486357fe5b906000526020600020906005020160010154011161488057600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061490a57fe5b9060005260206000209060050201600001546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156149b857600080fd5b505af11580156149cc573d6000803e3d6000fd5b505050506040513d60208110156149e257600080fd5b81019080805190602001909291905050506149fc57600080fd5b6002600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614a4857fe5b90600052602060002090600502016003018190555060008090505b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614aad57fe5b906000526020600020906005020160040180549050811015614df9576000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614b1557fe5b90600052602060002090600502016004018281548110614b3157fe5b906000526020600020015490506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b8a57fe5b9060005260206000209060090201600401819055506000614c25600454614c17600054600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110614bf757fe5b90600052602060002090600902016001015461591f90919063ffffffff16565b61593f90919063ffffffff16565b905060006005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c7557fe5b90600052602060002090600902016003015481548110614c9157fe5b9060005260206000209060030201600001548201905060006001614cb3614712565b0190505b818111614de8576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110614d0a57fe5b9060005260206000209060090201600701600087815260200190815260200160002060006101000a81548160ff021916908315150217905550614dc4600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110614d9057fe5b906000526020600020906009020160000154600a60008481526020019081526020016000205461590090919063ffffffff16565b600a6000838152602001908152602001600020819055508080600101915050614cb7565b505050508080600101915050614a63565b503373ffffffffffffffffffffffffffffffffffffffff167fe228353b4f08fee02276a1e9e2cddfa948f9fa59f87f7e24c18ad1b420d7966a826040518082815260200191505060405180910390a250565b600080614e56614712565b9050600080600090505b855181101561514257614e8787878381518110614e7957fe5b602002602001015185614155565b801561506957506005600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878381518110614edb57fe5b602002602001015181548110614eed57fe5b90600052602060002090600902016003015481548110614f0957fe5b906000526020600020906003020160020160009054906101000a900460ff16806150685750614ff56064614fe7604b614fd96004546005600760008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208d8981518110614f8b57fe5b602002602001015181548110614f9d57fe5b90600052602060002090600902016003015481548110614fb957fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b6158c690919063ffffffff16565b61593f90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087838151811061504057fe5b60200260200101518154811061505257fe5b9060005260206000209060090201600101540142115b5b156151355761513261512360646151156006898154811061508657fe5b906000526020600020906003020160020154600760008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b87815181106150e357fe5b6020026020010151815481106150f557fe5b9060005260206000209060090201600001546158c690919063ffffffff16565b61593f90919063ffffffff16565b8361590090919063ffffffff16565b91505b8080600101915050614e60565b5080925050509392505050565b6000821161515c57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561523957600080fd5b505af115801561524d573d6000803e3d6000fd5b505050506040513d602081101561526357600080fd5b810190808051906020019092919050505061527d57600080fd5b60006005828154811061528c57fe5b9060005260206000209060030201600001546152a6614712565b019050600060016152b5614712565b0190505b81811161530a576152e684600a60008481526020019081526020016000205461590090919063ffffffff16565b600a60008381526020019081526020016000208190555080806001019150506152b9565b50600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e00160405280858152602001428152602001615369614712565b81526020018481526020016001815260200160008152602001600081525090806001815401808255809150509060018203906000526020600020906009020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050813373ffffffffffffffffffffffffffffffffffffffff167f680a0e2e97ad7c29da7985e37b699f19857c055166f801e50d90661eae30fcc3856001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003604051808381526020018281526020019250505060405180910390a3505050565b60005481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146154fc57600080fd5b600b81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008090505b815181101561589c5761565b6155de6004546005600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086868151811061559057fe5b6020026020010151815481106155a257fe5b906000526020600020906009020160030154815481106155be57fe5b9060005260206000209060030201600001546158c690919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084848151811061562957fe5b60200260200101518154811061563b57fe5b90600052602060002090600902016001015461590090919063ffffffff16565b42101561566757600080fd5b6003600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208383815181106156b457fe5b6020026020010151815481106156c657fe5b906000526020600020906009020160040181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085858151811061576557fe5b60200260200101518154811061577757fe5b9060005260206000209060090201600001546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156157f257600080fd5b505af1158015615806573d6000803e3d6000fd5b505050506040513d602081101561581c57600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff167f4854321cc9be1d947b907185d497d36fe671cfb8f0dcbcdc84a01be76f81bff283838151811061587257fe5b60200260200101516040518082815260200191505060405180910390a28080600101915050615531565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808314156158d957600090506158fa565b60008284029050828482816158ea57fe5b04146158f557600080fd5b809150505b92915050565b60008082840190508381101561591557600080fd5b8091505092915050565b60008282111561592e57600080fd5b600082840390508091505092915050565b600080821161594d57600080fd5b600082848161595857fe5b0490508091505092915050565b8280548282559060005260206000209081019282156159a1579160200282015b828111156159a0578251825591602001919060010190615985565b5b5090506159ae91906159b2565b5090565b6159d491905b808211156159d05760008160009055506001016159b8565b5090565b9056fea265627a7a72305820589f6b96b844e90eb24517ceddc62373fb1ad3d9dfccda50d83429c18557f63d64736f6c634300050a0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ef1344bdf80bef3ff4428d8becec3eea4a2cf57400000000000000000000000020ee679d73559e4c4b5e3b3042b61be723828d6c
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0xeF1344bDf80BEf3Ff4428d8bECEC3eea4A2cF574
Arg [1] : _nrtAddress (address): 0x20ee679D73559e4c4B5E3B3042B61bE723828d6C
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ef1344bdf80bef3ff4428d8becec3eea4a2cf574
Arg [1] : 00000000000000000000000020ee679d73559e4c4b5e3b3042b61be723828d6c
Deployed Bytecode Sourcemap
794:33291:14:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;794:33291:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2368:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25067:1428;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25067:1428:14;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25067:1428:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25067:1428:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25067:1428:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25067:1428:14;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25067:1428:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25067:1428:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25067:1428:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25067:1428:14;;;;;;;;;;;;;;;:::i;:::-;;2735:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2735:45:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3142:35;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3142:35:14;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13680:1371;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13680:1371:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;13680:1371:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13680:1371:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;13680:1371:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;13680:1371:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28322:207;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28322:207:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2937:55;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2937:55:14;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30066:467;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30066:467:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9274:220;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9274:220:14;;;;;;;;;;;;;;;;;:::i;:::-;;2468:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2632:33;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2632:33:14;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5895:336;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5895:336:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2831:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2831:47:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9742:370;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9742:370:14;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9742:370:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9742:370:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9742:370:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9742:370:14;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9742:370:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9742:370:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9742:370:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9742:370:14;;;;;;;;;;;;;;;:::i;:::-;;2316:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30755:3328;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30755:3328:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2786:39;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2786:39:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15281:1715;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15281:1715:14;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15281:1715:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15281:1715:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15281:1715:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15281:1715:14;;;;;;;;;;;;;;;:::i;:::-;;27396:627;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27396:627:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8819:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8819:140:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2671:27;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2671:27:14;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20128:3187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20128:3187:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;20128:3187:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20128:3187:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;20128:3187:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;20128:3187:14;;;;;;;;;;;;;;;:::i;:::-;;6620:448;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6620:448:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12040:1322;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12040:1322:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10371;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10371:1322:14;;;;;;;;;;;;;;;;;:::i;:::-;;5369:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23456:1605;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23456:1605:14;;;;;;;;;;;;;;;;;:::i;:::-;;18200:1503;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18200:1503:14;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;18200:1503:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18200:1503:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;18200:1503:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;18200:1503:14;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7328:1304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7328:1304:14;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2278:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5119:121;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5119:121:14;;;;;;;;;;;;;;;;;:::i;:::-;;17191:634;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17191:634:14;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17191:634:14;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17191:634:14;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;17191:634:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17191:634:14;;;;;;;;;;;;;;;:::i;:::-;;2342:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2368:28;;;;;;;;;;;;;:::o;25067:1428::-;25175:21;25210:9;25222:1;25210:13;;25206:1133;25229:13;:20;25225:1;:24;25206:1133;;;25350:1;25295:5;:25;25302:13;25316:1;25302:16;;;;;;;;;;;;;;25295:25;;;;;;;;;;;;;;;25322:12;25335:1;25322:15;;;;;;;;;;;;;;25295:44;;;;;;;;;;;;;;;;;;:51;;;:56;25270:145;;;;;;25549:104;25633:19;;25549:9;25560:5;:25;25567:13;25581:1;25567:16;;;;;;;;;;;;;;25560:25;;;;;;;;;;;;;;;25587:12;25600:1;25587:15;;;;;;;;;;;;;;25560:44;;;;;;;;;;;;;;;;;;:55;;;25549:68;;;;;;;;;;;;;;;;;;:79;;;:83;;:104;;;;:::i;:::-;25476:5;:25;25483:13;25497:1;25483:16;;;;;;;;;;;;;;25476:25;;;;;;;;;;;;;;;25503:12;25516:1;25503:15;;;;;;;;;;;;;;25476:44;;;;;;;;;;;;;;;;;;:54;;;:177;25454:3;:199;25429:302;;;;;;25745:35;25783:5;:25;25790:13;25804:1;25790:16;;;;;;;;;;;;;;25783:25;;;;;;;;;;;;;;;25810:12;25823:1;25810:15;;;;;;;;;;;;;;25783:44;;;;;;;;;;;;;;;;;;:55;;25745:93;;25937:9;25949:1;25937:13;;25933:224;25956:17;:24;;;;25952:1;:28;25933:224;;;26021:121;26060:8;:28;26070:13;26084:1;26070:16;;;;;;;;;;;;;;26060:28;;;;;;;;;;;;;;;26090:17;26108:1;26090:20;;;;;;;;;;;;;;;;26060:52;;;;;;;;;;;;;;;;;;:64;;;26021:13;:17;;:121;;;;:::i;:::-;26005:137;;25982:3;;;;;;;25933:224;;;;26223:105;26258:5;:25;26265:13;26279:1;26265:16;;;;;;;;;;;;;;26258:25;;;;;;;;;;;;;;;26285:12;26298:1;26285:15;;;;;;;;;;;;;;26258:44;;;;;;;;;;;;;;;;;;:56;;;26223:13;:17;;:105;;;;:::i;:::-;26207:121;;25206:1133;25251:3;;;;;;;25206:1133;;;;26356:5;;;;;;;;;;;:14;;;26379:10;;;;;;;;;;;26392:13;26356:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26356:50:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26356:50:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26356:50:14;;;;;;;;;;;;;;;;26348:59;;;;;;26425:10;;;;;;;;;;;:24;;;26450:13;26425:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26425:39:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26425:39:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26425:39:14;;;;;;;;;;;;;;;;26417:48;;;;;;25067:1428;;;:::o;2735:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3142:35::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13680:1371::-;13837:7;13856:26;13896:9;13908:1;13896:13;;13892:1007;13915:7;:14;13911:1;:18;13892:1007;;;14442:53;14458:12;14472:10;14484:7;14492:1;14484:10;;;;;;;;;;;;;;14442:15;:53::i;:::-;:131;;;;;14512:8;:22;14521:12;14512:22;;;;;;;;;;;;;;;14535:10;14512:34;;;;;;;;;;;;;;;;;;:49;;:61;14562:7;14570:1;14562:10;;;;;;;;;;;;;;14512:61;;;;;;;;;;;;;;;;;;;;;14511:62;14442:131;14439:450;;;14593:15;14611:193;14770:19;:33;14791:7;14799:1;14791:10;;;;;;;;;;;;;;14770:33;;;;;;;;;;;;14611:119;14697:18;14717:7;14725:1;14717:10;;;;;;;;;;;;;;14697:32;;;;;;;;;;;;;;;;14611:8;:22;14620:12;14611:22;;;;;;;;;;;;;;;14634:10;14611:34;;;;;;;;;;;;;;;;;;:46;;;:85;;:119;;;;:::i;:::-;:158;;:193;;;;:::i;:::-;14593:211;;14843:31;14866:7;14843:18;:22;;:31;;;;:::i;:::-;14822:52;;14439:450;;13931:3;;;;;;;13892:1007;;;;14915:129;15041:2;14915:121;14949:12;14962:8;:22;14971:12;14962:22;;;;;;;;;;;;;;;14985:10;14962:34;;;;;;;;;;;;;;;;;;:48;;;14949:62;;;;;;;;;;;;;;;;;;:77;;;14915:18;:22;;:121;;;;:::i;:::-;:125;;:129;;;;:::i;:::-;14908:136;;;13680:1371;;;;;:::o;28322:207::-;28434:7;28460:8;:22;28469:12;28460:22;;;;;;;;;;;;;;;28483:10;28460:34;;;;;;;;;;;;;;;;;;:45;;:62;28506:15;28460:62;;;;;;;;;;;;;;;;28453:69;;28322:207;;;;;:::o;2937:55::-;;;;;;;;;;;;;;;;;:::o;30066:467::-;30202:1;30159:8;:20;30168:10;30159:20;;;;;;;;;;;;;;;30180:10;30159:32;;;;;;;;;;;;;;;;;;:39;;;:44;30151:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30239:18;30260:8;:20;30269:10;30260:20;;;;;;;;;;;;;;;30281:10;30260:32;;;;;;;;;;;;;;;;;;:43;;:55;30304:10;30260:55;;;;;;;;;;;;;;;;30239:76;;30388:1;30325:8;:20;30334:10;30325:20;;;;;;;;;;;;;;;30346:10;30325:32;;;;;;;;;;;;;;;;;;:43;;:60;30369:15;30325:60;;;;;;;;;;;;;;;:64;;;;30456:70;30515:10;30456:8;:20;30465:10;30456:20;;;;;;;;;;;;;;;30477:10;30456:32;;;;;;;;;;;;;;;;;;:54;;;:58;;:70;;;;:::i;:::-;30399:8;:20;30408:10;30399:20;;;;;;;;;;;;;;;30420:10;30399:32;;;;;;;;;;;;;;;;;;:54;;:127;;;;30066:467;;;:::o;9274:220::-;9348:5;;;;;;;;;;;:18;;;9367:10;9387:4;9394:12;9348:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9348:59:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9348:59:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9348:59:14;;;;;;;;;;;;;;;;9340:68;;;;;;9445:42;9474:12;9445;:24;9458:10;9445:24;;;;;;;;;;;;;;;;:28;;:42;;;;:::i;:::-;9418:12;:24;9431:10;9418:24;;;;;;;;;;;;;;;:69;;;;9274:220;:::o;2468:44::-;;;;:::o;2632:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5895:336::-;4467:5;;;;;;;;;;;4453:19;;:10;:19;;;4434:88;;;;;;6018:12;6036:187;;;;;;;;6070:7;6036:187;;;;6107:15;6036:187;;;;6192:20;6036:187;;;;;6018:206;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6018:206:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5895:336;;;:::o;2831:47::-;;;;;;;;;;;;;;;;;:::o;9742:370::-;4467:5;;;;;;;;;;;4453:19;;:10;:19;;;4434:88;;;;;;9864:9;9876:1;9864:13;;9860:246;9883:10;:17;9879:1;:21;9860:246;;;9948:50;9977:17;9995:1;9977:20;;;;;;;;;;;;;;9948:12;:24;9961:10;9948:24;;;;;;;;;;;;;;;;:28;;:50;;;;:::i;:::-;9921:12;:24;9934:10;9921:24;;;;;;;;;;;;;;;:77;;;;10042:53;10074:17;10092:1;10074:20;;;;;;;;;;;;;;10042:12;:27;10055:10;10066:1;10055:13;;;;;;;;;;;;;;10042:27;;;;;;;;;;;;;;;;:31;;:53;;;;:::i;:::-;10012:12;:27;10025:10;10036:1;10025:13;;;;;;;;;;;;;;10012:27;;;;;;;;;;;;;;;:83;;;;9902:3;;;;;;;9860:246;;;;9742:370;;:::o;2316:20::-;;;;;;;;;;;;;:::o;30755:3328::-;30869:19;30891:3;30869:25;;31114:19;;31109:2;:24;31067:19;;30995:12;31008:8;:22;31017:12;31008:22;;;;;;;;;;;;;;;31031:10;31008:34;;;;;;;;;;;;;;;;;;:48;;;30995:62;;;;;;;;;;;;;;;;;;:69;;;:91;30928:8;:22;30937:12;30928:22;;;;;;;;;;;;;;;30951:10;30928:34;;;;;;;;;;;;;;;;;;:44;;;:158;:205;30913:11;:222;30904:304;;;;;;31219:22;31244:8;:22;31253:12;31244:22;;;;;;;;;;;;;;;31267:10;31244:34;;;;;;;;;;;;;;;;;;:45;;:57;31290:10;31244:57;;;;;;;;;;;;;;;;31219:82;;31336:1;31319:14;:18;31311:83;;;;;;31544:1;31499:8;:22;31508:12;31499:22;;;;;;;;;;;;;;;31522:10;31499:34;;;;;;;;;;;;;;;;;;:41;;;:46;31496:121;;31605:1;31561:8;:22;31570:12;31561:22;;;;;;;;;;;;;;;31584:10;31561:34;;;;;;;;;;;;;;;;;;:41;;:45;;;;31496:121;31663:37;31703:8;:22;31712:12;31703:22;;;;;;;;;;;;;;;31726:10;31703:34;;;;;;;;;;;;;;;;;;:46;;;31663:86;;31759:38;31942:22;32017:12;32030:8;:22;32039:12;32030:22;;;;;;;;;;;;;;;32053:10;32030:34;;;;;;;;;;;;;;;;;;:48;;;32017:62;;;;;;;;;;;;;;;;;;:69;;;31967:8;:22;31976:12;31967:22;;;;;;;;;;;;;;;31990:10;31967:34;;;;;;;;;;;;;;;;;;:47;;;:119;31942:144;;32169:9;32181:8;:22;32190:12;32181:22;;;;;;;;;;;;;;;32204:10;32181:34;;;;;;;;;;;;;;;;;;:47;;;32169:59;;32154:887;32266:14;32262:1;:18;32154:887;;;32324:8;:22;32333:12;32324:22;;;;;;;;;;;;;;;32347:10;32324:34;;;;;;;;;;;;;;;;;;:49;;:52;32374:1;32324:52;;;;;;;;;;;;;;;;;;;;;32320:711;;;32397:24;32424:175;32596:2;32424:148;32494:12;32507:8;:22;32516:12;32507:22;;;;;;;;;;;;;;;32530:10;32507:34;;;;;;;;;;;;;;;;;;:48;;;32494:62;;;;;;;;;;;;;;;;;;:77;;;32424:8;:22;32433:12;32424:22;;;;;;;;;;;;;;;32447:10;32424:34;;;;;;;;;;;;;;;;;;:46;;;:69;;:148;;;;:::i;:::-;:171;;:175;;;;:::i;:::-;32397:202;;32617:23;32643:157;32777:19;:22;32797:1;32777:22;;;;;;;;;;;;32643:86;32707:18;32726:1;32707:21;;;;;;;;;;;;;;;;32643:16;:63;;:86;;;;:::i;:::-;:133;;:157;;;;:::i;:::-;32617:183;;32850:57;32884:22;32904:1;32884:15;:19;;:22;;;;:::i;:::-;32850:29;:33;;:57;;;;:::i;:::-;32818:89;;32958:58;32993:22;33013:1;32993:15;:19;;:22;;;;:::i;:::-;32958:30;:34;;:58;;;;:::i;:::-;32925:91;;32320:711;;;32292:3;;;;;;;32154:887;;;;33321:1;33261:8;:22;33270:12;33261:22;;;;;;;;;;;;;;;33284:10;33261:34;;;;;;;;;;;;;;;;;;:45;;:57;33307:10;33261:57;;;;;;;;;;;;;;;:61;;;;33333:27;33363:193;33499:8;:22;33508:12;33499:22;;;;;;;;;;;;;;;33522:10;33499:34;;;;;;;;;;;;;;;;;;:56;;;33363:90;33438:14;33363:29;:74;;:90;;;;:::i;:::-;:135;;:193;;;;:::i;:::-;33333:223;;33566:5;;;;;;;;;;;:14;;;33581:10;33593:19;33566:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33566:47:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33566:47:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33566:47:14;;;;;;;;;;;;;;;;;33624:28;33655:198;33796:8;:22;33805:12;33796:22;;;;;;;;;;;;;;;33819:10;33796:34;;;;;;;;;;;;;;;;;;:56;;;33655:93;33733:14;33655:30;:77;;:93;;;;:::i;:::-;:140;;:198;;;;:::i;:::-;33624:229;;33890:50;33919:20;33890:12;:24;33903:10;33890:24;;;;;;;;;;;;;;;;:28;;:50;;;;:::i;:::-;33863:12;:24;33876:10;33863:24;;;;;;;;;;;;;;;:77;;;;34022:10;33980:96;;34010:10;33996:12;33980:96;;;34034:19;34055:20;33980:96;;;;;;;;;;;;;;;;;;;;;;;;30755:3328;;;;;;;;;:::o;2786:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15281:1715::-;15409:27;15450:9;15462:1;15450:13;;15446:840;15469:7;:14;15465:1;:18;15446:840;;;15746:51;15762:10;15774;15786:7;15794:1;15786:10;;;;;;;;;;;;;;15746:15;:51::i;:::-;:127;;;;;15814:8;:20;15823:10;15814:20;;;;;;;;;;;;;;;15835:10;15814:32;;;;;;;;;;;;;;;;;;:47;;:59;15862:7;15870:1;15862:10;;;;;;;;;;;;;;15814:59;;;;;;;;;;;;;;;;;;;;;15813:60;15746:127;15743:533;;;15893:16;15912:191;16069:19;:33;16090:7;16098:1;16090:10;;;;;;;;;;;;;;16069:33;;;;;;;;;;;;15912:117;15996:18;16016:7;16024:1;16016:10;;;;;;;;;;;;;;15996:32;;;;;;;;;;;;;;;;15912:8;:20;15921:10;15912:20;;;;;;;;;;;;;;;15933:10;15912:32;;;;;;;;;;;;;;;;;;:44;;;:83;;:117;;;;:::i;:::-;:156;;:191;;;;:::i;:::-;15893:210;;16144:33;16168:8;16144:19;:23;;:33;;;;:::i;:::-;16122:55;;16257:4;16195:8;:20;16204:10;16195:20;;;;;;;;;;;;;;;16216:10;16195:32;;;;;;;;;;;;;;;;;;:47;;:59;16243:7;16251:1;16243:10;;;;;;;;;;;;;;16195:59;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;15743:533;;15485:3;;;;;;;15446:840;;;;16296:17;16316:179;16491:2;16316:144;16366:92;16382:12;16395:8;:20;16404:10;16395:20;;;;;;;;;;;;;;;16416:10;16395:32;;;;;;;;;;;;;;;;;;:46;;;16382:60;;;;;;;;;;;;;;;;;;:75;;;16374:2;16366:15;;:92;;;;:::i;:::-;16316:19;:48;;:144;;;;:::i;:::-;:173;;:179;;;;:::i;:::-;16296:199;;16515:5;;;;;;;;;;;:14;;;16538:10;;;;;;;;;;;16551:9;16515:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16515:46:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16515:46:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16515:46:14;;;;;;;;;;;;;;;;16506:57;;;;;;16582:10;;;;;;;;;;;:25;;;16608:9;16582:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16582:36:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16582:36:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16582:36:14;;;;;;;;;;;;;;;;16573:47;;;;;;16653:34;16677:9;16653:19;:23;;:34;;;;:::i;:::-;16631:56;;16698:20;16721:26;16745:1;16721:19;:23;;:26;;;;:::i;:::-;16698:49;;16766:5;;;;;;;;;;;:14;;;16781:10;16793:12;16766:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16766:40:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16766:40:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16766:40:14;;;;;;;;;;;;;;;;16757:51;;;;;;16846:42;16875:12;16846;:24;16859:10;16846:24;;;;;;;;;;;;;;;;:28;;:42;;;;:::i;:::-;16819:12;:24;16832:10;16819:24;;;;;;;;;;;;;;;:69;;;;16943:10;16926:63;;;16955:10;16967:7;16976:12;16926:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16926:63:14;;;;;;;;;;;;;;;;;;;15281:1715;;;;;:::o;27396:627::-;27546:1;27503:8;:20;27512:10;27503:20;;;;;;;;;;;;;;;27524:10;27503:32;;;;;;;;;;;;;;;;;;:39;;;:44;27495:101;;;;;;27678:1;27614:8;:20;27623:10;27614:20;;;;;;;;;;;;;;;27635:10;27614:32;;;;;;;;;;;;;;;;;;:43;;:60;27658:15;27614:60;;;;;;;;;;;;;;;;:65;27606:130;;;;;;27803:67;27862:7;27803:8;:20;27812:10;27803:20;;;;;;;;;;;;;;;27824:10;27803:32;;;;;;;;;;;;;;;;;;:54;;;:58;;:67;;;;:::i;:::-;27746:8;:20;27755:10;27746:20;;;;;;;;;;;;;;;27767:10;27746:32;;;;;;;;;;;;;;;;;;:54;;:124;;;;27943:7;27880:8;:20;27889:10;27880:20;;;;;;;;;;;;;;;27901:10;27880:32;;;;;;;;;;;;;;;;;;:43;;:60;27924:15;27880:60;;;;;;;;;;;;;;;:70;;;;28000:15;27965:51;;27988:10;27976;27965:51;;;;;;;;;;;;27396:627;;;:::o;8819:140::-;8897:7;8923:8;:22;8932:12;8923:22;;;;;;;;;;;;;;;:29;;;;8916:36;;8819:140;;;:::o;2671:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20128:3187::-;20477:21;20501:17;:15;:17::i;:::-;20477:41;;20528:32;20575:9;20587:1;20575:13;;20571:1790;20594:11;:18;20590:1;:22;20571:1790;;;20638:58;20654:10;20666:11;20678:1;20666:14;;;;;;;;;;;;;;20682:13;20638:15;:58::i;:::-;:516;;;;;20858:12;20872:8;:20;20881:10;20872:20;;;;;;;;;;;;;;;20893:11;20905:1;20893:14;;;;;;;;;;;;;;20872:36;;;;;;;;;;;;;;;;;;:50;;;20858:66;;;;;;;;;;;;;;;;;;:86;;;;;;;;;;;;:278;;;;21021:115;21132:3;21021:106;21124:2;21021:98;21099:19;;21021:12;21035:8;:20;21044:10;21035:20;;;;;;;;;;;;;;;21056:11;21068:1;21056:14;;;;;;;;;;;;;;21035:36;;;;;;;;;;;;;;;;;;:50;;;21021:66;;;;;;;;;;;;;;;;;;:73;;;:77;;:98;;;;:::i;:::-;:102;;:106;;;;:::i;:::-;:110;;:115;;;;:::i;:::-;20972:8;:20;20981:10;20972:20;;;;;;;;;;;;;;;20993:11;21005:1;20993:14;;;;;;;;;;;;;;20972:36;;;;;;;;;;;;;;;;;;:46;;;:164;20966:3;:170;20858:278;20638:516;20634:1717;;;21261:255;21336:162;21494:3;21336:126;21418:9;21428:11;21418:22;;;;;;;;;;;;;;;;;;:43;;;21336:8;:20;21345:10;21336:20;;;;;;;;;;;;;;;21358:11;21370:1;21358:14;;;;;;;;;;;;;;21336:38;;;;;;;;;;;;;;;;;;:50;;;:81;;:126;;;;:::i;:::-;:157;;:162;;;;:::i;:::-;21261:24;:49;;:255;;;;:::i;:::-;21234:282;;21590:25;21618:8;:20;21627:10;21618:20;;;;;;;;;;;;;;;21639:11;21651:1;21639:14;;;;;;;;;;;;;;21618:36;;;;;;;;;;;;;;;;;;:49;;;21590:77;;21686:21;21730:12;21743:8;:20;21752:10;21743:20;;;;;;;;;;;;;;;21764:11;21776:1;21764:14;;;;;;;;;;;;;;21743:36;;;;;;;;;;;;;;;;;;:50;;;21730:64;;;;;;;;;;;;;;;;;;:71;;;21710:17;:91;21686:115;;21824:9;21852:1;21836:13;:17;21824:29;;21820:178;21860:13;21855:1;:18;21820:178;;21927:52;21954:24;21927:19;:22;21947:1;21927:22;;;;;;;;;;;;:26;;:52;;;;:::i;:::-;21902:19;:22;21922:1;21902:22;;;;;;;;;;;:77;;;;21875:3;;;;;;;21820:178;;;;22067:9;22079:1;22067:13;;22063:274;22087:9;22097:11;22087:22;;;;;;;;;;;;;;;;;;:33;;;22082:1;:38;22063:274;;22226:4;22149:8;:20;22158:10;22149:20;;;;;;;;;;;;;;;22171:11;22183:1;22171:14;;;;;;;;;;;;;;22149:38;;;;;;;;;;;;;;;;;;:53;;:74;22220:1;22204:13;:17;22149:74;;;;;;;;;;;;:81;;;;;;;;;;;;;;;;;;22300:1;22252:8;:20;22261:10;22252:20;;;;;;;;;;;;;;;22274:11;22286:1;22274:14;;;;;;;;;;;;;;22252:38;;;;;;;;;;;;;;;;;;:45;;:49;;;;22122:3;;;;;;;22063:274;;;;20634:1717;;;20614:3;;;;;;;20571:1790;;;;22371:25;22399:24;22371:52;;22452:17;22437:12;:32;22434:149;;;22493:5;22485:87;;;;;;22434:149;22594:21;22618:58;22672:3;22618:49;22635:9;22645:11;22635:22;;;;;;;;;;;;;;;;;;:31;;;22618:12;:16;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;22594:82;;22686:29;22718:31;22735:13;22718:12;:16;;:31;;;;:::i;:::-;22686:63;;22769:5;;;;;;;;;;;:14;;;22792:10;;;;;;;;;;;22805:13;22769:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22769:50:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22769:50:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22769:50:14;;;;;;;;;;;;;;;;22760:61;;;;;;22840:10;;;;;;;;;;;:25;;;22866:13;22840:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22840:40:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22840:40:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22840:40:14;;;;;;;;;;;;;;;;22831:51;;;;;;22893:5;:17;22899:10;22893:17;;;;;;;;;;;;;;;22916:180;;;;;;;;22948:12;22916:180;;;;22985:3;22916:180;;;;23014:11;22916:180;;;;23047:1;22916:180;;;;23074:11;22916:180;;;22893:204;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;22893:204:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;23150:5;;;;;;;;;;;:14;;;23165:10;23177:21;23150:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23150:49:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23150:49:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23150:49:14;;;;;;;;;;;;;;;;23141:60;;;;;;23237:11;23225:10;23217:91;;;23250:12;23264:13;23306:1;23279:5;:17;23285:10;23279:17;;;;;;;;;;;;;;;:24;;;;:28;23217:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20128:3187;;;;;;;;:::o;6620:448::-;4467:5;;;;;;;;;;;4453:19;;:10;:19;;;4434:88;;;;;;6775:3;6750:21;:28;;6742:146;;;;;;6898:9;6913:147;;;;;;;;6948:11;6913:147;;;;6983:9;6913:147;;;;7028:21;6913:147;;;6898:163;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6898:163:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6620:448;;;:::o;12040:1322::-;12176:4;12471:8;12466:1;12416:8;:22;12425:12;12416:22;;;;;;;;;;;;;;;12439:10;12416:34;;;;;;;;;;;;;;;;;;:47;;;:51;:63;;:287;;;;;12695:8;12620:12;12634:8;:22;12643:12;12634:22;;;;;;;;;;;;;;;12657:10;12634:34;;;;;;;;;;;;;;;;;;:48;;;12620:64;;;;;;;;;;;;;;;;;;:71;;;12570:8;:22;12579:12;12570:22;;;;;;;;;;;;;;;12593:10;12570:34;;;;;;;;;;;;;;;;;;:47;;;:121;:133;;12416:287;:405;;;;;12820:1;12775:8;:22;12784:12;12775:22;;;;;;;;;;;;;;;12798:10;12775:34;;;;;;;;;;;;;;;;;;:41;;;:46;12416:405;:925;;;;;13002:8;12981:17;:15;:17::i;:::-;:29;;:344;;;;13035:290;13140:157;13277:19;;13140:101;13193:8;:22;13202:12;13193:22;;;;;;;;;;;;;;;13216:10;13193:34;;;;;;;;;;;;;;;;;;:47;;;13140:17;:15;:17::i;:::-;:52;;:101;;;;:::i;:::-;:136;;:157;;;;:::i;:::-;13035:8;:22;13044:12;13035:22;;;;;;;;;;;;;;;13058:10;13035:34;;;;;;;;;;;;;;;;;;:44;;;:75;;:290;;;;:::i;:::-;13028:3;:297;;12981:344;12416:925;12320:1035;;12040:1322;;;;;:::o;10371:::-;10600:1;10573:12;:24;10586:10;10573:24;;;;;;;;;;;;;;;;:28;10565:98;;;;;;10673:14;10690:12;:24;10703:10;10690:24;;;;;;;;;;;;;;;;10673:41;;10751:1;10724:12;:24;10737:10;10724:24;;;;;;;;;;;;;;;:28;;;;10816:21;10860:12;10873:14;10860:28;;;;;;;;;;;;;;;;;;:35;;;10840:17;:15;:17::i;:::-;:55;10816:79;;11051:13;11087:1;11067:17;:15;:17::i;:::-;:21;11051:37;;11036:266;11109:13;11100:5;:22;11036:266;;11195:38;11226:6;11195:19;:26;11215:5;11195:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;11166:19;:26;11186:5;11166:26;;;;;;;;;;;:67;;;;11134:7;;;;;;;11036:266;;;;11312:8;:20;11321:10;11312:20;;;;;;;;;;;;;;;11338:252;;;;;;;;11373:6;11338:252;;;;11404:3;11338:252;;;;11435:17;:15;:17::i;:::-;11338:252;;;;11481:14;11338:252;;;;11517:1;11338:252;;;;11540:1;11338:252;;;;11578:1;11338:252;;;11312:279;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;11312:279:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11630:14;11618:10;11607:79;;;11646:6;11684:1;11654:8;:20;11663:10;11654:20;;;;;;;;;;;;;;;:27;;;;:31;11607:79;;;;;;;;;;;;;;;;;;;;;;;;10371:1322;;;:::o;5369:110::-;5417:7;5471:1;5443:18;:25;;;;:29;5436:36;;5369:110;:::o;23456:1605::-;23558:1;23521:5;:17;23527:10;23521:17;;;;;;;;;;;;;;;23539:7;23521:26;;;;;;;;;;;;;;;;;;:33;;;:38;23513:102;;;;;;23762:3;23673:86;23739:19;;23673:9;23684:5;:17;23690:10;23684:17;;;;;;;;;;;;;;;23702:7;23684:26;;;;;;;;;;;;;;;;;;:37;;;23673:50;;;;;;;;;;;;;;;;;;:61;;;:65;;:86;;;;:::i;:::-;23634:5;:17;23640:10;23634:17;;;;;;;;;;;;;;;23652:7;23634:26;;;;;;;;;;;;;;;;;;:36;;;:125;:131;23626:192;;;;;;23837:5;;;;;;;;;;;:18;;;23856:10;23876:4;23883:5;:17;23889:10;23883:17;;;;;;;;;;;;;;;23901:7;23883:26;;;;;;;;;;;;;;;;;;:38;;;23837:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23837:85:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23837:85:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23837:85:14;;;;;;;;;;;;;;;;23829:185;;;;;;24061:1;24025:5;:17;24031:10;24025:17;;;;;;;;;;;;;;;24043:7;24025:26;;;;;;;;;;;;;;;;;;:33;;:37;;;;24225:9;24237:1;24225:13;;24221:762;24244:5;:17;24250:10;24244:17;;;;;;;;;;;;;;;24262:7;24244:26;;;;;;;;;;;;;;;;;;:37;;:44;;;;24240:1;:48;24221:762;;;24309:18;24330:5;:17;24336:10;24330:17;;;;;;;;;;;;;;;24348:7;24330:26;;;;;;;;;;;;;;;;;;:37;;24368:1;24330:40;;;;;;;;;;;;;;;;24309:61;;24427:1;24385:8;:20;24394:10;24385:20;;;;;;;;;;;;;;;24406:10;24385:32;;;;;;;;;;;;;;;;;;:39;;:43;;;;24443:25;24471:90;24541:19;;24471:65;24518:17;;24471:8;:20;24480:10;24471:20;;;;;;;;;;;;;;;24492:10;24471:32;;;;;;;;;;;;;;;;;;:42;;;:46;;:65;;;;:::i;:::-;:69;;:90;;;;:::i;:::-;24443:118;;24576:21;24620:12;24633:8;:20;24642:10;24633:20;;;;;;;;;;;;;;;24654:10;24633:32;;;;;;;;;;;;;;;;;;:46;;;24620:60;;;;;;;;;;;;;;;;;;:67;;;24600:17;:87;24576:111;;24706:9;24738:1;24718:17;:15;:17::i;:::-;:21;24706:33;;24702:271;24746:13;24741:1;:18;24702:271;;24837:5;24784:8;:20;24793:10;24784:20;;;;;;;;;;;;;;;24805:10;24784:32;;;;;;;;;;;;;;;;;;:47;;:50;24832:1;24784:50;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;24886:72;24913:8;:20;24922:10;24913:20;;;;;;;;;;;;;;;24934:10;24913:32;;;;;;;;;;;;;;;;;;:44;;;24886:19;:22;24906:1;24886:22;;;;;;;;;;;;:26;;:72;;;;:::i;:::-;24861:19;:22;24881:1;24861:22;;;;;;;;;;;:97;;;;24761:3;;;;;;;24702:271;;;;24221:762;;;24290:3;;;;;;;24221:762;;;;25034:10;25024:30;;;25046:7;25024:30;;;;;;;;;;;;;;;;;;23456:1605;:::o;18200:1503::-;18337:7;18356:21;18380:17;:15;:17::i;:::-;18356:41;;18484:31;18530:9;18542:1;18530:13;;18526:1048;18549:11;:18;18545:1;:22;18526:1048;;;18592:60;18608:12;18622:11;18634:1;18622:14;;;;;;;;;;;;;;18638:13;18592:15;:60::i;:::-;:524;;;;;18814:12;18828:8;:22;18837:12;18828:22;;;;;;;;;;;;;;;18851:11;18863:1;18851:14;;;;;;;;;;;;;;18828:38;;;;;;;;;;;;;;;;;;:52;;;18814:68;;;;;;;;;;;;;;;;;;:88;;;;;;;;;;;;:284;;;;18981:117;19094:3;18981:108;19086:2;18981:100;19061:19;;18981:12;18995:8;:22;19004:12;18995:22;;;;;;;;;;;;;;;19018:11;19030:1;19018:14;;;;;;;;;;;;;;18995:38;;;;;;;;;;;;;;;;;;:52;;;18981:68;;;;;;;;;;;;;;;;;;:75;;;:79;;:100;;;;:::i;:::-;:104;;:108;;;;:::i;:::-;:112;;:117;;;;:::i;:::-;18930:8;:22;18939:12;18930:22;;;;;;;;;;;;;;;18953:11;18965:1;18953:14;;;;;;;;;;;;;;18930:38;;;;;;;;;;;;;;;;;;:48;;;:168;18924:3;:174;18814:284;18592:524;18589:975;;;19175:374;19224:154;19374:3;19224:122;19302:9;19312:11;19302:22;;;;;;;;;;;;;;;;;;:43;;;19224:8;:22;19233:12;19224:22;;;;;;;;;;;;;;;19247:11;19259:1;19247:14;;;;;;;;;;;;;;19224:38;;;;;;;;;;;;;;;;;;:50;;;:77;;:122;;;;:::i;:::-;:149;;:154;;;;:::i;:::-;19175:23;:48;;:374;;;;:::i;:::-;19149:400;;18589:975;18569:3;;;;;;;18526:1048;;;;19591:23;19584:30;;;;18200:1503;;;;;:::o;7328:1304::-;7590:1;7575:12;:16;7567:87;;;;;;7673:5;;;;;;;;;;;:18;;;7692:10;7712:4;7719:12;7673:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7673:59:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7673:59:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7673:59:14;;;;;;;;;;;;;;;;7665:120;;;;;;7795:21;7839:12;7852:14;7839:28;;;;;;;;;;;;;;;;;;:35;;;7819:17;:15;:17::i;:::-;:55;7795:79;;8030:13;8066:1;8046:17;:15;:17::i;:::-;:21;8030:37;;8015:214;8088:13;8079:5;:22;8015:214;;8174:44;8205:12;8174:19;:26;8194:5;8174:26;;;;;;;;;;;;:30;;:44;;;;:::i;:::-;8145:19;:26;8165:5;8145:26;;;;;;;;;;;:73;;;;8113:7;;;;;;;8015:214;;;;8239:8;:20;8248:10;8239:20;;;;;;;;;;;;;;;8265:258;;;;;;;;8300:12;8265:258;;;;8337:3;8265:258;;;;8368:17;:15;:17::i;:::-;8265:258;;;;8414:14;8265:258;;;;8450:1;8265:258;;;;8473:1;8265:258;;;;8511:1;8265:258;;;8239:285;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;8239:285:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8563:14;8551:10;8540:85;;;8579:12;8623:1;8593:8;:20;8602:10;8593:20;;;;;;;;;;;;;;;:27;;;;:31;8540:85;;;;;;;;;;;;;;;;;;;;;;;;7328:1304;;;:::o;2278:32::-;;;;:::o;5119:121::-;4315:10;;;;;;;;;;;4293:33;;:10;:33;;;4274:105;;;;;;5196:18;5220:12;5196:37;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;5196:37:14;;;;;;;;;;;;;;;;;;;;;;5119:121;:::o;17191:634::-;17275:9;17287:1;17275:13;;17271:548;17294:11;:18;17290:1;:22;17271:548;;;17348:171;17420:98;17498:19;;17420:12;17434:8;:20;17443:10;17434:20;;;;;;;;;;;;;;;17455:11;17467:1;17455:14;;;;;;;;;;;;;;17434:36;;;;;;;;;;;;;;;;;;:50;;;17420:66;;;;;;;;;;;;;;;;;;:73;;;:77;;:98;;;;:::i;:::-;17348:8;:20;17357:10;17348:20;;;;;;;;;;;;;;;17369:11;17381:1;17369:14;;;;;;;;;;;;;;17348:36;;;;;;;;;;;;;;;;;;:46;;;:71;;:171;;;;:::i;:::-;17341:3;:178;;17333:257;;;;;;17650:1;17604:8;:20;17613:10;17604:20;;;;;;;;;;;;;;;17625:11;17637:1;17625:14;;;;;;;;;;;;;;17604:36;;;;;;;;;;;;;;;;;;:43;;:47;;;;17666:5;;;;;;;;;;;:14;;;17681:10;17693:8;:20;17702:10;17693:20;;;;;;;;;;;;;;;17714:11;17726:1;17714:14;;;;;;;;;;;;;;17693:36;;;;;;;;;;;;;;;;;;:48;;;17666:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17666:76:14;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17666:76:14;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17666:76:14;;;;;;;;;;;;;;;;;17781:10;17762:46;;;17793:11;17805:1;17793:14;;;;;;;;;;;;;;17762:46;;;;;;;;;;;;;;;;;;17314:3;;;;;;;17271:548;;;;17191:634;:::o;2342:20::-;;;;;;;;;;;;;:::o;231:421:13:-;289:7;534:1;529;:6;525:45;;;558:1;551:8;;;;525:45;580:9;596:1;592;:5;580:17;;624:1;619;615;:5;;;;;;:10;607:19;;;;;;644:1;637:8;;;231:421;;;;;:::o;1439:145::-;1497:7;1516:9;1532:1;1528;:5;1516:17;;1556:1;1551;:6;;1543:15;;;;;;1576:1;1569:8;;;1439:145;;;;:::o;1211:::-;1269:7;1301:1;1296;:6;;1288:15;;;;;;1313:9;1329:1;1325;:5;1313:17;;1348:1;1341:8;;;1211:145;;;;:::o;782:296::-;840:7;937:1;933;:5;925:14;;;;;;949:9;965:1;961;:5;;;;;;949:17;;1070:1;1063:8;;;782:296;;;;:::o;794:33291:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://589f6b96b844e90eb24517ceddc62373fb1ad3d9dfccda50d83429c18557f63d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.002334 | 1,157,480,120.2011 | $2,701,318.11 |
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.