ETH Price: $3,389.74 (+1.49%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim All Pendin...165676572023-02-06 5:28:35695 days ago1675661315IN
Nexus Mutual: Claims Reward
0 ETH0.0039722217.51119659
Claim All Pendin...165600412023-02-05 3:57:23696 days ago1675569443IN
Nexus Mutual: Claims Reward
0 ETH0.0077176415.29212869
Claim All Pendin...165289582023-01-31 19:40:23701 days ago1675194023IN
Nexus Mutual: Claims Reward
0 ETH0.0275030239.35379542
Claim All Pendin...165289312023-01-31 19:34:59701 days ago1675193699IN
Nexus Mutual: Claims Reward
0 ETH0.0210564949.50916066
Claim All Pendin...165288382023-01-31 19:16:23701 days ago1675192583IN
Nexus Mutual: Claims Reward
0 ETH0.0066347939.40114137
Claim All Pendin...165189972023-01-30 10:19:11702 days ago1675073951IN
Nexus Mutual: Claims Reward
0 ETH0.002448514.54059893
Claim All Pendin...165189902023-01-30 10:17:47702 days ago1675073867IN
Nexus Mutual: Claims Reward
0 ETH0.0024282714.42046532
Claim All Pendin...165167092023-01-30 2:39:35702 days ago1675046375IN
Nexus Mutual: Claims Reward
0 ETH0.0067933717.98551276
Claim All Pendin...164827742023-01-25 8:54:47707 days ago1674636887IN
Nexus Mutual: Claims Reward
0 ETH0.0028051916.65878946
Claim All Pendin...164790392023-01-24 20:25:11708 days ago1674591911IN
Nexus Mutual: Claims Reward
0 ETH0.0059714221.49339616
Claim All Pendin...164731842023-01-24 0:47:47709 days ago1674521267IN
Nexus Mutual: Claims Reward
0 ETH0.0029587317.57059553
Claim All Pendin...164716742023-01-23 19:43:47709 days ago1674503027IN
Nexus Mutual: Claims Reward
0 ETH0.004107324.39148543
Claim All Pendin...164697122023-01-23 13:09:59709 days ago1674479399IN
Nexus Mutual: Claims Reward
0 ETH0.00268815.96285279
Claim All Pendin...164527762023-01-21 4:25:59711 days ago1674275159IN
Nexus Mutual: Claims Reward
0 ETH0.0028377216.85202338
Claim All Pendin...164504272023-01-20 20:33:35712 days ago1674246815IN
Nexus Mutual: Claims Reward
0 ETH0.0052861431.39210433
Claim All Pendin...164226572023-01-16 23:32:35716 days ago1673911955IN
Nexus Mutual: Claims Reward
0 ETH0.0058802434.92020433
Claim All Pendin...164129372023-01-15 14:56:35717 days ago1673794595IN
Nexus Mutual: Claims Reward
0 ETH0.0028642617.00212286
Claim All Pendin...164046512023-01-14 11:09:35718 days ago1673694575IN
Nexus Mutual: Claims Reward
0 ETH0.0031844718.91119707
Claim All Pendin...163937932023-01-12 22:47:23720 days ago1673563643IN
Nexus Mutual: Claims Reward
0 ETH0.0037139222.05534641
Claim All Pendin...163882582023-01-12 4:12:47720 days ago1673496767IN
Nexus Mutual: Claims Reward
0 ETH0.0030074117.85972505
Claim All Pendin...163773942023-01-10 15:46:35722 days ago1673365595IN
Nexus Mutual: Claims Reward
0 ETH0.0047151728.00137328
Claim All Pendin...163696222023-01-09 13:43:59723 days ago1673271839IN
Nexus Mutual: Claims Reward
0 ETH0.0027673816.43426233
Claim All Pendin...163592152023-01-08 2:54:11724 days ago1673146451IN
Nexus Mutual: Claims Reward
0 ETH0.0032103319.06477877
Close Claim163237782023-01-03 4:10:11729 days ago1672719011IN
Nexus Mutual: Claims Reward
0 ETH0.0092349817.03039315
Claim All Pendin...163228052023-01-03 0:54:47730 days ago1672707287IN
Nexus Mutual: Claims Reward
0 ETH0.0027363814.75210339
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
153022642022-08-08 15:07:00877 days ago1659971220  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ClaimsReward

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 17 : ClaimsReward.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.5.0;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "../../abstract/LegacyMasterAware.sol";
import "../../interfaces/IClaims.sol";
import "../../interfaces/IClaimsData.sol";
import "../../interfaces/IClaimsReward.sol";
import "../../interfaces/IGovernance.sol";
import "../../interfaces/IMCR.sol";
import "../../interfaces/IMemberRoles.sol";
import "../../interfaces/INXMToken.sol";
import "../../interfaces/IPool.sol";
import "../../interfaces/IPooledStaking.sol";
import "../../interfaces/IQuotationData.sol";
import "../../interfaces/ITokenController.sol";
import "../../interfaces/ITokenData.sol";

//Claims Reward Contract contains the functions for calculating number of tokens
// that will get rewarded, unlocked or burned depending upon the status of claim.

contract ClaimsReward is IClaimsReward, LegacyMasterAware {
  using SafeMath for uint;

  INXMToken internal tk;
  ITokenController internal tc;
  ITokenData internal td;
  IQuotationData internal qd;
  IClaims internal c1;
  IClaimsData internal cd;
  IPool internal pool;
  IGovernance internal gv;
  IPooledStaking internal pooledStaking;
  IMemberRoles internal memberRoles;
  IMCR public mcr;

  // assigned in constructor
  address public DAI;

  // constants
  address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
  uint private constant DECIMAL1E18 = uint(10) ** 18;

  constructor (address masterAddress, address _daiAddress) public {
    changeMasterAddress(masterAddress);
    DAI = _daiAddress;
  }

  function changeDependentContractAddress() public onlyInternal {
    c1 = IClaims(ms.getLatestAddress("CL"));
    cd = IClaimsData(ms.getLatestAddress("CD"));
    tk = INXMToken(ms.tokenAddress());
    tc = ITokenController(ms.getLatestAddress("TC"));
    td = ITokenData(ms.getLatestAddress("TD"));
    qd = IQuotationData(ms.getLatestAddress("QD"));
    gv = IGovernance(ms.getLatestAddress("GV"));
    pooledStaking = IPooledStaking(ms.getLatestAddress("PS"));
    memberRoles = IMemberRoles(ms.getLatestAddress("MR"));
    pool = IPool(ms.getLatestAddress("P1"));
    mcr = IMCR(ms.getLatestAddress("MC"));
  }

  /**
   * @dev Claims are closable by anyone
   * @param _claimId id of claim to be closed.
   */
  function closeClaim(uint _claimId) external {

    (, , , uint status, uint dateUpd,) = cd.getClaim(_claimId);
    bool canRetryPayout = status != 12 || dateUpd.add(cd.payoutRetryTime()) < block.timestamp;
    require(canRetryPayout, "ClaimsReward: Payout retry time not reached.");

    _changeClaimStatus(_claimId);
  }

  function changeClaimStatus(uint claimId) public checkPause onlyInternal {
    _changeClaimStatus(claimId);
  }

  /// @dev Decides the next course of action for a given claim.
  function _changeClaimStatus(uint claimId) internal {

    (, uint coverid) = cd.getClaimCoverId(claimId);
    (, uint status) = cd.getClaimStatusNumber(claimId);

    // when current status is "Pending-Claim Assessor Vote"
    if (status == 0) {
      _changeClaimStatusCA(claimId, coverid, status);
    } else if (status >= 1 && status <= 5) {
      _changeClaimStatusMV(claimId, coverid, status);
    } else if (status == 12) {// when current status is "Claim Accepted Payout Pending"

      bool payoutSucceeded = attemptClaimPayout(coverid);

      if (payoutSucceeded) {
        c1.setClaimStatus(claimId, 14);
      } else {
        c1.setClaimStatus(claimId, 12);
      }
    }
  }

  function getCurrencyAssetAddress(bytes4 currency) public view returns (address) {

    if (currency == "ETH") {
      return ETH;
    }

    if (currency == "DAI") {
      return DAI;
    }

    revert("ClaimsReward: unknown asset");
  }

  function attemptClaimPayout(uint coverId) internal returns (bool success) {

    uint sumAssured = qd.getCoverSumAssured(coverId);
    // TODO: when adding new cover currencies, fetch the correct decimals for this multiplication
    uint sumAssuredWei = sumAssured.mul(1e18);

    // get asset address
    bytes4 coverCurrency = qd.getCurrencyOfCover(coverId);
    address asset = getCurrencyAssetAddress(coverCurrency);

    // get payout address
    address payable coverHolder = qd.getCoverMemberAddress(coverId);
    address payable payoutAddress = memberRoles.getClaimPayoutAddress(coverHolder);

    // execute the payout
    bool payoutSucceeded = pool.sendClaimPayout(asset, payoutAddress, sumAssuredWei);

    if (payoutSucceeded) {

      // burn staked tokens
      (, address scAddress) = qd.getscAddressOfCover(coverId);
      uint tokenPrice = pool.getTokenPrice(asset);

      // note: for new assets "18" needs to be replaced with target asset decimals
      uint burnNXMAmount = sumAssuredWei.mul(1e18).div(tokenPrice);
      pooledStaking.pushBurn(scAddress, burnNXMAmount);

      // adjust total sum assured
      (, address coverContract) = qd.getscAddressOfCover(coverId);
      qd.subFromTotalSumAssured(coverCurrency, sumAssured);
      qd.subFromTotalSumAssuredSC(coverContract, coverCurrency, sumAssured);

      // update MCR since total sum assured and MCR% change
      mcr.updateMCRInternal(pool.getPoolValueInEth(), true);
      return true;
    }

    return false;
  }

  /// @dev Amount of tokens to be rewarded to a user for a particular vote id.
  /// @param check 1 -> CA vote, else member vote
  /// @param voteid vote id for which reward has to be Calculated
  /// @param flag if 1 calculate even if claimed,else don't calculate if already claimed
  /// @return tokenCalculated reward to be given for vote id
  /// @return lastClaimedCheck true if final verdict is still pending for that voteid
  /// @return tokens number of tokens locked under that voteid
  /// @return perc percentage of reward to be given.
  function getRewardToBeGiven(
    uint check,
    uint voteid,
    uint flag
  )
  public
  view
  returns (
    uint tokenCalculated,
    bool lastClaimedCheck,
    uint tokens,
    uint perc
  )

  {
    uint claimId;
    int8 verdict;
    bool claimed;
    uint tokensToBeDist;
    uint totalTokens;
    (tokens, claimId, verdict, claimed) = cd.getVoteDetails(voteid);
    lastClaimedCheck = false;
    int8 claimVerdict = cd.getFinalVerdict(claimId);
    if (claimVerdict == 0) {
      lastClaimedCheck = true;
    }

    if (claimVerdict == verdict && (claimed == false || flag == 1)) {

      if (check == 1) {
        (perc, , tokensToBeDist) = cd.getClaimRewardDetail(claimId);
      } else {
        (, perc, tokensToBeDist) = cd.getClaimRewardDetail(claimId);
      }

      if (perc > 0) {
        if (check == 1) {
          if (verdict == 1) {
            (, totalTokens,) = cd.getClaimsTokenCA(claimId);
          } else {
            (,, totalTokens) = cd.getClaimsTokenCA(claimId);
          }
        } else {
          if (verdict == 1) {
            (, totalTokens,) = cd.getClaimsTokenMV(claimId);
          } else {
            (,, totalTokens) = cd.getClaimsTokenMV(claimId);
          }
        }
        tokenCalculated = (perc.mul(tokens).mul(tokensToBeDist)).div(totalTokens.mul(100));


      }
    }
  }

  /// @dev Transfers all tokens held by contract to a new contract in case of upgrade.
  function upgrade(address _newAdd) public onlyInternal {
    uint amount = tk.balanceOf(address(this));
    if (amount > 0) {
      require(tk.transfer(_newAdd, amount));
    }

  }

  /// @dev Total reward in token due for claim by a user.
  /// @return total total number of tokens
  function getRewardToBeDistributedByUser(address _add) public view returns (uint total) {
    uint lengthVote = cd.getVoteAddressCALength(_add);
    uint lastIndexCA;
    uint lastIndexMV;
    uint tokenForVoteId;
    uint voteId;
    (lastIndexCA, lastIndexMV) = cd.getRewardDistributedIndex(_add);

    for (uint i = lastIndexCA; i < lengthVote; i++) {
      voteId = cd.getVoteAddressCA(_add, i);
      (tokenForVoteId,,,) = getRewardToBeGiven(1, voteId, 0);
      total = total.add(tokenForVoteId);
    }

    lengthVote = cd.getVoteAddressMemberLength(_add);

    for (uint j = lastIndexMV; j < lengthVote; j++) {
      voteId = cd.getVoteAddressMember(_add, j);
      (tokenForVoteId,,,) = getRewardToBeGiven(0, voteId, 0);
      total = total.add(tokenForVoteId);
    }
    return (total);
  }

  /// @dev Gets reward amount and claiming status for a given claim id.
  /// @return reward amount of tokens to user.
  /// @return claimed true if already claimed false if yet to be claimed.
  function getRewardAndClaimedStatus(uint check, uint claimId) public view returns (uint reward, bool claimed) {
    uint voteId;
    uint claimid;
    uint lengthVote;

    if (check == 1) {
      lengthVote = cd.getVoteAddressCALength(msg.sender);
      for (uint i = 0; i < lengthVote; i++) {
        voteId = cd.getVoteAddressCA(msg.sender, i);
        (, claimid, , claimed) = cd.getVoteDetails(voteId);
        if (claimid == claimId) {break;}
      }
    } else {
      lengthVote = cd.getVoteAddressMemberLength(msg.sender);
      for (uint j = 0; j < lengthVote; j++) {
        voteId = cd.getVoteAddressMember(msg.sender, j);
        (, claimid, , claimed) = cd.getVoteDetails(voteId);
        if (claimid == claimId) {break;}
      }
    }
    (reward,,,) = getRewardToBeGiven(check, voteId, 1);

  }

  /**
   * @dev Function used to claim all pending rewards : Claims Assessment + Risk Assessment + Governance
   * Claim assesment, Risk assesment, Governance rewards
   */
  function claimAllPendingReward(uint records) public isMemberAndcheckPause {
    _claimRewardToBeDistributed(records);
    pooledStaking.withdrawReward(msg.sender);
    uint governanceRewards = gv.claimReward(msg.sender, records);
    if (governanceRewards > 0) {
      require(tk.transfer(msg.sender, governanceRewards));
    }
  }

  /**
   * @dev Function used to get pending rewards of a particular user address.
   * @param _add user address.
   * @return total reward amount of the user
   */
  function getAllPendingRewardOfUser(address _add) public view returns (uint) {
    uint caReward = getRewardToBeDistributedByUser(_add);
    uint pooledStakingReward = pooledStaking.stakerReward(_add);
    uint governanceReward = gv.getPendingReward(_add);
    return caReward.add(pooledStakingReward).add(governanceReward);
  }

  /// @dev Rewards/Punishes users who  participated in Claims assessment.
  //    Unlocking and burning of the tokens will also depend upon the status of claim.
  /// @param claimid Claim Id.
  function _rewardAgainstClaim(uint claimid, uint coverid, uint status) internal {

    uint premiumNXM = qd.getCoverPremiumNXM(coverid);
    uint distributableTokens = premiumNXM.mul(cd.claimRewardPerc()).div(100); // 20% of premium

    uint percCA;
    uint percMV;

    (percCA, percMV) = cd.getRewardStatus(status);
    cd.setClaimRewardDetail(claimid, percCA, percMV, distributableTokens);

    if (percCA > 0 || percMV > 0) {
      tc.mint(address(this), distributableTokens);
    }

    // denied
    if (status == 6 || status == 9 || status == 11) {

      cd.changeFinalVerdict(claimid, -1);
      tc.markCoverClaimClosed(coverid, false);
      _burnCoverNoteDeposit(coverid);

    // accepted
    } else if (status == 7 || status == 8 || status == 10) {

      cd.changeFinalVerdict(claimid, 1);
      tc.markCoverClaimClosed(coverid, true);
      _unlockCoverNote(coverid);

      bool payoutSucceeded = attemptClaimPayout(coverid);

      // 12 = payout pending, 14 = payout succeeded
      uint nextStatus = payoutSucceeded ? 14 : 12;
      c1.setClaimStatus(claimid, nextStatus);
    }
  }

  function _burnCoverNoteDeposit(uint coverId) internal {

    address _of = qd.getCoverMemberAddress(coverId);
    bytes32 reason = keccak256(abi.encodePacked("CN", _of, coverId));
    uint lockedAmount = tc.tokensLocked(_of, reason);

    (uint amount,) = td.depositedCN(coverId);
    amount = amount.div(2);

    // limit burn amount to actual amount locked
    uint burnAmount = lockedAmount < amount ? lockedAmount : amount;

    if (burnAmount != 0) {
      tc.burnLockedTokens(_of, reason, amount);
    }
  }

  function unlockCoverNote(uint coverId) external onlyInternal {
    _unlockCoverNote(coverId);
  }

  function _unlockCoverNote(uint coverId) internal {

    address coverHolder = qd.getCoverMemberAddress(coverId);
    bytes32 reason = keccak256(abi.encodePacked("CN", coverHolder, coverId));
    uint lockedCN = tc.tokensLocked(coverHolder, reason);

    if (lockedCN != 0) {
      tc.releaseLockedTokens(coverHolder, reason, lockedCN);
    }
  }

  /// @dev Computes the result of Claim Assessors Voting for a given claim id.
  function _changeClaimStatusCA(uint claimid, uint coverid, uint status) internal {
    // Check if voting should be closed or not
    if (c1.checkVoteClosing(claimid) == 1) {
      uint caTokens = c1.getCATokens(claimid, 0); // converted in cover currency.
      uint accept;
      uint deny;
      uint acceptAndDeny;
      bool rewardOrPunish;
      uint sumAssured;
      (, accept) = cd.getClaimVote(claimid, 1);
      (, deny) = cd.getClaimVote(claimid, - 1);
      acceptAndDeny = accept.add(deny);
      accept = accept.mul(100);
      deny = deny.mul(100);

      if (caTokens == 0) {
        status = 3;
      } else {
        sumAssured = qd.getCoverSumAssured(coverid).mul(DECIMAL1E18);
        // Min threshold reached tokens used for voting > 5* sum assured
        if (caTokens > sumAssured.mul(5)) {

          if (accept.div(acceptAndDeny) > 70) {
            status = 7;
            qd.changeCoverStatusNo(coverid, uint8(IQuotationData.CoverStatus.ClaimAccepted));
            rewardOrPunish = true;
          } else if (deny.div(acceptAndDeny) > 70) {
            status = 6;
            qd.changeCoverStatusNo(coverid, uint8(IQuotationData.CoverStatus.ClaimDenied));
            rewardOrPunish = true;
          } else if (accept.div(acceptAndDeny) > deny.div(acceptAndDeny)) {
            status = 4;
          } else {
            status = 5;
          }

        } else {

          if (accept.div(acceptAndDeny) > deny.div(acceptAndDeny)) {
            status = 2;
          } else {
            status = 3;
          }
        }
      }

      c1.setClaimStatus(claimid, status);

      if (rewardOrPunish) {
        _rewardAgainstClaim(claimid, coverid, status);
      }
    }
  }

  /// @dev Computes the result of Member Voting for a given claim id.
  function _changeClaimStatusMV(uint claimid, uint coverid, uint status) internal {

    // Check if voting should be closed or not
    if (c1.checkVoteClosing(claimid) == 1) {
      uint8 coverStatus;
      uint statusOrig = status;
      uint mvTokens = c1.getCATokens(claimid, 1); // converted in cover currency.

      // If tokens used for acceptance >50%, claim is accepted
      uint sumAssured = qd.getCoverSumAssured(coverid).mul(DECIMAL1E18);
      uint thresholdUnreached = 0;
      // Minimum threshold for member voting is reached only when
      // value of tokens used for voting > 5* sum assured of claim id
      if (mvTokens < sumAssured.mul(5)) {
        thresholdUnreached = 1;
      }

      uint accept;
      (, accept) = cd.getClaimMVote(claimid, 1);
      uint deny;
      (, deny) = cd.getClaimMVote(claimid, - 1);

      if (accept.add(deny) > 0) {
        if (accept.mul(100).div(accept.add(deny)) >= 50 && statusOrig > 1 &&
        statusOrig <= 5 && thresholdUnreached == 0) {
          status = 8;
          coverStatus = uint8(IQuotationData.CoverStatus.ClaimAccepted);
        } else if (deny.mul(100).div(accept.add(deny)) >= 50 && statusOrig > 1 &&
        statusOrig <= 5 && thresholdUnreached == 0) {
          status = 9;
          coverStatus = uint8(IQuotationData.CoverStatus.ClaimDenied);
        }
      }

      if (thresholdUnreached == 1 && (statusOrig == 2 || statusOrig == 4)) {
        status = 10;
        coverStatus = uint8(IQuotationData.CoverStatus.ClaimAccepted);
      } else if (thresholdUnreached == 1 && (statusOrig == 5 || statusOrig == 3 || statusOrig == 1)) {
        status = 11;
        coverStatus = uint8(IQuotationData.CoverStatus.ClaimDenied);
      }

      c1.setClaimStatus(claimid, status);
      qd.changeCoverStatusNo(coverid, uint8(coverStatus));
      // Reward/Punish Claim Assessors and Members who participated in Claims assessment
      _rewardAgainstClaim(claimid, coverid, status);
    }
  }

  /// @dev Allows a user to claim all pending  Claims assessment rewards.
  function _claimRewardToBeDistributed(uint _records) internal {
    uint lengthVote = cd.getVoteAddressCALength(msg.sender);
    uint voteid;
    uint lastIndex;
    (lastIndex,) = cd.getRewardDistributedIndex(msg.sender);
    uint total = 0;
    uint tokenForVoteId = 0;
    bool lastClaimedCheck;
    bool claimed;
    uint counter = 0;
    uint claimId;
    uint perc;
    uint i;
    uint lastClaimed = lengthVote;

    for (i = lastIndex; i < lengthVote && counter < _records; i++) {
      voteid = cd.getVoteAddressCA(msg.sender, i);
      (tokenForVoteId, lastClaimedCheck, , perc) = getRewardToBeGiven(1, voteid, 0);
      if (lastClaimed == lengthVote && lastClaimedCheck == true) {
        lastClaimed = i;
      }
      (, claimId, , claimed) = cd.getVoteDetails(voteid);

      if (perc > 0 && !claimed) {
        counter++;
        cd.setRewardClaimed(voteid, true);
      } else if (perc == 0 && cd.getFinalVerdict(claimId) != 0 && !claimed) {
        (perc,,) = cd.getClaimRewardDetail(claimId);
        if (perc == 0) {
          counter++;
        }
        cd.setRewardClaimed(voteid, true);
      }
      if (tokenForVoteId > 0) {
        total = tokenForVoteId.add(total);
      }
    }
    if (lastClaimed == lengthVote) {
      cd.setRewardDistributedIndexCA(msg.sender, i);
    }
    else {
      cd.setRewardDistributedIndexCA(msg.sender, lastClaimed);
    }
    lengthVote = cd.getVoteAddressMemberLength(msg.sender);
    lastClaimed = lengthVote;

    {
      uint lockTimePerVote = td.lockCADays();
      uint reduction = lockTimePerVote.mul(counter);
      uint minExpiration = block.timestamp.add(lockTimePerVote);
      uint currentExpiration = tc.getLockedTokensValidity(msg.sender, "CLA");

      // reduce lock time only if current lock time is greater than min lock time
      if (currentExpiration > minExpiration) {

        // and never reduce to less than min lock time
        if (currentExpiration.sub(reduction) < minExpiration) {
          reduction = currentExpiration.sub(minExpiration);
        }

        tc.reduceLock(msg.sender, "CLA", reduction);
      }
    }

    (, lastIndex) = cd.getRewardDistributedIndex(msg.sender);
    lastClaimed = lengthVote;
    counter = 0;
    for (i = lastIndex; i < lengthVote && counter < _records; i++) {
      voteid = cd.getVoteAddressMember(msg.sender, i);
      (tokenForVoteId, lastClaimedCheck,,) = getRewardToBeGiven(0, voteid, 0);
      if (lastClaimed == lengthVote && lastClaimedCheck == true) {
        lastClaimed = i;
      }
      (, claimId, , claimed) = cd.getVoteDetails(voteid);
      if (claimed == false && cd.getFinalVerdict(claimId) != 0) {
        cd.setRewardClaimed(voteid, true);
        counter++;
      }
      if (tokenForVoteId > 0) {
        total = tokenForVoteId.add(total);
      }
    }
    if (total > 0) {
      require(tk.transfer(msg.sender, total));
    }
    if (lastClaimed == lengthVote) {
      cd.setRewardDistributedIndexMV(msg.sender, i);
    }
    else {
      cd.setRewardDistributedIndexMV(msg.sender, lastClaimed);
    }
  }
}

File 2 of 17 : SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 3 of 17 : LegacyMasterAware.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.5.0;

import "../interfaces/INXMMaster.sol";

contract LegacyMasterAware {

  INXMMaster public ms;
  address public nxMasterAddress;

  modifier onlyInternal {
    require(ms.isInternal(msg.sender));
    _;
  }

  modifier isMemberAndcheckPause {
    require(ms.isPause() == false && ms.isMember(msg.sender) == true);
    _;
  }

  modifier onlyOwner {
    require(ms.isOwner(msg.sender));
    _;
  }

  modifier checkPause {
    require(ms.isPause() == false);
    _;
  }

  modifier isMember {
    require(ms.isMember(msg.sender), "Not member");
    _;
  }

  /**
   * @dev Iupgradable Interface to update dependent contract address
   */
  function changeDependentContractAddress() public;

  /**
   * @dev change master address
   * @param _masterAddress is the new address
   */
  function changeMasterAddress(address _masterAddress) public {
    if (address(ms) != address(0)) {
      require(address(ms) == msg.sender, "Not master");
    }

    ms = INXMMaster(_masterAddress);
    nxMasterAddress = _masterAddress;
  }

}

File 4 of 17 : IClaims.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IClaims {

  function setClaimStatus(uint claimId, uint stat) external;

  function getCATokens(uint claimId, uint member) external view returns (uint tokens);

  function submitClaim(uint coverId) external;

  function submitClaimForMember(uint coverId, address member) external;

  function submitClaimAfterEPOff() external pure;

  function submitCAVote(uint claimId, int8 verdict) external;

  function submitMemberVote(uint claimId, int8 verdict) external;

  function pauseAllPendingClaimsVoting() external pure;

  function startAllPendingClaimsVoting() external pure;

  function checkVoteClosing(uint claimId) external view returns (int8 close);
}

File 5 of 17 : IClaimsData.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IClaimsData {

  function pendingClaimStart() external view returns (uint);
  function claimDepositTime() external view returns (uint);
  function maxVotingTime() external view returns (uint);
  function minVotingTime() external view returns (uint);
  function payoutRetryTime() external view returns (uint);
  function claimRewardPerc() external view returns (uint);
  function minVoteThreshold() external view returns (uint);
  function maxVoteThreshold() external view returns (uint);
  function majorityConsensus() external view returns (uint);
  function pauseDaysCA() external view returns (uint);

  function userClaimVotePausedOn(address) external view returns (uint);

  function setpendingClaimStart(uint _start) external;

  function setRewardDistributedIndexCA(address _voter, uint caIndex) external;

  function setUserClaimVotePausedOn(address user) external;

  function setRewardDistributedIndexMV(address _voter, uint mvIndex) external;


  function setClaimRewardDetail(
    uint claimid,
    uint percCA,
    uint percMV,
    uint tokens
  ) external;

  function setRewardClaimed(uint _voteid, bool claimed) external;

  function changeFinalVerdict(uint _claimId, int8 _verdict) external;

  function addClaim(
    uint _claimId,
    uint _coverId,
    address _from,
    uint _nowtime
  ) external;

  function addVote(
    address _voter,
    uint _tokens,
    uint claimId,
    int8 _verdict
  ) external;

  function addClaimVoteCA(uint _claimId, uint _voteid) external;

  function setUserClaimVoteCA(
    address _from,
    uint _claimId,
    uint _voteid
  ) external;

  function setClaimTokensCA(uint _claimId, int8 _vote, uint _tokens) external;

  function setClaimTokensMV(uint _claimId, int8 _vote, uint _tokens) external;

  function addClaimVotemember(uint _claimId, uint _voteid) external;

  function setUserClaimVoteMember(
    address _from,
    uint _claimId,
    uint _voteid
  ) external;

  function updateState12Count(uint _claimId, uint _cnt) external;

  function setClaimStatus(uint _claimId, uint _stat) external;

  function setClaimdateUpd(uint _claimId, uint _dateUpd) external;

  function setClaimAtEmergencyPause(
    uint _coverId,
    uint _dateUpd,
    bool _submit
  ) external;

  function setClaimSubmittedAtEPTrue(uint _index, bool _submit) external;


  function setFirstClaimIndexToSubmitAfterEP(
    uint _firstClaimIndexToSubmit
  ) external;


  function setPendingClaimDetails(
    uint _claimId,
    uint _pendingTime,
    bool _voting
  ) external;

  function setPendingClaimVoteStatus(uint _claimId, bool _vote) external;

  function setFirstClaimIndexToStartVotingAfterEP(
    uint _claimStartVotingFirstIndex
  ) external;

  function callVoteEvent(
    address _userAddress,
    uint _claimId,
    bytes4 _typeOf,
    uint _tokens,
    uint _submitDate,
    int8 _verdict
  ) external;

  function callClaimEvent(
    uint _coverId,
    address _userAddress,
    uint _claimId,
    uint _datesubmit
  ) external;

  function getUintParameters(bytes8 code) external view returns (bytes8 codeVal, uint val);

  function getClaimOfEmergencyPauseByIndex(
    uint _index
  )
  external
  view
  returns (
    uint coverId,
    uint dateUpd,
    bool submit
  );

  function getAllClaimsByIndex(
    uint _claimId
  )
  external
  view
  returns (
    uint coverId,
    int8 vote,
    uint status,
    uint dateUpd,
    uint state12Count
  );

  function getUserClaimVoteCA(
    address _add,
    uint _claimId
  )
  external
  view
  returns (uint idVote);

  function getUserClaimVoteMember(
    address _add,
    uint _claimId
  )
  external
  view
  returns (uint idVote);

  function getAllVoteLength() external view returns (uint voteCount);

  function getClaimStatusNumber(uint _claimId) external view returns (uint claimId, uint statno);

  function getRewardStatus(uint statusNumber) external view returns (uint percCA, uint percMV);

  function getClaimState12Count(uint _claimId) external view returns (uint num);

  function getClaimDateUpd(uint _claimId) external view returns (uint dateupd);

  function getAllClaimsByAddress(address _member) external view returns (uint[] memory claimarr);


  function getClaimsTokenCA(
    uint _claimId
  )
  external
  view
  returns (
    uint claimId,
    uint accept,
    uint deny
  );

  function getClaimsTokenMV(
    uint _claimId
  )
  external
  view
  returns (
    uint claimId,
    uint accept,
    uint deny
  );
  function getCaClaimVotesToken(uint _claimId) external view returns (uint claimId, uint cnt);

  function getMemberClaimVotesToken(
    uint _claimId
  )
  external
  view
  returns (uint claimId, uint cnt);

  function getVoteDetails(uint _voteid)
  external view
  returns (
    uint tokens,
    uint claimId,
    int8 verdict,
    bool rewardClaimed
  );

  function getVoterVote(uint _voteid) external view returns (address voter);

  function getClaim(
    uint _claimId
  )
  external
  view
  returns (
    uint claimId,
    uint coverId,
    int8 vote,
    uint status,
    uint dateUpd,
    uint state12Count
  );

  function getClaimVoteLength(
    uint _claimId,
    uint8 _ca
  )
  external
  view
  returns (uint claimId, uint len);

  function getVoteVerdict(
    uint _claimId,
    uint _index,
    uint8 _ca
  )
  external
  view
  returns (int8 ver);

  function getVoteToken(
    uint _claimId,
    uint _index,
    uint8 _ca
  )
  external
  view
  returns (uint tok);

  function getVoteVoter(
    uint _claimId,
    uint _index,
    uint8 _ca
  )
  external
  view
  returns (address voter);

  function getUserClaimCount(address _add) external view returns (uint len);

  function getClaimLength() external view returns (uint len);

  function actualClaimLength() external view returns (uint len);


  function getClaimFromNewStart(
    uint _index,
    address _add
  )
  external
  view
  returns (
    uint coverid,
    uint claimId,
    int8 voteCA,
    int8 voteMV,
    uint statusnumber
  );

  function getUserClaimByIndex(
    uint _index,
    address _add
  )
  external
  view
  returns (
    uint status,
    uint coverid,
    uint claimId
  );

  function getAllVotesForClaim(
    uint _claimId
  )
  external
  view
  returns (
    uint claimId,
    uint[] memory ca,
    uint[] memory mv
  );


  function getTokensClaim(
    address _of,
    uint _claimId
  )
  external
  view
  returns (
    uint claimId,
    uint tokens
  );

  function getRewardDistributedIndex(
    address _voter
  )
  external
  view
  returns (
    uint lastCAvoteIndex,
    uint lastMVvoteIndex
  );

  function getClaimRewardDetail(
    uint claimid
  )
  external
  view
  returns (
    uint percCA,
    uint percMV,
    uint tokens
  );

  function getClaimCoverId(uint _claimId) external view returns (uint claimId, uint coverid);

  function getClaimVote(uint _claimId, int8 _verdict) external view returns (uint claimId, uint token);

  function getClaimMVote(uint _claimId, int8 _verdict) external view returns (uint claimId, uint token);

  function getVoteAddressCA(address _voter, uint index) external view returns (uint);

  function getVoteAddressMember(address _voter, uint index) external view returns (uint);

  function getVoteAddressCALength(address _voter) external view returns (uint);

  function getVoteAddressMemberLength(address _voter) external view returns (uint);

  function getFinalVerdict(uint _claimId) external view returns (int8 verdict);

  function getLengthOfClaimSubmittedAtEP() external view returns (uint len);

  function getFirstClaimIndexToSubmitAfterEP() external view returns (uint indexToSubmit);

  function getLengthOfClaimVotingPause() external view returns (uint len);

  function getPendingClaimDetailsByIndex(
    uint _index
  )
  external
  view
  returns (
    uint claimId,
    uint pendingTime,
    bool voting
  );

  function getFirstClaimIndexToStartVotingAfterEP() external view returns (uint firstindex);

}

File 6 of 17 : IClaimsReward.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IClaimsReward {

  /// @dev Decides the next course of action for a given claim.
  function changeClaimStatus(uint claimid) external;

  function getCurrencyAssetAddress(bytes4 currency) external view returns (address);

  function getRewardToBeGiven(
    uint check,
    uint voteid,
    uint flag
  )
  external
  view
  returns (
    uint tokenCalculated,
    bool lastClaimedCheck,
    uint tokens,
    uint perc
  );

  function upgrade(address _newAdd) external;

  function getRewardToBeDistributedByUser(address _add) external view returns (uint total);

  function getRewardAndClaimedStatus(uint check, uint claimId) external view returns (uint reward, bool claimed);

  function claimAllPendingReward(uint records) external;

  function getAllPendingRewardOfUser(address _add) external view returns (uint);

  function unlockCoverNote(uint coverId) external;
}

File 7 of 17 : IGovernance.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IGovernance {

  event Proposal(
    address indexed proposalOwner,
    uint256 indexed proposalId,
    uint256 dateAdd,
    string proposalTitle,
    string proposalSD,
    string proposalDescHash
  );

  event Solution(
    uint256 indexed proposalId,
    address indexed solutionOwner,
    uint256 indexed solutionId,
    string solutionDescHash,
    uint256 dateAdd
  );

  event Vote(
    address indexed from,
    uint256 indexed proposalId,
    uint256 indexed voteId,
    uint256 dateAdd,
    uint256 solutionChosen
  );

  event RewardClaimed(
    address indexed member,
    uint gbtReward
  );

  /// @dev VoteCast event is called whenever a vote is cast that can potentially close the proposal.
  event VoteCast (uint256 proposalId);

  /// @dev ProposalAccepted event is called when a proposal is accepted so that a server can listen that can
  ///      call any offchain actions
  event ProposalAccepted (uint256 proposalId);

  /// @dev CloseProposalOnTime event is called whenever a proposal is created or updated to close it on time.
  event CloseProposalOnTime (
    uint256 indexed proposalId,
    uint256 time
  );

  /// @dev ActionSuccess event is called whenever an onchain action is executed.
  event ActionSuccess (
    uint256 proposalId
  );

  struct DelegateVote {
    address follower;
    address leader;
    uint lastUpd;
  }

  /// @dev Creates a new proposal
  /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal
  /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective
  function createProposal(
    string calldata _proposalTitle,
    string calldata _proposalSD,
    string calldata _proposalDescHash,
    uint _categoryId
  )
  external;

  /// @dev Edits the details of an existing proposal and creates new version
  /// @param _proposalId Proposal id that details needs to be updated
  /// @param _proposalDescHash Proposal description hash having long and short description of proposal.
  function updateProposal(
    uint _proposalId,
    string calldata _proposalTitle,
    string calldata _proposalSD,
    string calldata _proposalDescHash
  )
  external;

  /// @dev Categorizes proposal to proceed further. Categories shows the proposal objective.
  function categorizeProposal(
    uint _proposalId,
    uint _categoryId,
    uint _incentives
  )
  external;

  /// @dev Submit proposal with solution
  /// @param _proposalId Proposal id
  /// @param _solutionHash Solution hash contains  parameters, values and description needed according to proposal
  function submitProposalWithSolution(
    uint _proposalId,
    string calldata _solutionHash,
    bytes calldata _action
  )
  external;

  /// @dev Creates a new proposal with solution and votes for the solution
  /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal
  /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective
  /// @param _solutionHash Solution hash contains  parameters, values and description needed according to proposal
  function createProposalwithSolution(
    string calldata _proposalTitle,
    string calldata _proposalSD,
    string calldata _proposalDescHash,
    uint _categoryId,
    string calldata _solutionHash,
    bytes calldata _action
  )
  external;

  /// @dev Casts vote
  /// @param _proposalId Proposal id
  /// @param _solutionChosen solution chosen while voting. _solutionChosen[0] is the chosen solution
  function submitVote(uint _proposalId, uint _solutionChosen) external;

  function closeProposal(uint _proposalId) external;

  function claimReward(address _memberAddress, uint _maxRecords) external returns (uint pendingDAppReward);

  function proposal(uint _proposalId)
  external
  view
  returns (
    uint proposalId,
    uint category,
    uint status,
    uint finalVerdict,
    uint totalReward
  );

  function canCloseProposal(uint _proposalId) external view returns (uint closeValue);

  function allowedToCatgorize() external view returns (uint roleId);

  function removeDelegation(address _add) external;

  function getPendingReward(address _memberAddress) external view returns (uint pendingDAppReward);

  function getFollowers(address _add) external view returns (uint[] memory);

  function followerDelegation(address _add) external view returns (uint delegationId);

  function allDelegation(uint _delegationId) external view returns (address follower, address leader, uint lastUpd);

}

File 8 of 17 : IMCR.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IMCR {

  function updateMCRInternal(uint poolValueInEth, bool forceUpdate) external;
  function getMCR() external view returns (uint);


  function maxMCRFloorIncrement() external view returns (uint24);

  function mcrFloor() external view returns (uint112);
  function mcr() external view returns (uint112);
  function desiredMCR() external view returns (uint112);
  function lastUpdateTime() external view returns (uint32);
}

File 9 of 17 : IMemberRoles.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IMemberRoles {

  enum Role {UnAssigned, AdvisoryBoard, Member, Owner}

  function payJoiningFee(address _userAddress) external payable;

  function switchMembership(address _newAddress) external;

  function switchMembershipOf(address member, address _newAddress) external;

  function swapOwner(address _newOwnerAddress) external;

  function kycVerdict(address payable _userAddress, bool verdict) external;

  function getClaimPayoutAddress(address payable _member) external view returns (address payable);

  function setClaimPayoutAddress(address payable _address) external;

  function totalRoles() external view returns (uint256);

  function changeAuthorized(uint _roleId, address _newAuthorized) external;

  function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray);

  function numberOfMembers(uint _memberRoleId) external view returns (uint);

  function authorized(uint _memberRoleId) external view returns (address);

  function roles(address _memberAddress) external view returns (uint[] memory);

  function checkRole(address _memberAddress, uint _roleId) external view returns (bool);

  function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers);

  function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool);

  function membersLength(uint _memberRoleId) external view returns (uint);
}

File 10 of 17 : INXMToken.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface INXMToken {

  function burn(uint256 amount) external returns (bool);

  function burnFrom(address from, uint256 value) external returns (bool);

  function operatorTransfer(address from, uint256 value) external returns (bool);

  function mint(address account, uint256 amount) external;

  function isLockedForMV(address member) external view returns (uint);

  function addToWhiteList(address _member) external returns (bool);

  function removeFromWhiteList(address _member) external returns (bool);

  function changeOperator(address _newOperator) external returns (bool);

  function lockForMemberVote(address _of, uint _days) external;

  /**
 * @dev Returns the amount of tokens in existence.
 */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 11 of 17 : IPool.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

import "./IPriceFeedOracle.sol";

interface IPool {
  function sellNXM(uint tokenAmount, uint minEthOut) external;

  function sellNXMTokens(uint tokenAmount) external returns (bool);

  function minPoolEth() external returns (uint);

  function transferAssetToSwapOperator(address asset, uint amount) external;

  function setAssetDataLastSwapTime(address asset, uint32 lastSwapTime) external;

  function getAssetDetails(address _asset) external view returns (
    uint112 min,
    uint112 max,
    uint32 lastAssetSwapTime,
    uint maxSlippageRatio
  );

  function sendClaimPayout (
    address asset,
    address payable payoutAddress,
    uint amount
  ) external returns (bool success);

  function transferAsset(
    address asset,
    address payable destination,
    uint amount
  ) external;

  function upgradeCapitalPool(address payable newPoolAddress) external;

  function priceFeedOracle() external view returns (IPriceFeedOracle);

  function getPoolValueInEth() external view returns (uint);


  function transferAssetFrom(address asset, address from, uint amount) external;

  function getEthForNXM(uint nxmAmount) external view returns (uint ethAmount);

  function calculateEthForNXM(
    uint nxmAmount,
    uint currentTotalAssetValue,
    uint mcrEth
  ) external pure returns (uint);

  function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint);

  function calculateTokenSpotPrice(uint totalAssetValue, uint mcrEth) external pure returns (uint tokenPrice);

  function getTokenPrice(address asset) external view returns (uint tokenPrice);

  function getMCRRatio() external view returns (uint);
}

File 12 of 17 : IPooledStaking.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IPooledStaking {

  function accumulateReward(address contractAddress, uint amount) external;

  function pushBurn(address contractAddress, uint amount) external;

  function hasPendingActions() external view returns (bool);

  function processPendingActions(uint maxIterations) external returns (bool finished);

  function contractStake(address contractAddress) external view returns (uint);

  function stakerReward(address staker) external view returns (uint);

  function stakerDeposit(address staker) external view returns (uint);

  function stakerContractStake(address staker, address contractAddress) external view returns (uint);

  function withdraw(uint amount) external;

  function stakerMaxWithdrawable(address stakerAddress) external view returns (uint);

  function withdrawReward(address stakerAddress) external;
}

File 13 of 17 : IQuotationData.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IQuotationData {

  function authQuoteEngine() external view returns (address);
  function stlp() external view returns (uint);
  function stl() external view returns (uint);
  function pm() external view returns (uint);
  function minDays() external view returns (uint);
  function tokensRetained() external view returns (uint);
  function kycAuthAddress() external view returns (address);

  function refundEligible(address) external view returns (bool);
  function holdedCoverIDStatus(uint) external view returns (uint);
  function timestampRepeated(uint) external view returns (bool);

  enum HCIDStatus {NA, kycPending, kycPass, kycFailedOrRefunded, kycPassNoCover}
  enum CoverStatus {Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested}

  function addInTotalSumAssuredSC(address _add, bytes4 _curr, uint _amount) external;

  function subFromTotalSumAssuredSC(address _add, bytes4 _curr, uint _amount) external;

  function subFromTotalSumAssured(bytes4 _curr, uint _amount) external;

  function addInTotalSumAssured(bytes4 _curr, uint _amount) external;

  function setTimestampRepeated(uint _timestamp) external;

  /// @dev Creates a blank new cover.
  function addCover(
    uint16 _coverPeriod,
    uint _sumAssured,
    address payable _userAddress,
    bytes4 _currencyCode,
    address _scAddress,
    uint premium,
    uint premiumNXM
  ) external;


  function addHoldCover(
    address payable from,
    address scAddress,
    bytes4 coverCurr,
    uint[] calldata coverDetails,
    uint16 coverPeriod
  ) external;

  function setRefundEligible(address _add, bool status) external;

  function setHoldedCoverIDStatus(uint holdedCoverID, uint status) external;

  function setKycAuthAddress(address _add) external;

  function changeAuthQuoteEngine(address _add) external;

  function getUintParameters(bytes8 code) external view returns (bytes8 codeVal, uint val);

  function getProductDetails()
  external
  view
  returns (
    uint _minDays,
    uint _pm,
    uint _stl,
    uint _stlp
  );

  function getCoverLength() external view returns (uint len);

  function getAuthQuoteEngine() external view returns (address _add);

  function getTotalSumAssured(bytes4 _curr) external view returns (uint amount);

  function getAllCoversOfUser(address _add) external view returns (uint[] memory allCover);

  function getUserCoverLength(address _add) external view returns (uint len);

  function getCoverStatusNo(uint _cid) external view returns (uint8);

  function getCoverPeriod(uint _cid) external view returns (uint32 cp);

  function getCoverSumAssured(uint _cid) external view returns (uint sa);

  function getCurrencyOfCover(uint _cid) external view returns (bytes4 curr);

  function getValidityOfCover(uint _cid) external view returns (uint date);

  function getscAddressOfCover(uint _cid) external view returns (uint, address);

  function getCoverMemberAddress(uint _cid) external view returns (address payable _add);

  function getCoverPremiumNXM(uint _cid) external view returns (uint _premiumNXM);

  function getCoverDetailsByCoverID1(
    uint _cid
  )
  external
  view
  returns (
    uint cid,
    address _memberAddress,
    address _scAddress,
    bytes4 _currencyCode,
    uint _sumAssured,
    uint premiumNXM
  );

  function getCoverDetailsByCoverID2(
    uint _cid
  )
  external
  view
  returns (
    uint cid,
    uint8 status,
    uint sumAssured,
    uint16 coverPeriod,
    uint validUntil
  );

  function getHoldedCoverDetailsByID1(
    uint _hcid
  )
  external
  view
  returns (
    uint hcid,
    address scAddress,
    bytes4 coverCurr,
    uint16 coverPeriod
  );

  function getUserHoldedCoverLength(address _add) external view returns (uint);

  function getUserHoldedCoverByIndex(address _add, uint index) external view returns (uint);

  function getHoldedCoverDetailsByID2(
    uint _hcid
  )
  external
  view
  returns (
    uint hcid,
    address payable memberAddress,
    uint[] memory coverDetails
  );

  function getTotalSumAssuredSC(address _add, bytes4 _curr) external view returns (uint amount);

  function changeCoverStatusNo(uint _cid, uint8 _stat) external;

}

File 14 of 17 : ITokenController.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface ITokenController {

  function coverInfo(uint id) external view returns (uint16 claimCount, bool hasOpenClaim, bool hasAcceptedClaim);

  function claimSubmissionGracePeriod() external view returns (uint);

  function withdrawCoverNote(
    address _of,
    uint[] calldata _coverIds,
    uint[] calldata _indexes
  ) external;

  function markCoverClaimOpen(uint coverId) external;

  function markCoverClaimClosed(uint coverId, bool isAccepted) external;

  function changeOperator(address _newOperator) external;

  function operatorTransfer(address _from, address _to, uint _value) external returns (bool);

  function lockClaimAssessmentTokens(uint256 _amount, uint256 _time) external;

  function lockOf(address _of, bytes32 _reason, uint256 _amount, uint256 _time) external returns (bool);

  function mintCoverNote(
    address _of,
    bytes32 _reason,
    uint256 _amount,
    uint256 _time
  ) external;

  function extendClaimAssessmentLock(uint256 _time) external;

  function extendLockOf(address _of, bytes32 _reason, uint256 _time) external returns (bool);

  function increaseClaimAssessmentLock(uint256 _amount) external;

  function burnFrom(address _of, uint amount) external returns (bool);

  function burnLockedTokens(address _of, bytes32 _reason, uint256 _amount) external;

  function reduceLock(address _of, bytes32 _reason, uint256 _time) external;

  function releaseLockedTokens(address _of, bytes32 _reason, uint256 _amount) external;

  function addToWhitelist(address _member) external;

  function removeFromWhitelist(address _member) external;

  function mint(address _member, uint _amount) external;

  function lockForMemberVote(address _of, uint _days) external;
  function withdrawClaimAssessmentTokens(address _of) external;

  function getLockReasons(address _of) external view returns (bytes32[] memory reasons);

  function getLockedTokensValidity(address _of, bytes32 reason) external view returns (uint256 validity);

  function getUnlockableTokens(address _of) external view returns (uint256 unlockableTokens);

  function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount);

  function tokensLockedWithValidity(address _of, bytes32 _reason)
  external
  view
  returns (uint256 amount, uint256 validity);

  function tokensUnlockable(address _of, bytes32 _reason) external view returns (uint256 amount);

  function totalSupply() external view returns (uint256);

  function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time) external view returns (uint256 amount);
  function totalBalanceOf(address _of) external view returns (uint256 amount);

  function totalLockedBalance(address _of) external view returns (uint256 amount);
}

File 15 of 17 : ITokenData.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface ITokenData {

  function walletAddress() external view returns (address payable);
  function lockTokenTimeAfterCoverExp() external view returns (uint);
  function bookTime() external view returns (uint);
  function lockCADays() external view returns (uint);
  function lockMVDays() external view returns (uint);
  function scValidDays() external view returns (uint);
  function joiningFee() external view returns (uint);
  function stakerCommissionPer() external view returns (uint);
  function stakerMaxCommissionPer() external view returns (uint);
  function tokenExponent() external view returns (uint);
  function priceStep() external view returns (uint);

  function depositedCN(uint) external view returns (uint amount, bool isDeposited);

  function lastCompletedStakeCommission(address) external view returns (uint);

  function changeWalletAddress(address payable _address) external;

  function getStakerStakedContractByIndex(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (address stakedContractAddress);

  function getStakerStakedBurnedByIndex(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint burnedAmount);

  function getStakerStakedUnlockableBeforeLastBurnByIndex(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint unlockable);

  function getStakerStakedContractIndex(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint scIndex);

  function getStakedContractStakerIndex(
    address _stakedContractAddress,
    uint _stakedContractIndex
  )
  external
  view
  returns (uint sIndex);

  function getStakerInitialStakedAmountOnContract(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint amount);

  function getStakerStakedContractLength(
    address _stakerAddress
  )
  external
  view
  returns (uint length);

  function getStakerUnlockedStakedTokens(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint amount);

  function pushUnlockedStakedTokens(
    address _stakerAddress,
    uint _stakerIndex,
    uint _amount
  ) external;


  function pushBurnedTokens(
    address _stakerAddress,
    uint _stakerIndex,
    uint _amount
  ) external;

  function pushUnlockableBeforeLastBurnTokens(
    address _stakerAddress,
    uint _stakerIndex,
    uint _amount
  ) external;

  function setUnlockableBeforeLastBurnTokens(
    address _stakerAddress,
    uint _stakerIndex,
    uint _amount
  ) external;

  function pushEarnedStakeCommissions(
    address _stakerAddress,
    address _stakedContractAddress,
    uint _stakedContractIndex,
    uint _commissionAmount
  ) external;

  function pushRedeemedStakeCommissions(
    address _stakerAddress,
    uint _stakerIndex,
    uint _amount
  ) external;

  function getStakerEarnedStakeCommission(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint);

  function getStakerRedeemedStakeCommission(
    address _stakerAddress,
    uint _stakerIndex
  )
  external
  view
  returns (uint);

  function getStakerTotalEarnedStakeCommission(
    address _stakerAddress
  )
  external
  view
  returns (uint totalCommissionEarned);

  function getStakerTotalReedmedStakeCommission(
    address _stakerAddress
  )
  external
  view
  returns (uint totalCommissionRedeemed);

  function setDepositCN(uint coverId, bool flag) external;

  function getStakedContractStakerByIndex(
    address _stakedContractAddress,
    uint _stakedContractIndex
  )
  external
  view
  returns (address stakerAddress);

  function getStakedContractStakersLength(
    address _stakedContractAddress
  ) external view returns (uint length);

  function addStake(
    address _stakerAddress,
    address _stakedContractAddress,
    uint _amount
  ) external returns (uint scIndex);

  function bookCATokens(address _of) external;

  function isCATokensBooked(address _of) external view returns (bool res);

  function setStakedContractCurrentCommissionIndex(
    address _stakedContractAddress,
    uint _index
  ) external;

  function setLastCompletedStakeCommissionIndex(
    address _stakerAddress,
    uint _index
  ) external;


  function setStakedContractCurrentBurnIndex(
    address _stakedContractAddress,
    uint _index
  ) external;

  function setDepositCNAmount(uint coverId, uint amount) external;
}

File 16 of 17 : INXMMaster.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface INXMMaster {

  function tokenAddress() external view returns (address);

  function owner() external view returns (address);

  function masterInitialized() external view returns (bool);

  function isInternal(address _add) external view returns (bool);

  function isPause() external view returns (bool check);

  function isOwner(address _add) external view returns (bool);

  function isMember(address _add) external view returns (bool);

  function checkIsAuthToGoverned(address _add) external view returns (bool);

  function dAppLocker() external view returns (address _add);

  function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress);

  function upgradeMultipleContracts(
    bytes2[] calldata _contractCodes,
    address payable[] calldata newAddresses
  ) external;

  function removeContracts(bytes2[] calldata contractCodesToRemove) external;

  function addNewInternalContracts(
    bytes2[] calldata _contractCodes,
    address payable[] calldata newAddresses,
    uint[] calldata _types
  ) external;

  function updateOwnerParameters(bytes8 code, address payable val) external;
}

File 17 of 17 : IPriceFeedOracle.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IPriceFeedOracle {

  function daiAddress() external view returns (address);
  function ETH() external view returns (address);

  function getAssetToEthRate(address asset) external view returns (uint);
  function getAssetForEth(address asset, uint ethIn) external view returns (uint);

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"masterAddress","type":"address"},{"internalType":"address","name":"_daiAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":true,"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"}],"name":"changeClaimStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"changeDependentContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_masterAddress","type":"address"}],"name":"changeMasterAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"records","type":"uint256"}],"name":"claimAllPendingReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_claimId","type":"uint256"}],"name":"closeClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getAllPendingRewardOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"currency","type":"bytes4"}],"name":"getCurrencyAssetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"check","type":"uint256"},{"internalType":"uint256","name":"claimId","type":"uint256"}],"name":"getRewardAndClaimedStatus","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getRewardToBeDistributedByUser","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"check","type":"uint256"},{"internalType":"uint256","name":"voteid","type":"uint256"},{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"getRewardToBeGiven","outputs":[{"internalType":"uint256","name":"tokenCalculated","type":"uint256"},{"internalType":"bool","name":"lastClaimedCheck","type":"bool"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"uint256","name":"perc","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mcr","outputs":[{"internalType":"contract IMCR","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ms","outputs":[{"internalType":"contract INXMMaster","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nxMasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"coverId","type":"uint256"}],"name":"unlockCoverNote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAdd","type":"address"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004a8f38038062004a8f833981810160405260408110156200003757600080fd5b50805160209091015162000054826001600160e01b036200007b16565b600d80546001600160a01b0319166001600160a01b03929092169190911790555062000106565b6000546001600160a01b031615620000da576000546001600160a01b03163314620000da576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b61497980620001166000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063a0b2d57f116100a2578063d46655f411610071578063d46655f414610282578063df31f208146102a8578063e0bab4c4146102f7578063e3dee239146102ff578063f17a3bec146103265761010b565b8063a0b2d57f14610238578063b8caedc414610240578063bf44d1bb14610248578063c3e4d672146102655761010b565b8063452efce9116100de578063452efce9146101b457806363bb23be146101da5780637f6715c9146101f75780638322fff2146102145761010b565b80630900f010146101105780630ea9c9841461013857806335afb14e1461014057806341becc0714610178575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661032e565b005b6101366104bc565b6101666004803603602081101561015657600080fd5b50356001600160a01b0316610b64565b60408051918252519081900360200190f35b61019b6004803603604081101561018e57600080fd5b5080359060200135610c9b565b6040805192835290151560208301528051918290030190f35b610166600480360360208110156101ca57600080fd5b50356001600160a01b0316611011565b610136600480360360208110156101f057600080fd5b5035611315565b6101366004803603602081101561020d57600080fd5b5035611566565b61021c611675565b604080516001600160a01b039092168252519081900360200190f35b61021c61168d565b61021c61169c565b6101366004803603602081101561025e57600080fd5b50356116ab565b6101366004803603602081101561027b57600080fd5b5035611734565b6101366004803603602081101561029857600080fd5b50356001600160a01b03166118a7565b6102d1600480360360608110156102be57600080fd5b5080359060208101359060400135611930565b604080519485529215156020850152838301919091526060830152519081900360800190f35b61021c611e25565b61021c6004803603602081101561031557600080fd5b50356001600160e01b031916611e34565b61021c611ee0565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561037957600080fd5b505afa15801561038d573d6000803e3d6000fd5b505050506040513d60208110156103a357600080fd5b50516103ae57600080fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156103f957600080fd5b505afa15801561040d573d6000803e3d6000fd5b505050506040513d602081101561042357600080fd5b5051905080156104b8576002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561048357600080fd5b505af1158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104b857600080fd5b5050565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d602081101561053157600080fd5b505161053c57600080fd5b600054604080516227050b60e31b81526110d360f21b600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b15801561058b57600080fd5b505afa15801561059f573d6000803e3d6000fd5b505050506040513d60208110156105b557600080fd5b5051600680546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526110d160f21b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561061a57600080fd5b505afa15801561062e573d6000803e3d6000fd5b505050506040513d602081101561064457600080fd5b5051600780546001600160a01b0319166001600160a01b03928316179055600054604080516313aedd4b60e31b815290519190921691639d76ea58916004808301926020929190829003018186803b15801561069f57600080fd5b505afa1580156106b3573d6000803e3d6000fd5b505050506040513d60208110156106c957600080fd5b5051600280546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261544360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d602081101561075857600080fd5b5051600380546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261151160f21b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156107bd57600080fd5b505afa1580156107d1573d6000803e3d6000fd5b505050506040513d60208110156107e757600080fd5b5051600480546001600160a01b0319166001600160a01b03928316178155600054604080516227050b60e31b815261145160f21b9381019390935251921691630138285891602480820192602092909190829003018186803b15801561084c57600080fd5b505afa158015610860573d6000803e3d6000fd5b505050506040513d602081101561087657600080fd5b5051600580546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526123ab60f11b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156108db57600080fd5b505afa1580156108ef573d6000803e3d6000fd5b505050506040513d602081101561090557600080fd5b5051600980546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261505360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561096a57600080fd5b505afa15801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526126a960f11b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156109f957600080fd5b505afa158015610a0d573d6000803e3d6000fd5b505050506040513d6020811015610a2357600080fd5b5051600b80546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261503160f01b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610a8857600080fd5b505afa158015610a9c573d6000803e3d6000fd5b505050506040513d6020811015610ab257600080fd5b5051600880546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b8152614d4360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610b1757600080fd5b505afa158015610b2b573d6000803e3d6000fd5b505050506040513d6020811015610b4157600080fd5b5051600c80546001600160a01b0319166001600160a01b03909216919091179055565b600080610b7083611011565b600a5460408051630ea474c760e01b81526001600160a01b03878116600483015291519394506000939190921691630ea474c7916024808301926020929190829003018186803b158015610bc357600080fd5b505afa158015610bd7573d6000803e3d6000fd5b505050506040513d6020811015610bed57600080fd5b5051600954604080516326fceb5d60e11b81526001600160a01b03888116600483015291519394506000939190921691634df9d6ba916024808301926020929190829003018186803b158015610c4257600080fd5b505afa158015610c56573d6000803e3d6000fd5b505050506040513d6020811015610c6c57600080fd5b50519050610c9081610c84858563ffffffff611eef16565b9063ffffffff611eef16565b93505050505b919050565b60008060008060008660011415610e525760075460408051630d3c678b60e21b815233600482015290516001600160a01b03909216916334f19e2c91602480820192602092909190829003018186803b158015610cf757600080fd5b505afa158015610d0b573d6000803e3d6000fd5b505050506040513d6020811015610d2157600080fd5b5051905060005b81811015610e4c576007546040805163fc57c9bb60e01b81523360048201526024810184905290516001600160a01b039092169163fc57c9bb91604480820192602092909190829003018186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b5051600754604080516354a1b43160e01b81526004810184905290519296506001600160a01b03909116916354a1b43191602480820192608092909190829003018186803b158015610dfd57600080fd5b505afa158015610e11573d6000803e3d6000fd5b505050506040513d6080811015610e2757600080fd5b5060208101516060909101519550925086831415610e4457610e4c565b600101610d28565b50610ff4565b6007546040805163274d865f60e01b815233600482015290516001600160a01b039092169163274d865f91602480820192602092909190829003018186803b158015610e9d57600080fd5b505afa158015610eb1573d6000803e3d6000fd5b505050506040513d6020811015610ec757600080fd5b5051905060005b81811015610ff25760075460408051637968b71560e11b81523360048201526024810184905290516001600160a01b039092169163f2d16e2a91604480820192602092909190829003018186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d6020811015610f5257600080fd5b5051600754604080516354a1b43160e01b81526004810184905290519296506001600160a01b03909116916354a1b43191602480820192608092909190829003018186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6080811015610fcd57600080fd5b5060208101516060909101519550925086831415610fea57610ff2565b600101610ece565b505b61100087846001611930565b509199959850949650505050505050565b60075460408051630d3c678b60e21b81526001600160a01b0384811660048301529151600093849316916334f19e2c916024808301926020929190829003018186803b15801561106057600080fd5b505afa158015611074573d6000803e3d6000fd5b505050506040513d602081101561108a57600080fd5b5051600754604080516304ecffeb60e01b81526001600160a01b038781166004830152825194955060009485948594859493909116926304ecffeb9260248083019392829003018186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d604081101561110b57600080fd5b5080516020909101519094509250835b858110156111d4576007546040805163fc57c9bb60e01b81526001600160a01b038b81166004830152602482018590529151919092169163fc57c9bb916044808301926020929190829003018186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d60208110156111a157600080fd5b505191506111b26001836000611930565b509194506111ca91508890508463ffffffff611eef16565b965060010161111b565b506007546040805163274d865f60e01b81526001600160a01b038a811660048301529151919092169163274d865f916024808301926020929190829003018186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d602081101561124c57600080fd5b50519450825b8581101561130a5760075460408051637968b71560e11b81526001600160a01b038b81166004830152602482018590529151919092169163f2d16e2a916044808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505191506112e860008381611930565b5091945061130091508890508463ffffffff611eef16565b9650600101611252565b505050505050919050565b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505115801561141357506000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b505115156001145b61141c57600080fd5b61142581611f52565b600a5460408051632e1b8c8760e21b815233600482015290516001600160a01b039092169163b86e321c9160248082019260009290919082900301818387803b15801561147157600080fd5b505af1158015611485573d6000803e3d6000fd5b5050600954604080516305d38c7160e21b8152336004820152602481018690529051600094506001600160a01b03909216925063174e31c491604480830192602092919082900301818787803b1580156114de57600080fd5b505af11580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b5051905080156104b8576002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561048357600080fd5b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156115b357600080fd5b505afa1580156115c7573d6000803e3d6000fd5b505050506040513d60208110156115dd57600080fd5b5051156115e957600080fd5b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561163457600080fd5b505afa158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b505161166957600080fd5b61167281612b6c565b50565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000546001600160a01b031681565b600c546001600160a01b031681565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b505161172b57600080fd5b61167281612d9a565b60075460408051635aef244760e01b815260048101849052905160009283926001600160a01b0390911691635aef24479160248082019260c092909190829003018186803b15801561178557600080fd5b505afa158015611799573d6000803e3d6000fd5b505050506040513d60c08110156117af57600080fd5b50606081015160809091015190925090506000600c8314158061185a575042611858600760009054906101000a90046001600160a01b03166001600160a01b031663ee8dea636040518163ffffffff1660e01b815260040160206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d602081101561184957600080fd5b5051849063ffffffff611eef16565b105b9050806118985760405162461bcd60e51b815260040180806020018281038252602c815260200180614919602c913960400191505060405180910390fd5b6118a184612b6c565b50505050565b6000546001600160a01b031615611904576000546001600160a01b03163314611904576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6000806000806000806000806000600760009054906101000a90046001600160a01b03166001600160a01b03166354a1b4318c6040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60808110156119c157600080fd5b5080516020808301516040808501516060909501516007548251631381b00560e21b815260048101859052925160009f50959d50929a509498509396508b936001600160a01b0390911692634e06c01492602480840193919291829003018186803b158015611a2f57600080fd5b505afa158015611a43573d6000803e3d6000fd5b505050506040513d6020811015611a5957600080fd5b50519050600081900b611a6b57600198505b8460000b8160000b148015611a885750831580611a8857508a6001145b15611e16578c60011415611b1f576007546040805163c49a8b1960e01b81526004810189905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d6060811015611b0c57600080fd5b5080516040909101519097509250611ba7565b6007546040805163c49a8b1960e01b81526004810189905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d6060811015611b9557600080fd5b50602081015160409091015190975092505b8615611e16578c60011415611cc7578460000b60011415611c4457600754604080516336f4019360e21b81526004810189905290516001600160a01b039092169163dbd0064c91602480820192606092909190829003018186803b158015611c0e57600080fd5b505afa158015611c22573d6000803e3d6000fd5b505050506040513d6060811015611c3857600080fd5b50602001519150611cc2565b600754604080516336f4019360e21b81526004810189905290516001600160a01b039092169163dbd0064c91602480820192606092909190829003018186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b505050506040513d6060811015611cba57600080fd5b506040015191505b611dd3565b8460000b60011415611d555760075460408051634a4ecebb60e11b81526004810189905290516001600160a01b039092169163949d9d7691602480820192606092909190829003018186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d6060811015611d4957600080fd5b50602001519150611dd3565b60075460408051634a4ecebb60e11b81526004810189905290516001600160a01b039092169163949d9d7691602480820192606092909190829003018186803b158015611da157600080fd5b505afa158015611db5573d6000803e3d6000fd5b505050506040513d6060811015611dcb57600080fd5b506040015191505b611e13611de783606463ffffffff612f4416565b611e0785611dfb8b8d63ffffffff612f4416565b9063ffffffff612f4416565b9063ffffffff612f9d16565b99505b50505050505093509350935093565b600d546001600160a01b031681565b60006208aa8960eb1b6001600160e01b031983161415611e69575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610c96565b6244414960e81b6001600160e01b031983161415611e935750600d546001600160a01b0316610c96565b6040805162461bcd60e51b815260206004820152601b60248201527f436c61696d735265776172643a20756e6b6e6f776e2061737365740000000000604482015290519081900360640190fd5b6001546001600160a01b031681565b600082820183811015611f49576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60075460408051630d3c678b60e21b815233600482015290516000926001600160a01b0316916334f19e2c916024808301926020929190829003018186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6020811015611fc757600080fd5b5051600754604080516304ecffeb60e01b8152336004820152815193945060009384936001600160a01b0316926304ecffeb9260248082019391829003018186803b15801561201557600080fd5b505afa158015612029573d6000803e3d6000fd5b505050506040513d604081101561203f57600080fd5b505190506000808080808080878a5b8b8210801561205c57508c85105b156123cd576007546040805163fc57c9bb60e01b81523360048201526024810185905290516001600160a01b039092169163fc57c9bb91604480820192602092909190829003018186803b1580156120b357600080fd5b505afa1580156120c7573d6000803e3d6000fd5b505050506040513d60208110156120dd57600080fd5b50519a506120ee60018c6000611930565b929a5090985090935050808c14801561210957506001871515145b156121115750805b600754604080516354a1b43160e01b8152600481018e905290516001600160a01b03909216916354a1b43191602480820192608092909190829003018186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d608081101561218757600080fd5b5060208101516060909101519650935082158015906121a4575085155b15612220576007546040805163f27a104760e01b8152600481018e9052600160248201819052915191909701966001600160a01b039092169163f27a104791604480830192600092919082900301818387803b15801561220357600080fd5b505af1158015612217573d6000803e3d6000fd5b505050506123a9565b821580156122a7575060075460408051631381b00560e21b81526004810187905290516001600160a01b0390921691634e06c01491602480820192602092909190829003018186803b15801561227557600080fd5b505afa158015612289573d6000803e3d6000fd5b505050506040513d602081101561229f57600080fd5b505160000b15155b80156122b1575085155b156123a9576007546040805163c49a8b1960e01b81526004810187905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d606081101561232c57600080fd5b505192508261233c576001909401935b6007546040805163f27a104760e01b8152600481018e90526001602482015290516001600160a01b039092169163f27a10479160448082019260009290919082900301818387803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050505b87156123c2576123bf888a63ffffffff611eef16565b98505b60019091019061204e565b8b8114156124455760075460408051632f9f2f1760e21b81523360048201526024810185905290516001600160a01b039092169163be7cbc5c9160448082019260009290919082900301818387803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b505050506124b1565b60075460408051632f9f2f1760e21b81523360048201526024810184905290516001600160a01b039092169163be7cbc5c9160448082019260009290919082900301818387803b15801561249857600080fd5b505af11580156124ac573d6000803e3d6000fd5b505050505b6007546040805163274d865f60e01b815233600482015290516001600160a01b039092169163274d865f91602480820192602092909190829003018186803b1580156124fc57600080fd5b505afa158015612510573d6000803e3d6000fd5b505050506040513d602081101561252657600080fd5b5051600480546040805163034b044160e21b81529051939f508f94506000936001600160a01b0390921692630d2c1104928282019260209290829003018186803b15801561257357600080fd5b505afa158015612587573d6000803e3d6000fd5b505050506040513d602081101561259d57600080fd5b5051905060006125b3828863ffffffff612f4416565b905060006125c7428463ffffffff611eef16565b6003546040805163023e00b360e21b815233600482015262434c4160e81b602482015290519293506000926001600160a01b03909216916308f802cc91604480820192602092909190829003018186803b15801561262457600080fd5b505afa158015612638573d6000803e3d6000fd5b505050506040513d602081101561264e57600080fd5b50519050818111156126fc578161266b828563ffffffff612fdf16565b101561268457612681818363ffffffff612fdf16565b92505b60035460408051631fea558f60e01b815233600482015262434c4160e81b60248201526044810186905290516001600160a01b0390921691631fea558f9160648082019260009290919082900301818387803b1580156126e357600080fd5b505af11580156126f7573d6000803e3d6000fd5b505050505b5050600754604080516304ecffeb60e01b815233600482015281516001600160a01b0390931694506304ecffeb935060248082019391829003018186803b15801561274657600080fd5b505afa15801561275a573d6000803e3d6000fd5b505050506040513d604081101561277057600080fd5b50602001519950600094508991508b90505b8b8210801561279057508c85105b156129ea5760075460408051637968b71560e11b81523360048201526024810185905290516001600160a01b039092169163f2d16e2a91604480820192602092909190829003018186803b1580156127e757600080fd5b505afa1580156127fb573d6000803e3d6000fd5b505050506040513d602081101561281157600080fd5b50519a5061282160008c81611930565b50919950975050808c14801561283957506001871515145b156128415750805b600754604080516354a1b43160e01b8152600481018e905290516001600160a01b03909216916354a1b43191602480820192608092909190829003018186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60808110156128b757600080fd5b506020810151606090910151965093508515801561294e575060075460408051631381b00560e21b81526004810187905290516001600160a01b0390921691634e06c01491602480820192602092909190829003018186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d602081101561294657600080fd5b505160000b15155b156129c6576007546040805163f27a104760e01b8152600481018e90526001602482015290516001600160a01b039092169163f27a10479160448082019260009290919082900301818387803b1580156129a757600080fd5b505af11580156129bb573d6000803e3d6000fd5b505060019096019550505b87156129df576129dc888a63ffffffff611eef16565b98505b600190910190612782565b8815612a79576002546040805163a9059cbb60e01b8152336004820152602481018c905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612a4457600080fd5b505af1158015612a58573d6000803e3d6000fd5b505050506040513d6020811015612a6e57600080fd5b5051612a7957600080fd5b8b811415612af15760075460408051630f305e9560e21b81523360048201526024810185905290516001600160a01b0390921691633cc17a549160448082019260009290919082900301818387803b158015612ad457600080fd5b505af1158015612ae8573d6000803e3d6000fd5b50505050612b5d565b60075460408051630f305e9560e21b81523360048201526024810184905290516001600160a01b0390921691633cc17a549160448082019260009290919082900301818387803b158015612b4457600080fd5b505af1158015612b58573d6000803e3d6000fd5b505050505b50505050505050505050505050565b600754604080516396ff592f60e01b81526004810184905281516000936001600160a01b0316926396ff592f9260248082019391829003018186803b158015612bb457600080fd5b505afa158015612bc8573d6000803e3d6000fd5b505050506040513d6040811015612bde57600080fd5b506020015160075460408051630325ea3760e01b81526004810186905281519394506000936001600160a01b0390931692630325ea3792602480840193919291829003018186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d6040811015612c5c57600080fd5b5060200151905080612c7857612c73838383613021565b612d95565b60018110158015612c8a575060058111155b15612c9a57612c738383836134e7565b80600c1415612d95576000612cae83613994565b90508015612d275760065460408051637a88deff60e11b815260048101879052600e602482015290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b158015612d0a57600080fd5b505af1158015612d1e573d6000803e3d6000fd5b505050506118a1565b60065460408051637a88deff60e11b815260048101879052600c602482015290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b50505050505b505050565b60055460408051633c2d4daf60e01b81526004810184905290516000926001600160a01b031691633c2d4daf916024808301926020929190829003018186803b158015612de657600080fd5b505afa158015612dfa573d6000803e3d6000fd5b505050506040513d6020811015612e1057600080fd5b5051604080516121a760f11b602080830191909152606084901b6bffffffffffffffffffffffff1916602283015260368083018790528351808403909101815260568301808552815191830191909120600354631729236360e21b9092526001600160a01b03808716605a860152607a850182905294519596509460009490911692635ca48d8c92609a808301939192829003018186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d6020811015612ede57600080fd5b5051905080156118a15760035460408051634063ab0d60e11b81526001600160a01b0386811660048301526024820186905260448201859052915191909216916380c7561a91606480830192600092919082900301818387803b158015612d7b57600080fd5b600082612f5357506000611f4c565b82820282848281612f6057fe5b0414611f495760405162461bcd60e51b81526004018080602001828103825260218152602001806148f86021913960400191505060405180910390fd5b6000611f4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614077565b6000611f4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614119565b6006546040805163778aa67960e11b81526004810186905290516001600160a01b039092169163ef154cf291602480820192602092909190829003018186803b15801561306d57600080fd5b505afa158015613081573d6000803e3d6000fd5b505050506040513d602081101561309757600080fd5b505160000b60011415612d9557600654604080516357af051560e01b815260048101869052600060248201819052915191926001600160a01b0316916357af051591604480820192602092909190829003018186803b1580156130f957600080fd5b505afa15801561310d573d6000803e3d6000fd5b505050506040513d602081101561312357600080fd5b505160075460408051631509d4c960e21b81526004810188905260016024820152815193945060009384938493849384936001600160a01b0390931692635427532492604480840193919291829003018186803b15801561318357600080fd5b505afa158015613197573d6000803e3d6000fd5b505050506040513d60408110156131ad57600080fd5b506020015160075460408051631509d4c960e21b8152600481018d9052600019602482015281519398506001600160a01b03909216926354275324926044808201939291829003018186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d604081101561322f57600080fd5b50602001519350613246858563ffffffff611eef16565b925061325985606463ffffffff612f4416565b945061326c84606463ffffffff612f4416565b93508561327c576003965061345f565b60055460408051631ce48f3d60e01b8152600481018b9052905161330e92670de0b6b3a7640000926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156132d657600080fd5b505afa1580156132ea573d6000803e3d6000fd5b505050506040513d602081101561330057600080fd5b50519063ffffffff612f4416565b905061332181600563ffffffff612f4416565b86111561342b57604661333a868563ffffffff612f9d16565b11156133bd57600554600797506001600160a01b031663ae1c5eca8960015b6040518363ffffffff1660e01b8152600401808381526020018260ff1660ff16815260200192505050600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b5050505060019150613426565b60466133cf858563ffffffff612f9d16565b11156133f257600554600697506001600160a01b031663ae1c5eca896002613359565b613402848463ffffffff612f9d16565b613412868563ffffffff612f9d16565b11156134215760049650613426565b600596505b61345f565b61343b848463ffffffff612f9d16565b61344b868563ffffffff612f9d16565b111561345a576002965061345f565b600396505b60065460408051637a88deff60e11b8152600481018c9052602481018a905290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b1580156134b357600080fd5b505af11580156134c7573d6000803e3d6000fd5b5050505081156134dc576134dc898989614173565b505050505050505050565b6006546040805163778aa67960e11b81526004810186905290516001600160a01b039092169163ef154cf291602480820192602092909190829003018186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b505160000b60011415612d9557600654604080516357af051560e01b815260048101869052600160248201529051600092849284926001600160a01b03909216916357af051591604480820192602092909190829003018186803b1580156135c457600080fd5b505afa1580156135d8573d6000803e3d6000fd5b505050506040513d60208110156135ee57600080fd5b505160055460408051631ce48f3d60e01b815260048101899052905192935060009261365092670de0b6b3a7640000926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156132d657600080fd5b9050600061366582600563ffffffff612f4416565b831015613670575060015b60075460408051635ca1ce8b60e01b8152600481018b90526001602482015281516000936001600160a01b031692635ca1ce8b9260448082019391829003018186803b1580156136bf57600080fd5b505afa1580156136d3573d6000803e3d6000fd5b505050506040513d60408110156136e957600080fd5b506020015160075460408051635ca1ce8b60e01b8152600481018d9052600019602482015281519394506000936001600160a01b0390931692635ca1ce8b92604480840193919291829003018186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d604081101561376f57600080fd5b506020015190506000613788838363ffffffff611eef16565b11156138445760326137b46137a3848463ffffffff611eef16565b611e0785606463ffffffff612f4416565b101580156137c25750600186115b80156137cf575060058611155b80156137d9575082155b156137eb576008975060019650613844565b6032613811613800848463ffffffff611eef16565b611e0784606463ffffffff612f4416565b1015801561381f5750600186115b801561382c575060058611155b8015613836575082155b156138445760099750600296505b82600114801561385e5750856002148061385e5750856004145b1561387057600a9750600196506138a3565b8260011480156138955750856005148061388a5750856003145b806138955750856001145b156138a357600b9750600296505b60065460408051637a88deff60e11b8152600481018d9052602481018b905290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b1580156138f757600080fd5b505af115801561390b573d6000803e3d6000fd5b50506005546040805163570e2f6560e11b8152600481018e905260ff8c16602482015290516001600160a01b03909216935063ae1c5eca925060448082019260009290919082900301818387803b15801561396557600080fd5b505af1158015613979573d6000803e3d6000fd5b505050506139888a8a8a614173565b50505050505050505050565b60055460408051631ce48f3d60e01b815260048101849052905160009283926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156139e557600080fd5b505afa1580156139f9573d6000803e3d6000fd5b505050506040513d6020811015613a0f57600080fd5b505190506000613a2d82670de0b6b3a764000063ffffffff612f4416565b600554604080516322d5c8bd60e21b81526004810188905290519293506000926001600160a01b0390921691638b5722f491602480820192602092909190829003018186803b158015613a7f57600080fd5b505afa158015613a93573d6000803e3d6000fd5b505050506040513d6020811015613aa957600080fd5b505190506000613ab882611e34565b60055460408051633c2d4daf60e01b8152600481018a905290519293506000926001600160a01b0390921691633c2d4daf91602480820192602092909190829003018186803b158015613b0a57600080fd5b505afa158015613b1e573d6000803e3d6000fd5b505050506040513d6020811015613b3457600080fd5b5051600b5460408051621d624360e71b81526001600160a01b03808516600483015291519394506000939190921691630eb12180916024808301926020929190829003018186803b158015613b8857600080fd5b505afa158015613b9c573d6000803e3d6000fd5b505050506040513d6020811015613bb257600080fd5b5051600854604080516375466b9b60e01b81526001600160a01b0387811660048301528085166024830152604482018a9052915193945060009391909216916375466b9b91606480830192602092919082900301818787803b158015613c1757600080fd5b505af1158015613c2b573d6000803e3d6000fd5b505050506040513d6020811015613c4157600080fd5b5051905080156140685760055460408051638d16a10560e01b8152600481018c905281516000936001600160a01b031692638d16a1059260248082019391829003018186803b158015613c9357600080fd5b505afa158015613ca7573d6000803e3d6000fd5b505050506040513d6040811015613cbd57600080fd5b5060209081015160085460408051630681320d60e51b81526001600160a01b038a811660048301529151939550600094919092169263d02641a0926024808201939291829003018186803b158015613d1457600080fd5b505afa158015613d28573d6000803e3d6000fd5b505050506040513d6020811015613d3e57600080fd5b505190506000613d6082611e078b670de0b6b3a764000063ffffffff612f4416565b600a54604080516368989a5960e01b81526001600160a01b0387811660048301526024820185905291519394509116916368989a599160448082019260009290919082900301818387803b158015613db757600080fd5b505af1158015613dcb573d6000803e3d6000fd5b505050506000600560009054906101000a90046001600160a01b03166001600160a01b0316638d16a1058e6040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015613e2957600080fd5b505afa158015613e3d573d6000803e3d6000fd5b505050506040513d6040811015613e5357600080fd5b5060200151600554604080516360a230e760e01b81526001600160e01b03198d166004820152602481018f905290519293506001600160a01b03909116916360a230e79160448082019260009290919082900301818387803b158015613eb857600080fd5b505af1158015613ecc573d6000803e3d6000fd5b50505050600560009054906101000a90046001600160a01b03166001600160a01b03166381d760ae828b8e6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160e01b0319166001600160e01b03191681526020018281526020019350505050600060405180830381600087803b158015613f6157600080fd5b505af1158015613f75573d6000803e3d6000fd5b5050600c54600854604080516305e09af360e31b815290516001600160a01b039384169550638cd4f0a094509190921691632f04d798916004808301926020929190829003018186803b158015613fcb57600080fd5b505afa158015613fdf573d6000803e3d6000fd5b505050506040513d6020811015613ff557600080fd5b5051604080516001600160e01b031960e085901b16815260048101929092526001602483015251604480830192600092919082900301818387803b15801561403c57600080fd5b505af1158015614050573d6000803e3d6000fd5b5050505060019b505050505050505050505050610c96565b50600098975050505050505050565b600081836141035760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140c85781810151838201526020016140b0565b50505050905090810190601f1680156140f55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161410f57fe5b0495945050505050565b6000818484111561416b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156140c85781810151838201526020016140b0565b505050900390565b6005546040805163ba38de3560e01b81526004810185905290516000926001600160a01b03169163ba38de35916024808301926020929190829003018186803b1580156141bf57600080fd5b505afa1580156141d3573d6000803e3d6000fd5b505050506040513d60208110156141e957600080fd5b505160075460408051635459cad560e11b8152905192935060009261427a92606492611e07926001600160a01b039092169163a8b395aa91600480820192602092909190829003018186803b15801561424157600080fd5b505afa158015614255573d6000803e3d6000fd5b505050506040513d602081101561426b57600080fd5b5051859063ffffffff612f4416565b60075460408051635f39579d60e01b815260048101879052815193945060009384936001600160a01b031692635f39579d9260248082019391829003018186803b1580156142c757600080fd5b505afa1580156142db573d6000803e3d6000fd5b505050506040513d60408110156142f157600080fd5b50805160209091015160075460408051636339392560e11b8152600481018c905260248101859052604481018490526064810188905290519395509193506001600160a01b03169163c672724a9160848082019260009290919082900301818387803b15801561436057600080fd5b505af1158015614374573d6000803e3d6000fd5b5050505060008211806143875750600081115b156143f857600354604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156143df57600080fd5b505af11580156143f3573d6000803e3d6000fd5b505050505b84600614806144075750846009145b80614412575084600b145b156144fb57600754604080516346f4da5760e01b8152600481018a9052600019602482015290516001600160a01b03909216916346f4da579160448082019260009290919082900301818387803b15801561446c57600080fd5b505af1158015614480573d6000803e3d6000fd5b50506003546040805163eb78c07d60e01b8152600481018b905260006024820181905291516001600160a01b03909316945063eb78c07d93506044808201939182900301818387803b1580156144d557600080fd5b505af11580156144e9573d6000803e3d6000fd5b505050506144f686614692565b614689565b846007148061450a5750846008145b80614515575084600a145b1561468957600754604080516346f4da5760e01b8152600481018a90526001602482015290516001600160a01b03909216916346f4da579160448082019260009290919082900301818387803b15801561456e57600080fd5b505af1158015614582573d6000803e3d6000fd5b50506003546040805163eb78c07d60e01b8152600481018b90526001602482015290516001600160a01b03909216935063eb78c07d925060448082019260009290919082900301818387803b1580156145da57600080fd5b505af11580156145ee573d6000803e3d6000fd5b505050506145fb86612d9a565b600061460687613994565b905060008161461657600c614619565b600e5b60065460408051637a88deff60e11b8152600481018d905260ff939093166024840181905290519093506001600160a01b039091169163f511bdfe91604480830192600092919082900301818387803b15801561467557600080fd5b505af1158015612b5d573d6000803e3d6000fd5b50505050505050565b60055460408051633c2d4daf60e01b81526004810184905290516000926001600160a01b031691633c2d4daf916024808301926020929190829003018186803b1580156146de57600080fd5b505afa1580156146f2573d6000803e3d6000fd5b505050506040513d602081101561470857600080fd5b5051604080516121a760f11b602080830191909152606084901b6bffffffffffffffffffffffff1916602283015260368083018790528351808403909101815260568301808552815191830191909120600354631729236360e21b9092526001600160a01b03808716605a860152607a850182905294519596509460009490911692635ca48d8c92609a808301939192829003018186803b1580156147ac57600080fd5b505afa1580156147c0573d6000803e3d6000fd5b505050506040513d60208110156147d657600080fd5b50516004805460408051630ee0985160e11b815292830188905280519394506000936001600160a01b0390921692631dc130a29260248083019392829003018186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d604081101561484f57600080fd5b5051905061486481600263ffffffff612f9d16565b905060008183106148755781614877565b825b905080156148ef5760035460408051637aef5b7360e01b81526001600160a01b038881166004830152602482018890526044820186905291519190921691637aef5b7391606480830192600092919082900301818387803b1580156148db57600080fd5b505af1158015613988573d6000803e3d6000fd5b50505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436c61696d735265776172643a205061796f75742072657472792074696d65206e6f7420726561636865642ea265627a7a7231582091fb8fce9f2ffd0bc90ab452f14433796205adc8947e0d65c877bd53ec28a5ce64736f6c6343000511003200000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063a0b2d57f116100a2578063d46655f411610071578063d46655f414610282578063df31f208146102a8578063e0bab4c4146102f7578063e3dee239146102ff578063f17a3bec146103265761010b565b8063a0b2d57f14610238578063b8caedc414610240578063bf44d1bb14610248578063c3e4d672146102655761010b565b8063452efce9116100de578063452efce9146101b457806363bb23be146101da5780637f6715c9146101f75780638322fff2146102145761010b565b80630900f010146101105780630ea9c9841461013857806335afb14e1461014057806341becc0714610178575b600080fd5b6101366004803603602081101561012657600080fd5b50356001600160a01b031661032e565b005b6101366104bc565b6101666004803603602081101561015657600080fd5b50356001600160a01b0316610b64565b60408051918252519081900360200190f35b61019b6004803603604081101561018e57600080fd5b5080359060200135610c9b565b6040805192835290151560208301528051918290030190f35b610166600480360360208110156101ca57600080fd5b50356001600160a01b0316611011565b610136600480360360208110156101f057600080fd5b5035611315565b6101366004803603602081101561020d57600080fd5b5035611566565b61021c611675565b604080516001600160a01b039092168252519081900360200190f35b61021c61168d565b61021c61169c565b6101366004803603602081101561025e57600080fd5b50356116ab565b6101366004803603602081101561027b57600080fd5b5035611734565b6101366004803603602081101561029857600080fd5b50356001600160a01b03166118a7565b6102d1600480360360608110156102be57600080fd5b5080359060208101359060400135611930565b604080519485529215156020850152838301919091526060830152519081900360800190f35b61021c611e25565b61021c6004803603602081101561031557600080fd5b50356001600160e01b031916611e34565b61021c611ee0565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561037957600080fd5b505afa15801561038d573d6000803e3d6000fd5b505050506040513d60208110156103a357600080fd5b50516103ae57600080fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156103f957600080fd5b505afa15801561040d573d6000803e3d6000fd5b505050506040513d602081101561042357600080fd5b5051905080156104b8576002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561048357600080fd5b505af1158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104b857600080fd5b5050565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561050757600080fd5b505afa15801561051b573d6000803e3d6000fd5b505050506040513d602081101561053157600080fd5b505161053c57600080fd5b600054604080516227050b60e31b81526110d360f21b600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b15801561058b57600080fd5b505afa15801561059f573d6000803e3d6000fd5b505050506040513d60208110156105b557600080fd5b5051600680546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526110d160f21b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561061a57600080fd5b505afa15801561062e573d6000803e3d6000fd5b505050506040513d602081101561064457600080fd5b5051600780546001600160a01b0319166001600160a01b03928316179055600054604080516313aedd4b60e31b815290519190921691639d76ea58916004808301926020929190829003018186803b15801561069f57600080fd5b505afa1580156106b3573d6000803e3d6000fd5b505050506040513d60208110156106c957600080fd5b5051600280546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261544360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561072e57600080fd5b505afa158015610742573d6000803e3d6000fd5b505050506040513d602081101561075857600080fd5b5051600380546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261151160f21b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156107bd57600080fd5b505afa1580156107d1573d6000803e3d6000fd5b505050506040513d60208110156107e757600080fd5b5051600480546001600160a01b0319166001600160a01b03928316178155600054604080516227050b60e31b815261145160f21b9381019390935251921691630138285891602480820192602092909190829003018186803b15801561084c57600080fd5b505afa158015610860573d6000803e3d6000fd5b505050506040513d602081101561087657600080fd5b5051600580546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526123ab60f11b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156108db57600080fd5b505afa1580156108ef573d6000803e3d6000fd5b505050506040513d602081101561090557600080fd5b5051600980546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261505360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561096a57600080fd5b505afa15801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526126a960f11b6004820152905191909216916301382858916024808301926020929190829003018186803b1580156109f957600080fd5b505afa158015610a0d573d6000803e3d6000fd5b505050506040513d6020811015610a2357600080fd5b5051600b80546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261503160f01b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610a8857600080fd5b505afa158015610a9c573d6000803e3d6000fd5b505050506040513d6020811015610ab257600080fd5b5051600880546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b8152614d4360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610b1757600080fd5b505afa158015610b2b573d6000803e3d6000fd5b505050506040513d6020811015610b4157600080fd5b5051600c80546001600160a01b0319166001600160a01b03909216919091179055565b600080610b7083611011565b600a5460408051630ea474c760e01b81526001600160a01b03878116600483015291519394506000939190921691630ea474c7916024808301926020929190829003018186803b158015610bc357600080fd5b505afa158015610bd7573d6000803e3d6000fd5b505050506040513d6020811015610bed57600080fd5b5051600954604080516326fceb5d60e11b81526001600160a01b03888116600483015291519394506000939190921691634df9d6ba916024808301926020929190829003018186803b158015610c4257600080fd5b505afa158015610c56573d6000803e3d6000fd5b505050506040513d6020811015610c6c57600080fd5b50519050610c9081610c84858563ffffffff611eef16565b9063ffffffff611eef16565b93505050505b919050565b60008060008060008660011415610e525760075460408051630d3c678b60e21b815233600482015290516001600160a01b03909216916334f19e2c91602480820192602092909190829003018186803b158015610cf757600080fd5b505afa158015610d0b573d6000803e3d6000fd5b505050506040513d6020811015610d2157600080fd5b5051905060005b81811015610e4c576007546040805163fc57c9bb60e01b81523360048201526024810184905290516001600160a01b039092169163fc57c9bb91604480820192602092909190829003018186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b5051600754604080516354a1b43160e01b81526004810184905290519296506001600160a01b03909116916354a1b43191602480820192608092909190829003018186803b158015610dfd57600080fd5b505afa158015610e11573d6000803e3d6000fd5b505050506040513d6080811015610e2757600080fd5b5060208101516060909101519550925086831415610e4457610e4c565b600101610d28565b50610ff4565b6007546040805163274d865f60e01b815233600482015290516001600160a01b039092169163274d865f91602480820192602092909190829003018186803b158015610e9d57600080fd5b505afa158015610eb1573d6000803e3d6000fd5b505050506040513d6020811015610ec757600080fd5b5051905060005b81811015610ff25760075460408051637968b71560e11b81523360048201526024810184905290516001600160a01b039092169163f2d16e2a91604480820192602092909190829003018186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d6020811015610f5257600080fd5b5051600754604080516354a1b43160e01b81526004810184905290519296506001600160a01b03909116916354a1b43191602480820192608092909190829003018186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6080811015610fcd57600080fd5b5060208101516060909101519550925086831415610fea57610ff2565b600101610ece565b505b61100087846001611930565b509199959850949650505050505050565b60075460408051630d3c678b60e21b81526001600160a01b0384811660048301529151600093849316916334f19e2c916024808301926020929190829003018186803b15801561106057600080fd5b505afa158015611074573d6000803e3d6000fd5b505050506040513d602081101561108a57600080fd5b5051600754604080516304ecffeb60e01b81526001600160a01b038781166004830152825194955060009485948594859493909116926304ecffeb9260248083019392829003018186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d604081101561110b57600080fd5b5080516020909101519094509250835b858110156111d4576007546040805163fc57c9bb60e01b81526001600160a01b038b81166004830152602482018590529151919092169163fc57c9bb916044808301926020929190829003018186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d60208110156111a157600080fd5b505191506111b26001836000611930565b509194506111ca91508890508463ffffffff611eef16565b965060010161111b565b506007546040805163274d865f60e01b81526001600160a01b038a811660048301529151919092169163274d865f916024808301926020929190829003018186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d602081101561124c57600080fd5b50519450825b8581101561130a5760075460408051637968b71560e11b81526001600160a01b038b81166004830152602482018590529151919092169163f2d16e2a916044808301926020929190829003018186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d60208110156112d857600080fd5b505191506112e860008381611930565b5091945061130091508890508463ffffffff611eef16565b9650600101611252565b505050505050919050565b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561136257600080fd5b505afa158015611376573d6000803e3d6000fd5b505050506040513d602081101561138c57600080fd5b505115801561141357506000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b505115156001145b61141c57600080fd5b61142581611f52565b600a5460408051632e1b8c8760e21b815233600482015290516001600160a01b039092169163b86e321c9160248082019260009290919082900301818387803b15801561147157600080fd5b505af1158015611485573d6000803e3d6000fd5b5050600954604080516305d38c7160e21b8152336004820152602481018690529051600094506001600160a01b03909216925063174e31c491604480830192602092919082900301818787803b1580156114de57600080fd5b505af11580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b5051905080156104b8576002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561048357600080fd5b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156115b357600080fd5b505afa1580156115c7573d6000803e3d6000fd5b505050506040513d60208110156115dd57600080fd5b5051156115e957600080fd5b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b15801561163457600080fd5b505afa158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b505161166957600080fd5b61167281612b6c565b50565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000546001600160a01b031681565b600c546001600160a01b031681565b600054604080516323c5b10760e21b815233600482015290516001600160a01b0390921691638f16c41c91602480820192602092909190829003018186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b505161172b57600080fd5b61167281612d9a565b60075460408051635aef244760e01b815260048101849052905160009283926001600160a01b0390911691635aef24479160248082019260c092909190829003018186803b15801561178557600080fd5b505afa158015611799573d6000803e3d6000fd5b505050506040513d60c08110156117af57600080fd5b50606081015160809091015190925090506000600c8314158061185a575042611858600760009054906101000a90046001600160a01b03166001600160a01b031663ee8dea636040518163ffffffff1660e01b815260040160206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d602081101561184957600080fd5b5051849063ffffffff611eef16565b105b9050806118985760405162461bcd60e51b815260040180806020018281038252602c815260200180614919602c913960400191505060405180910390fd5b6118a184612b6c565b50505050565b6000546001600160a01b031615611904576000546001600160a01b03163314611904576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6000806000806000806000806000600760009054906101000a90046001600160a01b03166001600160a01b03166354a1b4318c6040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60808110156119c157600080fd5b5080516020808301516040808501516060909501516007548251631381b00560e21b815260048101859052925160009f50959d50929a509498509396508b936001600160a01b0390911692634e06c01492602480840193919291829003018186803b158015611a2f57600080fd5b505afa158015611a43573d6000803e3d6000fd5b505050506040513d6020811015611a5957600080fd5b50519050600081900b611a6b57600198505b8460000b8160000b148015611a885750831580611a8857508a6001145b15611e16578c60011415611b1f576007546040805163c49a8b1960e01b81526004810189905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b158015611ae257600080fd5b505afa158015611af6573d6000803e3d6000fd5b505050506040513d6060811015611b0c57600080fd5b5080516040909101519097509250611ba7565b6007546040805163c49a8b1960e01b81526004810189905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d6060811015611b9557600080fd5b50602081015160409091015190975092505b8615611e16578c60011415611cc7578460000b60011415611c4457600754604080516336f4019360e21b81526004810189905290516001600160a01b039092169163dbd0064c91602480820192606092909190829003018186803b158015611c0e57600080fd5b505afa158015611c22573d6000803e3d6000fd5b505050506040513d6060811015611c3857600080fd5b50602001519150611cc2565b600754604080516336f4019360e21b81526004810189905290516001600160a01b039092169163dbd0064c91602480820192606092909190829003018186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b505050506040513d6060811015611cba57600080fd5b506040015191505b611dd3565b8460000b60011415611d555760075460408051634a4ecebb60e11b81526004810189905290516001600160a01b039092169163949d9d7691602480820192606092909190829003018186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d6060811015611d4957600080fd5b50602001519150611dd3565b60075460408051634a4ecebb60e11b81526004810189905290516001600160a01b039092169163949d9d7691602480820192606092909190829003018186803b158015611da157600080fd5b505afa158015611db5573d6000803e3d6000fd5b505050506040513d6060811015611dcb57600080fd5b506040015191505b611e13611de783606463ffffffff612f4416565b611e0785611dfb8b8d63ffffffff612f4416565b9063ffffffff612f4416565b9063ffffffff612f9d16565b99505b50505050505093509350935093565b600d546001600160a01b031681565b60006208aa8960eb1b6001600160e01b031983161415611e69575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610c96565b6244414960e81b6001600160e01b031983161415611e935750600d546001600160a01b0316610c96565b6040805162461bcd60e51b815260206004820152601b60248201527f436c61696d735265776172643a20756e6b6e6f776e2061737365740000000000604482015290519081900360640190fd5b6001546001600160a01b031681565b600082820183811015611f49576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60075460408051630d3c678b60e21b815233600482015290516000926001600160a01b0316916334f19e2c916024808301926020929190829003018186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6020811015611fc757600080fd5b5051600754604080516304ecffeb60e01b8152336004820152815193945060009384936001600160a01b0316926304ecffeb9260248082019391829003018186803b15801561201557600080fd5b505afa158015612029573d6000803e3d6000fd5b505050506040513d604081101561203f57600080fd5b505190506000808080808080878a5b8b8210801561205c57508c85105b156123cd576007546040805163fc57c9bb60e01b81523360048201526024810185905290516001600160a01b039092169163fc57c9bb91604480820192602092909190829003018186803b1580156120b357600080fd5b505afa1580156120c7573d6000803e3d6000fd5b505050506040513d60208110156120dd57600080fd5b50519a506120ee60018c6000611930565b929a5090985090935050808c14801561210957506001871515145b156121115750805b600754604080516354a1b43160e01b8152600481018e905290516001600160a01b03909216916354a1b43191602480820192608092909190829003018186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d608081101561218757600080fd5b5060208101516060909101519650935082158015906121a4575085155b15612220576007546040805163f27a104760e01b8152600481018e9052600160248201819052915191909701966001600160a01b039092169163f27a104791604480830192600092919082900301818387803b15801561220357600080fd5b505af1158015612217573d6000803e3d6000fd5b505050506123a9565b821580156122a7575060075460408051631381b00560e21b81526004810187905290516001600160a01b0390921691634e06c01491602480820192602092909190829003018186803b15801561227557600080fd5b505afa158015612289573d6000803e3d6000fd5b505050506040513d602081101561229f57600080fd5b505160000b15155b80156122b1575085155b156123a9576007546040805163c49a8b1960e01b81526004810187905290516001600160a01b039092169163c49a8b1991602480820192606092909190829003018186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d606081101561232c57600080fd5b505192508261233c576001909401935b6007546040805163f27a104760e01b8152600481018e90526001602482015290516001600160a01b039092169163f27a10479160448082019260009290919082900301818387803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050505b87156123c2576123bf888a63ffffffff611eef16565b98505b60019091019061204e565b8b8114156124455760075460408051632f9f2f1760e21b81523360048201526024810185905290516001600160a01b039092169163be7cbc5c9160448082019260009290919082900301818387803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b505050506124b1565b60075460408051632f9f2f1760e21b81523360048201526024810184905290516001600160a01b039092169163be7cbc5c9160448082019260009290919082900301818387803b15801561249857600080fd5b505af11580156124ac573d6000803e3d6000fd5b505050505b6007546040805163274d865f60e01b815233600482015290516001600160a01b039092169163274d865f91602480820192602092909190829003018186803b1580156124fc57600080fd5b505afa158015612510573d6000803e3d6000fd5b505050506040513d602081101561252657600080fd5b5051600480546040805163034b044160e21b81529051939f508f94506000936001600160a01b0390921692630d2c1104928282019260209290829003018186803b15801561257357600080fd5b505afa158015612587573d6000803e3d6000fd5b505050506040513d602081101561259d57600080fd5b5051905060006125b3828863ffffffff612f4416565b905060006125c7428463ffffffff611eef16565b6003546040805163023e00b360e21b815233600482015262434c4160e81b602482015290519293506000926001600160a01b03909216916308f802cc91604480820192602092909190829003018186803b15801561262457600080fd5b505afa158015612638573d6000803e3d6000fd5b505050506040513d602081101561264e57600080fd5b50519050818111156126fc578161266b828563ffffffff612fdf16565b101561268457612681818363ffffffff612fdf16565b92505b60035460408051631fea558f60e01b815233600482015262434c4160e81b60248201526044810186905290516001600160a01b0390921691631fea558f9160648082019260009290919082900301818387803b1580156126e357600080fd5b505af11580156126f7573d6000803e3d6000fd5b505050505b5050600754604080516304ecffeb60e01b815233600482015281516001600160a01b0390931694506304ecffeb935060248082019391829003018186803b15801561274657600080fd5b505afa15801561275a573d6000803e3d6000fd5b505050506040513d604081101561277057600080fd5b50602001519950600094508991508b90505b8b8210801561279057508c85105b156129ea5760075460408051637968b71560e11b81523360048201526024810185905290516001600160a01b039092169163f2d16e2a91604480820192602092909190829003018186803b1580156127e757600080fd5b505afa1580156127fb573d6000803e3d6000fd5b505050506040513d602081101561281157600080fd5b50519a5061282160008c81611930565b50919950975050808c14801561283957506001871515145b156128415750805b600754604080516354a1b43160e01b8152600481018e905290516001600160a01b03909216916354a1b43191602480820192608092909190829003018186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60808110156128b757600080fd5b506020810151606090910151965093508515801561294e575060075460408051631381b00560e21b81526004810187905290516001600160a01b0390921691634e06c01491602480820192602092909190829003018186803b15801561291c57600080fd5b505afa158015612930573d6000803e3d6000fd5b505050506040513d602081101561294657600080fd5b505160000b15155b156129c6576007546040805163f27a104760e01b8152600481018e90526001602482015290516001600160a01b039092169163f27a10479160448082019260009290919082900301818387803b1580156129a757600080fd5b505af11580156129bb573d6000803e3d6000fd5b505060019096019550505b87156129df576129dc888a63ffffffff611eef16565b98505b600190910190612782565b8815612a79576002546040805163a9059cbb60e01b8152336004820152602481018c905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612a4457600080fd5b505af1158015612a58573d6000803e3d6000fd5b505050506040513d6020811015612a6e57600080fd5b5051612a7957600080fd5b8b811415612af15760075460408051630f305e9560e21b81523360048201526024810185905290516001600160a01b0390921691633cc17a549160448082019260009290919082900301818387803b158015612ad457600080fd5b505af1158015612ae8573d6000803e3d6000fd5b50505050612b5d565b60075460408051630f305e9560e21b81523360048201526024810184905290516001600160a01b0390921691633cc17a549160448082019260009290919082900301818387803b158015612b4457600080fd5b505af1158015612b58573d6000803e3d6000fd5b505050505b50505050505050505050505050565b600754604080516396ff592f60e01b81526004810184905281516000936001600160a01b0316926396ff592f9260248082019391829003018186803b158015612bb457600080fd5b505afa158015612bc8573d6000803e3d6000fd5b505050506040513d6040811015612bde57600080fd5b506020015160075460408051630325ea3760e01b81526004810186905281519394506000936001600160a01b0390931692630325ea3792602480840193919291829003018186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d6040811015612c5c57600080fd5b5060200151905080612c7857612c73838383613021565b612d95565b60018110158015612c8a575060058111155b15612c9a57612c738383836134e7565b80600c1415612d95576000612cae83613994565b90508015612d275760065460408051637a88deff60e11b815260048101879052600e602482015290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b158015612d0a57600080fd5b505af1158015612d1e573d6000803e3d6000fd5b505050506118a1565b60065460408051637a88deff60e11b815260048101879052600c602482015290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b50505050505b505050565b60055460408051633c2d4daf60e01b81526004810184905290516000926001600160a01b031691633c2d4daf916024808301926020929190829003018186803b158015612de657600080fd5b505afa158015612dfa573d6000803e3d6000fd5b505050506040513d6020811015612e1057600080fd5b5051604080516121a760f11b602080830191909152606084901b6bffffffffffffffffffffffff1916602283015260368083018790528351808403909101815260568301808552815191830191909120600354631729236360e21b9092526001600160a01b03808716605a860152607a850182905294519596509460009490911692635ca48d8c92609a808301939192829003018186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d6020811015612ede57600080fd5b5051905080156118a15760035460408051634063ab0d60e11b81526001600160a01b0386811660048301526024820186905260448201859052915191909216916380c7561a91606480830192600092919082900301818387803b158015612d7b57600080fd5b600082612f5357506000611f4c565b82820282848281612f6057fe5b0414611f495760405162461bcd60e51b81526004018080602001828103825260218152602001806148f86021913960400191505060405180910390fd5b6000611f4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614077565b6000611f4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614119565b6006546040805163778aa67960e11b81526004810186905290516001600160a01b039092169163ef154cf291602480820192602092909190829003018186803b15801561306d57600080fd5b505afa158015613081573d6000803e3d6000fd5b505050506040513d602081101561309757600080fd5b505160000b60011415612d9557600654604080516357af051560e01b815260048101869052600060248201819052915191926001600160a01b0316916357af051591604480820192602092909190829003018186803b1580156130f957600080fd5b505afa15801561310d573d6000803e3d6000fd5b505050506040513d602081101561312357600080fd5b505160075460408051631509d4c960e21b81526004810188905260016024820152815193945060009384938493849384936001600160a01b0390931692635427532492604480840193919291829003018186803b15801561318357600080fd5b505afa158015613197573d6000803e3d6000fd5b505050506040513d60408110156131ad57600080fd5b506020015160075460408051631509d4c960e21b8152600481018d9052600019602482015281519398506001600160a01b03909216926354275324926044808201939291829003018186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d604081101561322f57600080fd5b50602001519350613246858563ffffffff611eef16565b925061325985606463ffffffff612f4416565b945061326c84606463ffffffff612f4416565b93508561327c576003965061345f565b60055460408051631ce48f3d60e01b8152600481018b9052905161330e92670de0b6b3a7640000926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156132d657600080fd5b505afa1580156132ea573d6000803e3d6000fd5b505050506040513d602081101561330057600080fd5b50519063ffffffff612f4416565b905061332181600563ffffffff612f4416565b86111561342b57604661333a868563ffffffff612f9d16565b11156133bd57600554600797506001600160a01b031663ae1c5eca8960015b6040518363ffffffff1660e01b8152600401808381526020018260ff1660ff16815260200192505050600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b5050505060019150613426565b60466133cf858563ffffffff612f9d16565b11156133f257600554600697506001600160a01b031663ae1c5eca896002613359565b613402848463ffffffff612f9d16565b613412868563ffffffff612f9d16565b11156134215760049650613426565b600596505b61345f565b61343b848463ffffffff612f9d16565b61344b868563ffffffff612f9d16565b111561345a576002965061345f565b600396505b60065460408051637a88deff60e11b8152600481018c9052602481018a905290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b1580156134b357600080fd5b505af11580156134c7573d6000803e3d6000fd5b5050505081156134dc576134dc898989614173565b505050505050505050565b6006546040805163778aa67960e11b81526004810186905290516001600160a01b039092169163ef154cf291602480820192602092909190829003018186803b15801561353357600080fd5b505afa158015613547573d6000803e3d6000fd5b505050506040513d602081101561355d57600080fd5b505160000b60011415612d9557600654604080516357af051560e01b815260048101869052600160248201529051600092849284926001600160a01b03909216916357af051591604480820192602092909190829003018186803b1580156135c457600080fd5b505afa1580156135d8573d6000803e3d6000fd5b505050506040513d60208110156135ee57600080fd5b505160055460408051631ce48f3d60e01b815260048101899052905192935060009261365092670de0b6b3a7640000926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156132d657600080fd5b9050600061366582600563ffffffff612f4416565b831015613670575060015b60075460408051635ca1ce8b60e01b8152600481018b90526001602482015281516000936001600160a01b031692635ca1ce8b9260448082019391829003018186803b1580156136bf57600080fd5b505afa1580156136d3573d6000803e3d6000fd5b505050506040513d60408110156136e957600080fd5b506020015160075460408051635ca1ce8b60e01b8152600481018d9052600019602482015281519394506000936001600160a01b0390931692635ca1ce8b92604480840193919291829003018186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d604081101561376f57600080fd5b506020015190506000613788838363ffffffff611eef16565b11156138445760326137b46137a3848463ffffffff611eef16565b611e0785606463ffffffff612f4416565b101580156137c25750600186115b80156137cf575060058611155b80156137d9575082155b156137eb576008975060019650613844565b6032613811613800848463ffffffff611eef16565b611e0784606463ffffffff612f4416565b1015801561381f5750600186115b801561382c575060058611155b8015613836575082155b156138445760099750600296505b82600114801561385e5750856002148061385e5750856004145b1561387057600a9750600196506138a3565b8260011480156138955750856005148061388a5750856003145b806138955750856001145b156138a357600b9750600296505b60065460408051637a88deff60e11b8152600481018d9052602481018b905290516001600160a01b039092169163f511bdfe9160448082019260009290919082900301818387803b1580156138f757600080fd5b505af115801561390b573d6000803e3d6000fd5b50506005546040805163570e2f6560e11b8152600481018e905260ff8c16602482015290516001600160a01b03909216935063ae1c5eca925060448082019260009290919082900301818387803b15801561396557600080fd5b505af1158015613979573d6000803e3d6000fd5b505050506139888a8a8a614173565b50505050505050505050565b60055460408051631ce48f3d60e01b815260048101849052905160009283926001600160a01b0390911691631ce48f3d91602480820192602092909190829003018186803b1580156139e557600080fd5b505afa1580156139f9573d6000803e3d6000fd5b505050506040513d6020811015613a0f57600080fd5b505190506000613a2d82670de0b6b3a764000063ffffffff612f4416565b600554604080516322d5c8bd60e21b81526004810188905290519293506000926001600160a01b0390921691638b5722f491602480820192602092909190829003018186803b158015613a7f57600080fd5b505afa158015613a93573d6000803e3d6000fd5b505050506040513d6020811015613aa957600080fd5b505190506000613ab882611e34565b60055460408051633c2d4daf60e01b8152600481018a905290519293506000926001600160a01b0390921691633c2d4daf91602480820192602092909190829003018186803b158015613b0a57600080fd5b505afa158015613b1e573d6000803e3d6000fd5b505050506040513d6020811015613b3457600080fd5b5051600b5460408051621d624360e71b81526001600160a01b03808516600483015291519394506000939190921691630eb12180916024808301926020929190829003018186803b158015613b8857600080fd5b505afa158015613b9c573d6000803e3d6000fd5b505050506040513d6020811015613bb257600080fd5b5051600854604080516375466b9b60e01b81526001600160a01b0387811660048301528085166024830152604482018a9052915193945060009391909216916375466b9b91606480830192602092919082900301818787803b158015613c1757600080fd5b505af1158015613c2b573d6000803e3d6000fd5b505050506040513d6020811015613c4157600080fd5b5051905080156140685760055460408051638d16a10560e01b8152600481018c905281516000936001600160a01b031692638d16a1059260248082019391829003018186803b158015613c9357600080fd5b505afa158015613ca7573d6000803e3d6000fd5b505050506040513d6040811015613cbd57600080fd5b5060209081015160085460408051630681320d60e51b81526001600160a01b038a811660048301529151939550600094919092169263d02641a0926024808201939291829003018186803b158015613d1457600080fd5b505afa158015613d28573d6000803e3d6000fd5b505050506040513d6020811015613d3e57600080fd5b505190506000613d6082611e078b670de0b6b3a764000063ffffffff612f4416565b600a54604080516368989a5960e01b81526001600160a01b0387811660048301526024820185905291519394509116916368989a599160448082019260009290919082900301818387803b158015613db757600080fd5b505af1158015613dcb573d6000803e3d6000fd5b505050506000600560009054906101000a90046001600160a01b03166001600160a01b0316638d16a1058e6040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015613e2957600080fd5b505afa158015613e3d573d6000803e3d6000fd5b505050506040513d6040811015613e5357600080fd5b5060200151600554604080516360a230e760e01b81526001600160e01b03198d166004820152602481018f905290519293506001600160a01b03909116916360a230e79160448082019260009290919082900301818387803b158015613eb857600080fd5b505af1158015613ecc573d6000803e3d6000fd5b50505050600560009054906101000a90046001600160a01b03166001600160a01b03166381d760ae828b8e6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160e01b0319166001600160e01b03191681526020018281526020019350505050600060405180830381600087803b158015613f6157600080fd5b505af1158015613f75573d6000803e3d6000fd5b5050600c54600854604080516305e09af360e31b815290516001600160a01b039384169550638cd4f0a094509190921691632f04d798916004808301926020929190829003018186803b158015613fcb57600080fd5b505afa158015613fdf573d6000803e3d6000fd5b505050506040513d6020811015613ff557600080fd5b5051604080516001600160e01b031960e085901b16815260048101929092526001602483015251604480830192600092919082900301818387803b15801561403c57600080fd5b505af1158015614050573d6000803e3d6000fd5b5050505060019b505050505050505050505050610c96565b50600098975050505050505050565b600081836141035760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140c85781810151838201526020016140b0565b50505050905090810190601f1680156140f55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161410f57fe5b0495945050505050565b6000818484111561416b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156140c85781810151838201526020016140b0565b505050900390565b6005546040805163ba38de3560e01b81526004810185905290516000926001600160a01b03169163ba38de35916024808301926020929190829003018186803b1580156141bf57600080fd5b505afa1580156141d3573d6000803e3d6000fd5b505050506040513d60208110156141e957600080fd5b505160075460408051635459cad560e11b8152905192935060009261427a92606492611e07926001600160a01b039092169163a8b395aa91600480820192602092909190829003018186803b15801561424157600080fd5b505afa158015614255573d6000803e3d6000fd5b505050506040513d602081101561426b57600080fd5b5051859063ffffffff612f4416565b60075460408051635f39579d60e01b815260048101879052815193945060009384936001600160a01b031692635f39579d9260248082019391829003018186803b1580156142c757600080fd5b505afa1580156142db573d6000803e3d6000fd5b505050506040513d60408110156142f157600080fd5b50805160209091015160075460408051636339392560e11b8152600481018c905260248101859052604481018490526064810188905290519395509193506001600160a01b03169163c672724a9160848082019260009290919082900301818387803b15801561436057600080fd5b505af1158015614374573d6000803e3d6000fd5b5050505060008211806143875750600081115b156143f857600354604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156143df57600080fd5b505af11580156143f3573d6000803e3d6000fd5b505050505b84600614806144075750846009145b80614412575084600b145b156144fb57600754604080516346f4da5760e01b8152600481018a9052600019602482015290516001600160a01b03909216916346f4da579160448082019260009290919082900301818387803b15801561446c57600080fd5b505af1158015614480573d6000803e3d6000fd5b50506003546040805163eb78c07d60e01b8152600481018b905260006024820181905291516001600160a01b03909316945063eb78c07d93506044808201939182900301818387803b1580156144d557600080fd5b505af11580156144e9573d6000803e3d6000fd5b505050506144f686614692565b614689565b846007148061450a5750846008145b80614515575084600a145b1561468957600754604080516346f4da5760e01b8152600481018a90526001602482015290516001600160a01b03909216916346f4da579160448082019260009290919082900301818387803b15801561456e57600080fd5b505af1158015614582573d6000803e3d6000fd5b50506003546040805163eb78c07d60e01b8152600481018b90526001602482015290516001600160a01b03909216935063eb78c07d925060448082019260009290919082900301818387803b1580156145da57600080fd5b505af11580156145ee573d6000803e3d6000fd5b505050506145fb86612d9a565b600061460687613994565b905060008161461657600c614619565b600e5b60065460408051637a88deff60e11b8152600481018d905260ff939093166024840181905290519093506001600160a01b039091169163f511bdfe91604480830192600092919082900301818387803b15801561467557600080fd5b505af1158015612b5d573d6000803e3d6000fd5b50505050505050565b60055460408051633c2d4daf60e01b81526004810184905290516000926001600160a01b031691633c2d4daf916024808301926020929190829003018186803b1580156146de57600080fd5b505afa1580156146f2573d6000803e3d6000fd5b505050506040513d602081101561470857600080fd5b5051604080516121a760f11b602080830191909152606084901b6bffffffffffffffffffffffff1916602283015260368083018790528351808403909101815260568301808552815191830191909120600354631729236360e21b9092526001600160a01b03808716605a860152607a850182905294519596509460009490911692635ca48d8c92609a808301939192829003018186803b1580156147ac57600080fd5b505afa1580156147c0573d6000803e3d6000fd5b505050506040513d60208110156147d657600080fd5b50516004805460408051630ee0985160e11b815292830188905280519394506000936001600160a01b0390921692631dc130a29260248083019392829003018186803b15801561482557600080fd5b505afa158015614839573d6000803e3d6000fd5b505050506040513d604081101561484f57600080fd5b5051905061486481600263ffffffff612f9d16565b905060008183106148755781614877565b825b905080156148ef5760035460408051637aef5b7360e01b81526001600160a01b038881166004830152602482018890526044820186905291519190921691637aef5b7391606480830192600092919082900301818387803b1580156148db57600080fd5b505af1158015613988573d6000803e3d6000fd5b50505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436c61696d735265776172643a205061796f75742072657472792074696d65206e6f7420726561636865642ea265627a7a7231582091fb8fce9f2ffd0bc90ab452f14433796205adc8947e0d65c877bd53ec28a5ce64736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

-----Decoded View---------------
Arg [0] : masterAddress (address): 0x01BFd82675DBCc7762C84019cA518e701C0cD07e
Arg [1] : _daiAddress (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.