Sponsored Link:   FTEC - Artificial Intelligence trading revolution! Ready project! Softcap reached! Apply for whitelist!
Contract Overview | XJPCoin
Balance: 0 Ether
Ether Value: $0
Transactions: 85 txns
Token Contract: XJP 0.6.0 (XJP)
 Latest 25 txns from a total Of 85 transactions
View All

TxHash Age From To Value [TxFee]
0x2b6fbce5b1b375840e44df303c73adc303699ce92e0f9dd3227d5b96630a5b235 days 10 hrs ago0xe5937586a5c1d750b3bbe9a4d466a42ad17daa6f  IN   XJPCoin0 Ether0.000938736
0x87a0133da861b6e751f0fec155bdce765f7cf0cfabefb299d100f5c878a9a56d7 days 18 hrs ago0x47a682209e18177b56e7a688fcf81f6b2a8473da  IN   XJPCoin0 Ether0.001051302
0x30580697a256ea25d08c6b749dce4a706e343a24ecff1c3a27c5f04f74c5ff237 days 18 hrs ago0x0deba63551fe8a8f6137e21c1439b3aa9913ff00  IN   XJPCoin0 Ether0.0003777308
0xf2d596df31b6ad0871647df88cf0d51b6f685de3ad0754f21e54ef843ef824fd7 days 18 hrs ago0x47a682209e18177b56e7a688fcf81f6b2a8473da  IN   XJPCoin0 Ether0.000736302
0x7e7fd0ab2a34c58aad145352a2e11908c0e3837730dc8cf7b78ca6ae43da71e97 days 18 hrs ago0x0deba63551fe8a8f6137e21c1439b3aa9913ff00  IN   XJPCoin0 Ether0.00130252
0x381bfb05fcae5f170fb1ccaf201caf6515ef030609d7a8f48690db2b52e525887 days 19 hrs ago0xdd1bf60a430bdba445b3d21e5e4be7c22d1ef917  IN   XJPCoin0 Ether0.000390756
0xde45ac69c73ca7fddfbe13a32eb119d32f151c3a1771c98a8a6c9397364215b77 days 19 hrs ago0x007d491ae92fd2cbaa456c85711dfb73ec895fb3  IN   XJPCoin0 Ether0.002253594
0x68d6e8bdb03e01288790371b77c840ae053f2056139a81d1cc58886d4f0fb9eb7 days 19 hrs ago0x007d491ae92fd2cbaa456c85711dfb73ec895fb3  IN   XJPCoin0 Ether0.00028
0x34dfa35f6b6da605927c38d423129ed964a6738fbe4ff066e625b7bc76939e9c11 days 19 hrs ago0xaec57cf6c2f8806237427d15d2aefc25a5a4c8fe  IN   XJPCoin0 Ether0.0003733
0x074a24a5d1ae5741a5f49638295edc3035b66dd5dfc3610b15bd49d1075a98f441 days 20 hrs ago0xdd1bf60a430bdba445b3d21e5e4be7c22d1ef917  IN   XJPCoin0 Ether0.0008966
0x0d8a369c25a42cedd50bd8c080855d2cab2b3174e10f7cbe4356a03f3cb83738148 days 21 hrs ago0xa65e9fec4f892ef6e9fe3888ed9b0eb6aab1f0fd  IN   XJPCoin0 Ether0.0026131
0x5a2f152dea8443a02f5762926debb7b4ba36539775a054b24e68ee955e0539ab163 days 9 hrs ago0x5ce7cc48ac46b5fc49efd21bdbb1295ea49d751e  IN   XJPCoin0 Ether0.00554838
0x86cd7c7286857c57feaff538d0a2bc1462a7199ce90e3bd9ba3ff8685a26ff56163 days 9 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0029864
0xf90b52cf5fb469ea1a5c4d6e2ed393d06bc2dc506736afe70f5d3b01a9cfbd1d163 days 9 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0024
0x947d172103a5f62e620c2a97b4c2ca9b6caed6223cfd0bdf100548a400ba5efd163 days 9 hrs ago0x5ce7cc48ac46b5fc49efd21bdbb1295ea49d751e  IN   XJPCoin0 Ether0.00519042
0x526d449404d763e8a9469a7f965d9f4b09190f4f164f366e95c3ae197e4249fb163 days 9 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00564858
0xf1da410e8930e004b141a8af9e4c0b7348e0cc1f9184a055b99921b73f26cd9b163 days 12 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xdd80c7440a6005b1c3847e224270c1ab807c3118386fc9340939b63de1ffdebf163 days 12 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xffaa69bbdc4f041b9be9340c3b2c5f380736690401ac68fd214e9df26c660283163 days 12 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00378
0xe2c7b5599cc377f37ef80bd29de935b014faf9a647002f9c5eae673ad85d3077163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005999999877
0xd956337107c02c1098b1917a64d3e59ac6e49e81f2d3aee9a1e9fb4b6b85d013163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005291462492
0x8ad82e6ef16626fe59b18dd0c1fa261affb51285c11dce9c0ac128e5bb14cff8163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.0036
0x2f863e595d0f4e234aee41b4e2c60d36d56383a08fdb516503e35b14bd81fc8f163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.005456238673
0xb11a709144f50851c40326371fb5650f51b5fc78e6121078decdd268a10bf83d163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.004105074278
0xd0bdbbff4dfa1aad16a3f165f85d16134ab7176227218581d1d143b4ff7346b9163 days 15 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00342
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity), DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity) Solidity compiler bugs.

Contract Source Code Verified (Exact match)
Contract Name: IkuraController
Compiler Version: v0.4.11+commit.68ef5810
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) constant returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        assert(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }

    function assert(bool x) internal {
        if (!x) throw;
    }
}





contract ERC20 {
    function totalSupply() constant returns (uint supply);
    function balanceOf( address who ) constant returns (uint value);
    function allowance( address owner, address spender ) constant returns (uint _allowance);

    function transfer( address to, uint value) returns (bool ok);
    function transferFrom( address from, address to, uint value) returns (bool ok);
    function approve( address spender, uint value ) returns (bool ok);

    event Transfer( address indexed from, address indexed to, uint value);
    event Approval( address indexed owner, address indexed spender, uint value);
}

contract DSMath {
    

    function add(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function div(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x / y;
    }

    function min(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x <= y ? x : y;
    }
    function max(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x >= y ? x : y;
    }



    function hadd(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x + y) >= x);
    }

    function hsub(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x - y) <= x);
    }

    function hmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function hdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x / y;
    }

    function hmin(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x <= y ? x : y;
    }
    function hmax(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x >= y ? x : y;
    }



    function imin(int256 x, int256 y) constant internal returns (int256 z) {
        return x <= y ? x : y;
    }
    function imax(int256 x, int256 y) constant internal returns (int256 z) {
        return x >= y ? x : y;
    }

    /*
    WAD math
     */

    uint128 constant WAD = 10 ** 18;

    function wadd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function wsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function wmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + WAD / 2) / WAD);
    }

    function wdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * WAD + y / 2) / y);
    }

    function wmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function wmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    /*
    RAY math
     */

    uint128 constant RAY = 10 ** 27;

    function radd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function rsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function rmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + RAY / 2) / RAY);
    }

    function rdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * RAY + y / 2) / y);
    }

    function rpow(uint128 x, uint64 n) constant internal returns (uint128 z) {
        
        
        
        
        
        
        
        
        
        
        
        
        
        

        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }

    function rmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function rmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    function cast(uint256 x) constant internal returns (uint128 z) {
        assert((z = uint128(x)) == x);
    }

}

contract IkuraStorage is DSMath, DSAuth {
  
  address[] ownerAddresses;

  
  mapping(address => uint) coinBalances;

  
  mapping(address => uint) tokenBalances;

  
  mapping(address => mapping (address => uint)) coinAllowances;

  
  uint _totalSupply = 0;

  
  
  
  uint _transferFeeRate = 500;

  
  
  
  uint8 _transferMinimumFee = 5;

  address tokenAddress;
  address multiSigAddress;
  address authorityAddress;

  
  
  
  function IkuraStorage() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function changeToken(address tokenAddress_) auth {
    tokenAddress = tokenAddress_;
  }

  function changeAssociation(address multiSigAddress_) auth {
    multiSigAddress = multiSigAddress_;
  }

  function changeAuthority(address authorityAddress_) auth {
    authorityAddress = authorityAddress_;
  }

  function totalSupply() auth returns (uint) {
    return _totalSupply;
  }
  function addTotalSupply(uint amount) auth {
    _totalSupply = add(_totalSupply, amount);
  }
  function subTotalSupply(uint amount) auth {
    _totalSupply = sub(_totalSupply, amount);
  }
  function transferFeeRate() auth returns (uint) {
    return _transferFeeRate;
  }

  function setTransferFeeRate(uint newTransferFeeRate) auth returns (bool) {
    _transferFeeRate = newTransferFeeRate;

    return true;
  }

  
  
  

  function transferMinimumFee() auth returns (uint8) {
    return _transferMinimumFee;
  }

  function setTransferMinimumFee(uint8 newTransferMinimumFee) auth {
    _transferMinimumFee = newTransferMinimumFee;
  }

  function addOwnerAddress(address addr) internal returns (bool) {
    ownerAddresses.push(addr);

    return true;
  }

  function removeOwnerAddress(address addr) internal returns (bool) {
    uint i = 0;

    while (ownerAddresses[i] != addr) { i++; }

    while (i < ownerAddresses.length - 1) {
      ownerAddresses[i] = ownerAddresses[i + 1];
      i++;
    }

    ownerAddresses.length--;

    return true;
  }

  function primaryOwner() auth returns (address) {
    return ownerAddresses[0];
  }

  function isOwnerAddress(address addr) auth returns (bool) {
    for (uint i = 0; i < ownerAddresses.length; i++) {
      if (ownerAddresses[i] == addr) return true;
    }

    return false;
  }

  function numOwnerAddress() auth constant returns (uint) {
    return ownerAddresses.length;
  }

  
  
  

  function coinBalance(address addr) auth returns (uint) {
    return coinBalances[addr];
  }

  function addCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = add(coinBalances[addr], amount);

    return true;
  }

  function subCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = sub(coinBalances[addr], amount);

    return true;
  }

  
  
  

  function tokenBalance(address addr) auth returns (uint) {
    return tokenBalances[addr];
  }

  function addTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = add(tokenBalances[addr], amount);

    if (tokenBalances[addr] > 0 && !isOwnerAddress(addr)) {
      addOwnerAddress(addr);
    }

    return true;
  }

  function subTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = sub(tokenBalances[addr], amount);

    if (tokenBalances[addr] <= 0) {
      removeOwnerAddress(addr);
    }

    return true;
  }

  
  
  

  function coinAllowance(address owner_, address spender) auth returns (uint) {
    return coinAllowances[owner_][spender];
  }

  function addCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = add(coinAllowances[owner_][spender], amount);

    return true;
  }

  function subCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = sub(coinAllowances[owner_][spender], amount);

    return true;
  }

  function setCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = amount;

    return true;
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == tokenAddress ||
            src == authorityAddress ||
            src == multiSigAddress;
  }
}

contract IkuraTokenEvent {
  /** オーナーがdJPYを鋳造した際に発火するイベント */
  event IkuraMint(address indexed owner, uint);

  /** オーナーがdJPYを消却した際に発火するイベント */
  event IkuraBurn(address indexed owner, uint);

  /** トークンの移動時に発火するイベント */
  event IkuraTransferToken(address indexed from, address indexed to, uint value);

  /** 手数料が発生したときに発火するイベント */
  event IkuraTransferFee(address indexed from, address indexed to, address indexed owner, uint value);

  event IkuraTransfer(address indexed from, address indexed to, uint value);

  /** 送金許可イベント */
  event IkuraApproval(address indexed owner, address indexed spender, uint value);
}

contract IkuraAssociation is DSMath, DSAuth {
  
  
  

  
  uint public confirmTotalTokenThreshold = 50;

  
  
  

  
  IkuraStorage _storage;
  IkuraToken _token;

  
  Proposal[] mintProposals;
  Proposal[] burnProposals;
  Proposal[] transferMinimumFeeProposals;
  Proposal[] transferFeeRateProposals;

  mapping (bytes32 => Proposal[]) proposals;

  struct Proposal {
    address proposer;                     
    bytes32 digest;                       
    bool executed;                        
    uint createdAt;                       
    uint expireAt;                        
    address[] confirmers;                 
    uint amount;                          
    uint8 transferMinimumFee;             
    uint transferFeeRate;                 
  }

  
  
  

  event MintProposalAdded(uint proposalId, address proposer, uint amount);
  event MintConfirmed(uint proposalId, address confirmer, uint amount);
  event MintExecuted(uint proposalId, address proposer, uint amount);

  event BurnProposalAdded(uint proposalId, address proposer, uint amount);
  event BurnConfirmed(uint proposalId, address confirmer, uint amount);
  event BurnExecuted(uint proposalId, address proposer, uint amount);

  event TransferMinimumFeeProposalAdded(uint proposalId, address proposer, uint8 transferMinimumFee);
  event TransferMinimumFeeConfirmed(uint proposalId, address confirmer, uint8 transferMinimumFee);
  event TransferMinimumFeeExecuted(uint proposalId, address proposer, uint8 transferMinimumFee);

  event TransferFeeRateProposalAdded(uint proposalId, address proposer, uint transferFeeRate);
  event TransferFeeRateConfirmed(uint proposalId, address confirmer, uint transferFeeRate);
  event TransferFeeRateExecuted(uint proposalId, address proposer, uint transferFeeRate);

  function IkuraAssociation() {
    proposals[sha3('mint')] = mintProposals;
    proposals[sha3('burn')] = burnProposals;
    proposals[sha3('transferMinimumFee')] = transferMinimumFeeProposals;
    proposals[sha3('transferFeeRate')] = transferFeeRateProposals;

  }

  function changeStorage(IkuraStorage newStorage) auth returns (bool) {
    _storage = newStorage;

    return true;
  }

  function changeToken(IkuraToken token_) auth returns (bool) {
    _token = token_;

    return true;
  }

  function newProposal(bytes32 type_, address proposer, uint amount, uint8 transferMinimumFee, uint transferFeeRate, bytes transationBytecode) returns (uint) {
    uint proposalId = proposals[type_].length++;
    Proposal proposal = proposals[type_][proposalId];
    proposal.proposer = proposer;
    proposal.amount = amount;
    proposal.transferMinimumFee = transferMinimumFee;
    proposal.transferFeeRate = transferFeeRate;
    proposal.digest = sha3(proposer, amount, transationBytecode);
    proposal.executed = false;
    proposal.createdAt = now;
    proposal.expireAt = proposal.createdAt + 86400;

    
    
    if (type_ == sha3('mint')) MintProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('burn')) BurnProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeProposalAdded(proposalId, proposer, transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateProposalAdded(proposalId, proposer, transferFeeRate);

    
    confirmProposal(type_, proposer, proposalId);

    return proposalId;
  }

  function confirmProposal(bytes32 type_, address confirmer, uint proposalId) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (hasConfirmed(type_, confirmer, proposalId)) throw;

    
    proposal.confirmers.push(confirmer);

    
    
    if (type_ == sha3('mint')) MintConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('burn')) BurnConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeConfirmed(proposalId, confirmer, proposal.transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateConfirmed(proposalId, confirmer, proposal.transferFeeRate);

    if (isProposalExecutable(type_, proposalId, proposal.proposer, '')) {
      proposal.executed = true;

      
      
      if (type_ == sha3('mint')) executeMintProposal(proposalId);
      if (type_ == sha3('burn')) executeBurnProposal(proposalId);
      if (type_ == sha3('transferMinimumFee')) executeUpdateTransferMinimumFeeProposal(proposalId);
      if (type_ == sha3('transferFeeRate')) executeUpdateTransferFeeRateProposal(proposalId);
    }
  }

  function hasConfirmed(bytes32 type_, address addr, uint proposalId) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;

    for (uint i = 0; i < length; i++) {
      if (proposal.confirmers[i] == addr) return true;
    }

    return false;
  }

  function confirmedTotalToken(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;
    uint total = 0;

    for (uint i = 0; i < length; i++) {
      total = add(total, _storage.tokenBalance(proposal.confirmers[i]));
    }

    return total;
  }

  function proposalExpireAt(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    return proposal.expireAt;
  }

  function isProposalExecutable(bytes32 type_, uint proposalId, address proposer, bytes transactionBytecode) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (_storage.numOwnerAddress() < 2) {
      return true;
    }

    return  proposal.digest == sha3(proposer, proposal.amount, transactionBytecode) &&
            isProposalNotExpired(type_, proposalId) &&
            div(mul(100, confirmedTotalToken(type_, proposalId)), _storage.totalSupply()) > confirmTotalTokenThreshold;
  }

  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return proposals[type_].length;
  }

  function numberOfActiveProposals(bytes32 type_) constant returns (uint) {
    uint numActiveProposal = 0;

    for(uint i = 0; i < proposals[type_].length; i++) {
      Proposal proposal = proposals[type_][i];

      if (isProposalNotExpired(type_, i)) {
        numActiveProposal++;
      }
    }

    return numActiveProposal;
  }

  function isProposalNotExpired(bytes32 type_, uint proposalId) internal returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    return  !proposal.executed &&
            now < proposal.expireAt;
  }

  function executeMintProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('mint')][proposalId];

    
    if (proposal.amount <= 0) throw;

    MintExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.addTotalSupply(proposal.amount);
    _storage.addCoinBalance(proposal.proposer, proposal.amount);
    _storage.addTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeBurnProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('burn')][proposalId];

    
    if (proposal.amount <= 0) throw;
    if (_storage.coinBalance(proposal.proposer) < proposal.amount) throw;
    if (_storage.tokenBalance(proposal.proposer) < proposal.amount) throw;

    BurnExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.subTotalSupply(proposal.amount);
    _storage.subCoinBalance(proposal.proposer, proposal.amount);
    _storage.subTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeUpdateTransferMinimumFeeProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferMinimumFee')][proposalId];

    if (proposal.transferMinimumFee < 0) throw;

    TransferMinimumFeeExecuted(proposalId, proposal.proposer, proposal.transferMinimumFee);

    _storage.setTransferMinimumFee(proposal.transferMinimumFee);
  }

  function executeUpdateTransferFeeRateProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferFeeRate')][proposalId];

    if (proposal.transferFeeRate < 0) throw;

    TransferFeeRateExecuted(proposalId, proposal.proposer, proposal.transferFeeRate);

    _storage.setTransferFeeRate(proposal.transferFeeRate);
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == address(_token);
  }
}
library ProposalLibrary {
  
  
  

  
  struct Entity {
    IkuraStorage _storage;
    IkuraAssociation _association;
  }

  function changeStorage(Entity storage self, address storage_) internal {
    self._storage = IkuraStorage(storage_);
  }

  function changeAssociation(Entity storage self, address association_) internal {
    self._association = IkuraAssociation(association_);
  }

  function updateTransferMinimumFee(Entity storage self, address sender, uint8 fee) returns (bool) {
    if (fee < 0) throw;

    self._association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');

    return true;
  }

  function updateTransferFeeRate(Entity storage self, address sender, uint rate) returns (bool) {
    if (rate < 0) throw;

    self._association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');

    return true;
  }

  function mint(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;

    self._association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    return true;
  }

  function burn(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;
    if (self._storage.coinBalance(sender) < amount) throw;
    if (self._storage.tokenBalance(sender) < amount) throw;

    self._association.newProposal(sha3('burn'), sender, amount, 0, 0, '');

    return true;
  }

  function confirmProposal(Entity storage self, address sender, bytes32 type_, uint proposalId) {
    self._association.confirmProposal(type_, sender, proposalId);
  }

  function numberOfProposals(Entity storage self, bytes32 type_) constant returns (uint) {
    return self._association.numberOfProposals(type_);
  }
}

contract IkuraToken is IkuraTokenEvent, DSMath, DSAuth {
  
  
  

  /*using ProposalLibrary for ProposalLibrary.Entity;
  ProposalLibrary.Entity proposalEntity;*/

  
  
  

  
  IkuraStorage _storage;
  IkuraAssociation _association;

  function IkuraToken() DSAuth() {
    
    
    
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function totalSupply(address sender) auth constant returns (uint) {
    sender; 

    return _storage.totalSupply();
  }

  function balanceOf(address sender, address addr) auth constant returns (uint) {
    sender; 

    return _storage.coinBalance(addr);
  }

  function transfer(address sender, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, sender, to, amount);

    if (_storage.coinBalance(sender) < add(amount, fee)) throw;
    if (amount <= 0) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, add(amount, fee));

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(sender, to, amount);
    IkuraTransferFee(sender, to, owner, fee);

    return true;
  }

  function transferFrom(address sender, address from, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, from, to, amount);

    if (_storage.coinBalance(from) < amount) throw;
    if (_storage.coinAllowance(from, sender) < amount) throw;
    if (amount <= 0) throw;
    if (add(_storage.coinBalance(to), amount) <= _storage.coinBalance(to)) throw;
    if (_storage.coinBalance(sender) < fee) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, fee);

    
    _storage.subCoinBalance(from, amount);

    
    _storage.subCoinAllowance(from, sender, amount);

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(from, to, amount);

    return true;
  }

  function approve(address sender, address spender, uint amount) auth returns (bool success) {
    _storage.setCoinAllowance(sender, spender, amount);

    
    IkuraApproval(sender, spender, amount);

    return true;
  }


  function allowance(address sender, address owner, address spender) auth constant returns (uint remaining) {
    sender; 

    return _storage.coinAllowance(owner, spender);
  }

  
  
  


  function tokenBalanceOf(address sender, address owner) auth constant returns (uint balance) {
    sender; 

    return _storage.tokenBalance(owner);
  }


  function transferToken(address sender, address to, uint amount) auth returns (bool success) {
    if (_storage.tokenBalance(sender) < amount ) throw;
    if (amount <= 0) throw;
    if (add(_storage.tokenBalance(to), amount) <= _storage.tokenBalance(to)) throw;

    _storage.subTokenBalance(sender, amount);
    _storage.addTokenBalance(to, amount);

    IkuraTransferToken(sender, to, amount);

    return true;
  }


  function transferFeeRate(address sender) auth constant returns (uint) {
    sender; 

    return _storage.transferFeeRate();
  }


  function transferMinimumFee(address sender) auth constant returns (uint8) {
    sender; 

    return _storage.transferMinimumFee();
  }


  function transferFee(address sender, address from, address to, uint amount) auth returns (uint) {
    from; to; 

    uint rate = transferFeeRate(sender);
    uint denominator = 1000000; 
    uint numerator = mul(amount, rate);

    uint fee = div(numerator, denominator);
    uint remainder = sub(numerator, mul(denominator, fee));

    
    if (remainder > 0) {
      fee++;
    }

    if (fee < transferMinimumFee(sender)) {
      fee = transferMinimumFee(sender);
    }

    return fee;
  }


  function updateTransferMinimumFee(address sender, uint8 fee) auth returns (bool) {
    if (fee < 0) throw;

    _association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');
    return true;

    /*return proposalEntity.updateTransferMinimumFee(sender, fee);*/
  }


  function updateTransferFeeRate(address sender, uint rate) auth returns (bool) {
    if (rate < 0) throw;

    _association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');
    return true;

    /*return proposalEntity.updateTransferFeeRate(sender, rate);*/
  }


  function selectOwnerAddressForTransactionFee(address sender) auth returns (address) {
    sender; 

    return _storage.primaryOwner();
  }

  function mint(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;

    _association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    /*return proposalEntity.mint(sender, amount);*/
  }


  function burn(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;
    if (_storage.coinBalance(sender) < amount) throw;
    if (_storage.tokenBalance(sender) < amount) throw;

    _association.newProposal(sha3('burn'), sender, amount, 0, 0, '');
    /*return proposalEntity.burn(sender, amount);*/
  }

  function confirmProposal(address sender, bytes32 type_, uint proposalId) auth {
    _association.confirmProposal(type_, sender, proposalId);
    /*proposalEntity.confirmProposal(sender, type_, proposalId);*/
  }


  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return _association.numberOfProposals(type_);
    /*return proposalEntity.numberOfProposals(type_);*/
  }


  function changeAssociation(address association_) auth returns (bool) {
    _association = IkuraAssociation(association_);
    /*proposalEntity.changeAssociation(_association);*/

    return true;
  }


  function changeStorage(address storage_) auth returns (bool) {
    _storage = IkuraStorage(storage_);
    /*proposalEntity.changeStorage(_storage);*/

    return true;
  }


  function logicVersion(address sender) auth constant returns (uint) {
    sender; 

    return 1;
  }
}


contract IkuraAuthority is DSAuthority, DSAuth {
  
  IkuraStorage tokenStorage;

  
  
  mapping(bytes4 => bool) actionsWithToken;

  
  mapping(bytes4 => bool) actionsForbidden;

  
  
  
  function IkuraAuthority() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }


  function changeStorage(address storage_) auth {
    tokenStorage = IkuraStorage(storage_);

    
    actionsWithToken[stringToSig('mint(uint256)')] = true;
    actionsWithToken[stringToSig('burn(uint256)')] = true;
    actionsWithToken[stringToSig('updateTransferMinimumFee(uint8)')] = true;
    actionsWithToken[stringToSig('updateTransferFeeRate(uint256)')] = true;
    actionsWithToken[stringToSig('confirmProposal(string, uint256)')] = true;
    actionsWithToken[stringToSig('numberOfProposals(string)')] = true;

    
    actionsForbidden[stringToSig('forbiddenAction()')] = true;
  }

  function canCall(address src, address dst, bytes4 sig) constant returns (bool) {
    
    if (actionsWithToken[sig]) return canCallWithAssociation(src, dst);

    
    if (actionsForbidden[sig]) return canCallWithNoOne();

    
    return canCallDefault(src);
  }

  function canCallDefault(address src) internal constant returns (bool) {
    return tokenStorage.isOwnerAddress(src);
  }


  function canCallWithAssociation(address src, address dst) internal returns (bool) {
    
    dst;

    return tokenStorage.isOwnerAddress(src) &&
           (tokenStorage.numOwnerAddress() == 1 || tokenStorage.tokenBalance(src) > 0);
  }


  function canCallWithNoOne() internal constant returns (bool) {
    return false;
  }


  function stringToSig(string str) internal constant returns (bytes4) {
    return bytes4(sha3(str));
  }
}


contract IkuraController is ERC20, DSAuth {
  
  
  

  
  string public name = "XJP 0.6.0";

  
  string public constant symbol = "XJP";

  
  uint8 public constant decimals = 0;

  
  
  

  
  
  IkuraToken private token;

  
  IkuraStorage private tokenStorage;

  
  IkuraAuthority private authority;

  
  IkuraAssociation private association;

  
  
  

  function totalSupply() constant returns (uint) {
    return token.totalSupply(msg.sender);
  }

  function balanceOf(address addr) constant returns (uint) {
    return token.balanceOf(msg.sender, addr);
  }

  function transfer(address to, uint amount) returns (bool) {
    if (token.transfer(msg.sender, to, amount)) {
      Transfer(msg.sender, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function transferFrom(address from, address to, uint amount) returns (bool) {
    if (token.transferFrom(msg.sender, from, to, amount)) {
      Transfer(from, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function approve(address spender, uint amount) returns (bool) {
    if (token.approve(msg.sender, spender, amount)) {
      Approval(msg.sender, spender, amount);

      return true;
    } else {
      return false;
    }
  }

  function allowance(address addr, address spender) constant returns (uint) {
    return token.allowance(msg.sender, addr, spender);
  }

  
  
  

  function tokenBalanceOf(address addr) constant returns (uint) {
    return token.tokenBalanceOf(msg.sender, addr);
  }

  function transferToken(address to, uint amount) returns (bool) {
    return token.transferToken(msg.sender, to, amount);
  }

  function transferFeeRate() constant returns (uint) {
    return token.transferFeeRate(msg.sender);
  }

  function transferMinimumFee() constant returns (uint8) {
    return token.transferMinimumFee(msg.sender);
  }

  function transferFee(address from, address to, uint amount) returns (uint) {
    return token.transferFee(msg.sender, from, to, amount);
  }

  

  function updateTransferMinimumFee(uint8 minimumFee) auth returns (bool) {
    return token.updateTransferMinimumFee(msg.sender, minimumFee);
  }

  function updateTransferFeeRate(uint feeRate) auth returns (bool) {
    return token.updateTransferFeeRate(msg.sender, feeRate);
  }

  function mint(uint amount) auth returns (bool) {
    return token.mint(msg.sender, amount);
  }

  function burn(uint amount) auth returns (bool) {
    return token.burn(msg.sender, amount);
  }

  function isOwner(address addr) auth returns (bool) {
    return tokenStorage.isOwnerAddress(addr);
  }


  function confirmProposal(string type_, uint proposalId) auth {
    token.confirmProposal(msg.sender, sha3(type_), proposalId);
  }

  function numOwnerAddress() auth constant returns (uint) {
    return tokenStorage.numOwnerAddress();
  }


  function numberOfProposals(string type_) auth constant returns (uint) {
    return token.numberOfProposals(sha3(type_));
  }

  
  
  


  function setup(address storageAddress, address tokenAddress, address authorityAddress, address associationAddress) auth {
    changeStorage(storageAddress);
    changeToken(tokenAddress);
    changeAuthority(authorityAddress);
    changeAssociation(associationAddress);
  }


  function changeToken(address tokenAddress) auth {
    
    token = IkuraToken(tokenAddress);

    
    tokenStorage.changeToken(token);
    token.changeStorage(tokenStorage);

    
    if (association != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }

  function changeStorage(address storageAddress) auth {
    
    tokenStorage = IkuraStorage(storageAddress);
  }


  function changeAuthority(address authorityAddress) auth {
    
    authority = IkuraAuthority(authorityAddress);
    setAuthority(authority);

    
    authority.changeStorage(tokenStorage);
    tokenStorage.changeAuthority(authority);
  }

  function changeAssociation(address associationAddress) auth {
    
    association = IkuraAssociation(associationAddress);

    
    association.changeStorage(tokenStorage);
    tokenStorage.changeAssociation(association);

    
    if (token != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }


  function forbiddenAction() auth returns (bool) {
    return true;
  }

 
  function logicVersion() constant returns (uint) {
    return token.logicVersion(msg.sender);
  }


  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    return  src == address(this) ||
            src == owner ||
            authority.canCall(src, this, sig);
  }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferToken","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authorityAddress","type":"address"}],"name":"changeAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"logicVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"type_","type":"string"},{"name":"proposalId","type":"uint256"}],"name":"confirmProposal","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"feeRate","type":"uint256"}],"name":"updateTransferFeeRate","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"},{"name":"tokenAddress","type":"address"},{"name":"authorityAddress","type":"address"},{"name":"associationAddress","type":"address"}],"name":"setup","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"changeToken","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numOwnerAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferMinimumFee","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"forbiddenAction","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"associationAddress","type":"address"}],"name":"changeAssociation","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"}],"name":"changeStorage","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"minimumFee","type":"uint8"}],"name":"updateTransferMinimumFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"type_","type":"string"}],"name":"numberOfProposals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"tokenBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052604060405190810160405280600981526020017f584a5020302e362e3000000000000000000000000000000000000000000000008152506002908051906020019062000052929190620000e2565b505b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b62000191565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012557805160ff191683800117855562000156565b8280016001018555821562000156579182015b828111156200015557825182559160200191906001019062000138565b5b50905062000165919062000169565b5090565b6200018e91905b808211156200018a57600081600090555060010162000170565b5090565b90565b61356680620001a16000396000f3006060604052361561019f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146101a1578063095ea7b31461023a5780631072cbea14610291578063116877cc146102e857806313af40351461031e57806318160ddd146103545780631946fdf41461037a57806323b872dd146103a05780632f54bf6e14610416578063313ce56714610464578063351bf5181461049057806342966c68146104b65780634fad404a146104ee578063548d4a541461055157806354c35a3c1461058957806359d5d02a1461061c57806366829b161461068e57806370a08231146106c45780637a9e5e4b1461070e5780637aa306a21461074457806388bf60b71461076a5780638da5cb5b1461079657806395d89b41146107e8578063a0712d6814610881578063a9059cbb146108b9578063b3350f0314610910578063bf29b90a1461093a578063bf7e214f14610970578063c50c97d0146109c2578063dd62ed3e146109f8578063df49dfe314610a61578063e35f025414610a9c578063e42c08f214610b0a575bfe5b34156101a957fe5b6101b1610b54565b6040518080602001828103825283818151815260200191508051906020019080838360008314610200575b805182526020831115610200576020820191506020810190506020830392506101dc565b505050905090810190601f16801561022c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561024257fe5b610277600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bf2565b604051808215151515815260200191505060405180910390f35b341561029957fe5b6102ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d8d565b604051808215151515815260200191505060405180910390f35b34156102f057fe5b61031c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b005b341561032657fe5b610352600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112d565b005b341561035c57fe5b610364611211565b6040518082815260200191505060405180910390f35b341561038257fe5b61038a6112f3565b6040518082815260200191505060405180910390f35b34156103a857fe5b6103fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113d5565b604051808215151515815260200191505060405180910390f35b341561041e57fe5b61044a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115a5565b604051808215151515815260200191505060405180910390f35b341561046c57fe5b6104746116c0565b604051808260ff1660ff16815260200191505060405180910390f35b341561049857fe5b6104a06116c5565b6040518082815260200191505060405180910390f35b34156104be57fe5b6104d460048080359060200190919050506117a7565b604051808215151515815260200191505060405180910390f35b34156104f657fe5b61054f600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080359060200190919050506118ca565b005b341561055957fe5b61056f6004808035906020019091905050611a48565b604051808215151515815260200191505060405180910390f35b341561059157fe5b61061a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b6b565b005b341561062457fe5b610678600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611bcd565b6040518082815260200191505060405180910390f35b341561069657fe5b6106c2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d23565b005b34156106cc57fe5b6106f8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506121db565b6040518082815260200191505060405180910390f35b341561071657fe5b610742600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506122f3565b005b341561074c57fe5b6107546123d7565b6040518082815260200191505060405180910390f35b341561077257fe5b61077a6124bc565b604051808260ff1660ff16815260200191505060405180910390f35b341561079e57fe5b6107a661259e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107f057fe5b6107f86125c4565b6040518080602001828103825283818151815260200191508051906020019080838360008314610847575b80518252602083111561084757602082019150602081019050602083039250610823565b505050905090810190601f1680156108735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561088957fe5b61089f60048080359060200190919050506125fe565b604051808215151515815260200191505060405180910390f35b34156108c157fe5b6108f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612721565b604051808215151515815260200191505060405180910390f35b341561091857fe5b6109206128bc565b604051808215151515815260200191505060405180910390f35b341561094257fe5b61096e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506128fd565b005b341561097857fe5b610980612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ca57fe5b6109f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ddb565b005b3415610a0057fe5b610a4b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e57565b6040518082815260200191505060405180910390f35b3415610a6957fe5b610a82600480803560ff16906020019091905050612fa4565b604051808215151515815260200191505060405180910390f35b3415610aa457fe5b610af4600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506130cd565b6040518082815260200191505060405180910390f35b3415610b1257fe5b610b3e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613224565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bea5780601f10610bbf57610100808354040283529160200191610bea565b820191906000526020600020905b815481529060010190602001808311610bcd57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1f21c673385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610cf257fe5b6102c65a03f11515610d0057fe5b5050506040518051905015610d7d578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a360019050610d87565b60009050610d87565b5b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5537ede3385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610e8d57fe5b6102c65a03f11515610e9b57fe5b5050506040518051905090505b92915050565b610ee4610edf336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166122f3565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561102b57fe5b6102c65a03f1151561103957fe5b505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663116877cc600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561111757fe5b6102c65a03f1151561112557fe5b5050505b5b50565b61116361115e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4dc2aa4336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156112d557fe5b6102c65a03f115156112e357fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8a582af336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156113b757fe5b6102c65a03f115156113c557fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561150957fe5b6102c65a03f1151561151757fe5b5050506040518051905015611594578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061159e565b6000905061159e565b5b9392505050565b60006115dd6115d8336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2e1a8d8836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561169f57fe5b6102c65a03f115156116ad57fe5b5050506040518051905090505b5b919050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358cf9570336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561178957fe5b6102c65a03f1151561179757fe5b5050506040518051905090505b90565b60006117df6117da336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156118a957fe5b6102c65a03f115156118b757fe5b5050506040518051905090505b5b919050565b6119006118fb336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb9734fc33846040518082805190602001908083835b602083106119735780518252602082019150602081019050602083039250611950565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600019166000191681526020018281526020019350505050600060405180830381600087803b1515611a3157fe5b6102c65a03f11515611a3f57fe5b5050505b5b5050565b6000611a80611a7b336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166325f0f46733846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611b4a57fe5b6102c65a03f11515611b5857fe5b5050506040518051905090505b5b919050565b611ba1611b9c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b611baa84612ddb565b611bb383611d23565b611bbc82610eae565b611bc5816128fd565b5b5b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b76a25c338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611d0157fe5b6102c65a03f11515611d0f57fe5b5050506040518051905090505b9392505050565b611d59611d54336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515611e7557fe5b6102c65a03f11515611e8357fe5b505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611f6a57fe5b6102c65a03f11515611f7857fe5b5050506040518051905050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156121d657600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156120bf57fe5b6102c65a03f115156120cd57fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156121bc57fe5b6102c65a03f115156121ca57fe5b50505060405180519050505b5b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7888aec33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156122d357fe5b6102c65a03f115156122e157fe5b5050506040518051905090505b919050565b612329612324336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405180905060405180910390a25b5b50565b600061240f61240a336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637aa306a26000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401809050602060405180830381600087803b151561249d57fe5b6102c65a03f115156124ab57fe5b5050506040518051905090505b5b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663112fbe9b336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561258057fe5b6102c65a03f1151561258e57fe5b5050506040518051905090505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b604060405190810160405280600381526020017f584a50000000000000000000000000000000000000000000000000000000000081525081565b6000612636612631336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561270057fe5b6102c65a03f1151561270e57fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561282157fe5b6102c65a03f1151561282f57fe5b50505060405180519050156128ac578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190506128b6565b600090506128b6565b5b92915050565b60006128f46128ef336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600190505b5b90565b61293361292e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a5857fe5b6102c65a03f11515612a6657fe5b5050506040518051905050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515612b4c57fe5b6102c65a03f11515612b5a57fe5b505050600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612db057600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612c9957fe5b6102c65a03f11515612ca757fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612d9657fe5b6102c65a03f11515612da457fe5b50505060405180519050505b5b5b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612e11612e0c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663927da1053385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b1515612f8357fe5b6102c65a03f11515612f9157fe5b5050506040518051905090505b92915050565b6000612fdc612fd7336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663915a405f33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff16815260200192505050602060405180830381600087803b15156130ac57fe5b6102c65a03f115156130ba57fe5b5050506040518051905090505b5b919050565b6000613105613100336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663796d67da836040518082805190602001908083835b602083106131775780518252602082019150602081019050602083039250613154565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561320357fe5b6102c65a03f1151561321157fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631bea800633846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561331c57fe5b6102c65a03f1151561332a57fe5b5050506040518051905090505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806133c55750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135205750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b151561350757fe5b6102c65a03f1151561351557fe5b505050604051805190505b90505b92915050565b8015156135365760006000fd5b5b505600a165627a7a72305820792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a0029

   Swarm Source:
bzzr://792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.