ETH Price: $2,109.89 (+6.46%)

Token

Tier 1 ()
 

Overview

Max Total Supply

0 Tier 1

Holders

0

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
MintedTokenCappedCrowdsaleExt

Compiler Version
v0.4.11+commit.68ef5810

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-02-28
*/

// Created using Token Wizard https://github.com/poanetwork/token-wizard by POA Network 
// Temporarily have SafeMath here until all contracts have been migrated to SafeMathLib version from OpenZeppelin

pragma solidity ^0.4.8;


/**
 * Math operations with safety checks
 */
contract SafeMath {
  function safeMul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeDiv(uint a, uint b) internal returns (uint) {
    assert(b > 0);
    uint c = a / b;
    assert(a == b * c + a % b);
    return c;
  }

  function safeSub(uint a, uint b) internal returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) internal returns (uint) {
    uint c = a + b;
    assert(c>=a && c>=b);
    return c;
  }

  function max64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a < b ? a : b;
  }

}



/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public constant returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}



/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}
/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * Safe unsigned safe math.
 *
 * https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736#.750gwtwli
 *
 * Originally from https://raw.githubusercontent.com/AragonOne/zeppelin-solidity/master/contracts/SafeMathLib.sol
 *
 * Maintained here until merged to mainline zeppelin-solidity.
 *
 */
library SafeMathLibExt {

  function times(uint a, uint b) returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function divides(uint a, uint b) returns (uint) {
    assert(b > 0);
    uint c = a / b;
    assert(a == b * c + a % b);
    return c;
  }

  function minus(uint a, uint b) returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function plus(uint a, uint b) returns (uint) {
    uint c = a + b;
    assert(c>=a);
    return c;
  }

}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */





/*
 * Haltable
 *
 * Abstract contract that allows children to implement an
 * emergency stop mechanism. Differs from Pausable by causing a throw when in halt mode.
 *
 *
 * Originally envisioned in FirstBlood ICO contract.
 */
contract Haltable is Ownable {
  bool public halted;

  modifier stopInEmergency {
    if (halted) throw;
    _;
  }

  modifier stopNonOwnersInEmergency {
    if (halted && msg.sender != owner) throw;
    _;
  }

  modifier onlyInEmergency {
    if (!halted) throw;
    _;
  }

  // called by the owner on emergency, triggers stopped state
  function halt() external onlyOwner {
    halted = true;
  }

  // called by the owner on end of emergency, returns to normal state
  function unhalt() external onlyOwner onlyInEmergency {
    halted = false;
  }

}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * Interface for defining crowdsale pricing.
 */
contract PricingStrategy {

  address public tier;

  /** Interface declaration. */
  function isPricingStrategy() public constant returns (bool) {
    return true;
  }

  /** Self check if all references are correctly set.
   *
   * Checks that pricing strategy matches crowdsale parameters.
   */
  function isSane(address crowdsale) public constant returns (bool) {
    return true;
  }

  /**
   * @dev Pricing tells if this is a presale purchase or not.
     @param purchaser Address of the purchaser
     @return False by default, true if a presale purchaser
   */
  function isPresalePurchase(address purchaser) public constant returns (bool) {
    return false;
  }

  /* How many weis one token costs */
  function updateRate(uint newOneTokenInWei) public;

  /**
   * When somebody tries to buy tokens for X eth, calculate how many tokens they get.
   *
   *
   * @param value - What is the value of the transaction send in as wei
   * @param tokensSold - how much tokens have been sold this far
   * @param weiRaised - how much money has been raised this far in the main token sale - this number excludes presale
   * @param msgSender - who is the investor of this transaction
   * @param decimals - how many decimal units the token has
   * @return Amount of tokens the investor receives
   */
  function calculatePrice(uint value, uint weiRaised, uint tokensSold, address msgSender, uint decimals) public constant returns (uint tokenAmount);
}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * Finalize agent defines what happens at the end of succeseful crowdsale.
 *
 * - Allocate tokens for founders, bounties and community
 * - Make tokens transferable
 * - etc.
 */
contract FinalizeAgent {

  bool public reservedTokensAreDistributed = false;

  function isFinalizeAgent() public constant returns(bool) {
    return true;
  }

  /** Return true if we can run finalizeCrowdsale() properly.
   *
   * This is a safety check function that doesn't allow crowdsale to begin
   * unless the finalizer has been set up properly.
   */
  function isSane() public constant returns (bool);

  function distributeReservedTokens(uint reservedTokensDistributionBatch);

  /** Called once by crowdsale finalize() if the sale was success. */
  function finalizeCrowdsale();

}
/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */









/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public constant returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * A token that defines fractional units as decimals.
 */
contract FractionalERC20Ext is ERC20 {

  uint public decimals;
  uint public minCap;

}



/**
 * Abstract base contract for token sales.
 *
 * Handle
 * - start and end dates
 * - accepting investments
 * - minimum funding goal and refund
 * - various statistics during the crowdfund
 * - different pricing strategies
 * - different investment policies (require server side customer id, allow only whitelisted addresses)
 *
 */
contract CrowdsaleExt is Haltable {

  /* Max investment count when we are still allowed to change the multisig address */
  uint public MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE = 5;

  using SafeMathLibExt for uint;

  /* The token we are selling */
  FractionalERC20Ext public token;

  /* How we are going to price our offering */
  PricingStrategy public pricingStrategy;

  /* Post-success callback */
  FinalizeAgent public finalizeAgent;

  /* name of the crowdsale tier */
  string public name;

  /* tokens will be transfered from this address */
  address public multisigWallet;

  /* if the funding goal is not reached, investors may withdraw their funds */
  uint public minimumFundingGoal;

  /* the UNIX timestamp start date of the crowdsale */
  uint public startsAt;

  /* the UNIX timestamp end date of the crowdsale */
  uint public endsAt;

  /* the number of tokens already sold through this contract*/
  uint public tokensSold = 0;

  /* How many wei of funding we have raised */
  uint public weiRaised = 0;

  /* How many distinct addresses have invested */
  uint public investorCount = 0;

  /* Has this crowdsale been finalized */
  bool public finalized;

  bool public isWhiteListed;

  address[] public joinedCrowdsales;
  uint8 public joinedCrowdsalesLen = 0;
  uint8 public joinedCrowdsalesLenMax = 50;
  struct JoinedCrowdsaleStatus {
    bool isJoined;
    uint8 position;
  }
  mapping (address => JoinedCrowdsaleStatus) joinedCrowdsaleState;

  /** How much ETH each address has invested to this crowdsale */
  mapping (address => uint256) public investedAmountOf;

  /** How much tokens this crowdsale has credited for each investor address */
  mapping (address => uint256) public tokenAmountOf;

  struct WhiteListData {
    bool status;
    uint minCap;
    uint maxCap;
  }

  //is crowdsale updatable
  bool public isUpdatable;

  /** Addresses that are allowed to invest even before ICO offical opens. For testing, for ICO partners, etc. */
  mapping (address => WhiteListData) public earlyParticipantWhitelist;

  /** List of whitelisted addresses */
  address[] public whitelistedParticipants;

  /** This is for manul testing for the interaction from owner wallet. You can set it to any value and inspect this in blockchain explorer to see that crowdsale interaction works. */
  uint public ownerTestValue;

  /** State machine
   *
   * - Preparing: All contract initialization calls and variables have not been set yet
   * - Prefunding: We have not passed start time yet
   * - Funding: Active crowdsale
   * - Success: Minimum funding goal reached
   * - Failure: Minimum funding goal not reached before ending time
   * - Finalized: The finalized has been called and succesfully executed
   */
  enum State{Unknown, Preparing, PreFunding, Funding, Success, Failure, Finalized}

  // A new investment was made
  event Invested(address investor, uint weiAmount, uint tokenAmount, uint128 customerId);

  // Address early participation whitelist status changed
  event Whitelisted(address addr, bool status, uint minCap, uint maxCap);
  event WhitelistItemChanged(address addr, bool status, uint minCap, uint maxCap);

  // Crowdsale start time has been changed
  event StartsAtChanged(uint newStartsAt);

  // Crowdsale end time has been changed
  event EndsAtChanged(uint newEndsAt);

  function CrowdsaleExt(string _name, address _token, PricingStrategy _pricingStrategy, address _multisigWallet, uint _start, uint _end, uint _minimumFundingGoal, bool _isUpdatable, bool _isWhiteListed) {

    owner = msg.sender;

    name = _name;

    token = FractionalERC20Ext(_token);

    setPricingStrategy(_pricingStrategy);

    multisigWallet = _multisigWallet;
    if(multisigWallet == 0) {
        throw;
    }

    if(_start == 0) {
        throw;
    }

    startsAt = _start;

    if(_end == 0) {
        throw;
    }

    endsAt = _end;

    // Don't mess the dates
    if(startsAt >= endsAt) {
        throw;
    }

    // Minimum funding goal can be zero
    minimumFundingGoal = _minimumFundingGoal;

    isUpdatable = _isUpdatable;

    isWhiteListed = _isWhiteListed;
  }

  /**
   * Don't expect to just send in money and get tokens.
   */
  function() payable {
    throw;
  }

  /**
   * Make an investment.
   *
   * Crowdsale must be running for one to invest.
   * We must have not pressed the emergency brake.
   *
   * @param receiver The Ethereum address who receives the tokens
   * @param customerId (optional) UUID v4 to track the successful payments on the server side
   *
   */
  function investInternal(address receiver, uint128 customerId) stopInEmergency private {

    // Determine if it's a good time to accept investment from this participant
    if(getState() == State.PreFunding) {
      // Are we whitelisted for early deposit
      throw;
    } else if(getState() == State.Funding) {
      // Retail participants can only come in when the crowdsale is running
      // pass
      if(isWhiteListed) {
        if(!earlyParticipantWhitelist[receiver].status) {
          throw;
        }
      }
    } else {
      // Unwanted state
      throw;
    }

    uint weiAmount = msg.value;

    // Account presale sales separately, so that they do not count against pricing tranches
    uint tokenAmount = pricingStrategy.calculatePrice(weiAmount, weiRaised, tokensSold, msg.sender, token.decimals());

    if(tokenAmount == 0) {
      // Dust transaction
      throw;
    }

    if(isWhiteListed) {
      if(tokenAmount < earlyParticipantWhitelist[receiver].minCap && tokenAmountOf[receiver] == 0) {
        // tokenAmount < minCap for investor
        throw;
      }

      // Check that we did not bust the investor's cap
      if (isBreakingInvestorCap(receiver, tokenAmount)) {
        throw;
      }

      updateInheritedEarlyParticipantWhitelist(receiver, tokenAmount);
    } else {
      if(tokenAmount < token.minCap() && tokenAmountOf[receiver] == 0) {
        throw;
      }
    }

    if(investedAmountOf[receiver] == 0) {
       // A new investor
       investorCount++;
    }

    // Update investor
    investedAmountOf[receiver] = investedAmountOf[receiver].plus(weiAmount);
    tokenAmountOf[receiver] = tokenAmountOf[receiver].plus(tokenAmount);

    // Update totals
    weiRaised = weiRaised.plus(weiAmount);
    tokensSold = tokensSold.plus(tokenAmount);

    // Check that we did not bust the cap
    if(isBreakingCap(weiAmount, tokenAmount, weiRaised, tokensSold)) {
      throw;
    }

    assignTokens(receiver, tokenAmount);

    // Pocket the money
    if(!multisigWallet.send(weiAmount)) throw;

    // Tell us invest was success
    Invested(receiver, weiAmount, tokenAmount, customerId);
  }

  /**
   * Allow anonymous contributions to this crowdsale.
   */
  function invest(address addr) public payable {
    investInternal(addr, 0);
  }

  /**
   * The basic entry point to participate the crowdsale process.
   *
   * Pay for funding, get invested tokens back in the sender address.
   */
  function buy() public payable {
    invest(msg.sender);
  }

  function distributeReservedTokens(uint reservedTokensDistributionBatch) public inState(State.Success) onlyOwner stopInEmergency {
    // Already finalized
    if(finalized) {
      throw;
    }

    // Finalizing is optional. We only call it if we are given a finalizing agent.
    if(address(finalizeAgent) != address(0)) {
      finalizeAgent.distributeReservedTokens(reservedTokensDistributionBatch);
    }
  }

  function areReservedTokensDistributed() public constant returns (bool) {
    return finalizeAgent.reservedTokensAreDistributed();
  }

  function canDistributeReservedTokens() public constant returns(bool) {
    CrowdsaleExt lastTierCntrct = CrowdsaleExt(getLastTier());
    if ((lastTierCntrct.getState() == State.Success) && !lastTierCntrct.halted() && !lastTierCntrct.finalized() && !lastTierCntrct.areReservedTokensDistributed()) return true;
    return false;
  }

  /**
   * Finalize a succcesful crowdsale.
   *
   * The owner can triggre a call the contract that provides post-crowdsale actions, like releasing the tokens.
   */
  function finalize() public inState(State.Success) onlyOwner stopInEmergency {

    // Already finalized
    if(finalized) {
      throw;
    }

    // Finalizing is optional. We only call it if we are given a finalizing agent.
    if(address(finalizeAgent) != address(0)) {
      finalizeAgent.finalizeCrowdsale();
    }

    finalized = true;
  }

  /**
   * Allow to (re)set finalize agent.
   *
   * Design choice: no state restrictions on setting this, so that we can fix fat finger mistakes.
   */
  function setFinalizeAgent(FinalizeAgent addr) public onlyOwner {
    assert(address(addr) != address(0));
    assert(address(finalizeAgent) == address(0));
    finalizeAgent = addr;

    // Don't allow setting bad agent
    if(!finalizeAgent.isFinalizeAgent()) {
      throw;
    }
  }

  /**
   * Allow addresses to do early participation.
   */
  function setEarlyParticipantWhitelist(address addr, bool status, uint minCap, uint maxCap) public onlyOwner {
    if (!isWhiteListed) throw;
    assert(addr != address(0));
    assert(maxCap > 0);
    assert(minCap <= maxCap);
    assert(now <= endsAt);

    if (!isAddressWhitelisted(addr)) {
      whitelistedParticipants.push(addr);
      Whitelisted(addr, status, minCap, maxCap);
    } else {
      WhitelistItemChanged(addr, status, minCap, maxCap);
    }

    earlyParticipantWhitelist[addr] = WhiteListData({status:status, minCap:minCap, maxCap:maxCap});
  }

  function setEarlyParticipantWhitelistMultiple(address[] addrs, bool[] statuses, uint[] minCaps, uint[] maxCaps) public onlyOwner {
    if (!isWhiteListed) throw;
    assert(now <= endsAt);
    assert(addrs.length == statuses.length);
    assert(statuses.length == minCaps.length);
    assert(minCaps.length == maxCaps.length);
    for (uint iterator = 0; iterator < addrs.length; iterator++) {
      setEarlyParticipantWhitelist(addrs[iterator], statuses[iterator], minCaps[iterator], maxCaps[iterator]);
    }
  }

  function updateInheritedEarlyParticipantWhitelist(address reciever, uint tokensBought) private {
    if (!isWhiteListed) throw;
    if (tokensBought < earlyParticipantWhitelist[reciever].minCap && tokenAmountOf[reciever] == 0) throw;

    uint8 tierPosition = getTierPosition(this);

    for (uint8 j = tierPosition + 1; j < joinedCrowdsalesLen; j++) {
      CrowdsaleExt crowdsale = CrowdsaleExt(joinedCrowdsales[j]);
      crowdsale.updateEarlyParticipantWhitelist(reciever, tokensBought);
    }
  }

  function updateEarlyParticipantWhitelist(address addr, uint tokensBought) public {
    if (!isWhiteListed) throw;
    assert(addr != address(0));
    assert(now <= endsAt);
    assert(isTierJoined(msg.sender));
    if (tokensBought < earlyParticipantWhitelist[addr].minCap && tokenAmountOf[addr] == 0) throw;
    //if (addr != msg.sender && contractAddr != msg.sender) throw;
    uint newMaxCap = earlyParticipantWhitelist[addr].maxCap;
    newMaxCap = newMaxCap.minus(tokensBought);
    earlyParticipantWhitelist[addr] = WhiteListData({status:earlyParticipantWhitelist[addr].status, minCap:0, maxCap:newMaxCap});
  }

  function isAddressWhitelisted(address addr) public constant returns(bool) {
    for (uint i = 0; i < whitelistedParticipants.length; i++) {
      if (whitelistedParticipants[i] == addr) {
        return true;
        break;
      }
    }

    return false;
  }

  function whitelistedParticipantsLength() public constant returns (uint) {
    return whitelistedParticipants.length;
  }

  function isTierJoined(address addr) public constant returns(bool) {
    return joinedCrowdsaleState[addr].isJoined;
  }

  function getTierPosition(address addr) public constant returns(uint8) {
    return joinedCrowdsaleState[addr].position;
  }

  function getLastTier() public constant returns(address) {
    if (joinedCrowdsalesLen > 0)
      return joinedCrowdsales[joinedCrowdsalesLen - 1];
    else
      return address(0);
  }

  function setJoinedCrowdsales(address addr) private onlyOwner {
    assert(addr != address(0));
    assert(joinedCrowdsalesLen <= joinedCrowdsalesLenMax);
    assert(!isTierJoined(addr));
    joinedCrowdsales.push(addr);
    joinedCrowdsaleState[addr] = JoinedCrowdsaleStatus({
      isJoined: true,
      position: joinedCrowdsalesLen
    });
    joinedCrowdsalesLen++;
  }

  function updateJoinedCrowdsalesMultiple(address[] addrs) public onlyOwner {
    assert(addrs.length > 0);
    assert(joinedCrowdsalesLen == 0);
    assert(addrs.length <= joinedCrowdsalesLenMax);
    for (uint8 iter = 0; iter < addrs.length; iter++) {
      setJoinedCrowdsales(addrs[iter]);
    }
  }

  function setStartsAt(uint time) onlyOwner {
    assert(!finalized);
    assert(isUpdatable);
    assert(now <= time); // Don't change past
    assert(time <= endsAt);
    assert(now <= startsAt);

    CrowdsaleExt lastTierCntrct = CrowdsaleExt(getLastTier());
    if (lastTierCntrct.finalized()) throw;

    uint8 tierPosition = getTierPosition(this);

    //start time should be greater then end time of previous tiers
    for (uint8 j = 0; j < tierPosition; j++) {
      CrowdsaleExt crowdsale = CrowdsaleExt(joinedCrowdsales[j]);
      assert(time >= crowdsale.endsAt());
    }

    startsAt = time;
    StartsAtChanged(startsAt);
  }

  /**
   * Allow crowdsale owner to close early or extend the crowdsale.
   *
   * This is useful e.g. for a manual soft cap implementation:
   * - after X amount is reached determine manual closing
   *
   * This may put the crowdsale to an invalid state,
   * but we trust owners know what they are doing.
   *
   */
  function setEndsAt(uint time) public onlyOwner {
    assert(!finalized);
    assert(isUpdatable);
    assert(now <= time);// Don't change past
    assert(startsAt <= time);
    assert(now <= endsAt);

    CrowdsaleExt lastTierCntrct = CrowdsaleExt(getLastTier());
    if (lastTierCntrct.finalized()) throw;


    uint8 tierPosition = getTierPosition(this);

    for (uint8 j = tierPosition + 1; j < joinedCrowdsalesLen; j++) {
      CrowdsaleExt crowdsale = CrowdsaleExt(joinedCrowdsales[j]);
      assert(time <= crowdsale.startsAt());
    }

    endsAt = time;
    EndsAtChanged(endsAt);
  }

  /**
   * Allow to (re)set pricing strategy.
   *
   * Design choice: no state restrictions on the set, so that we can fix fat finger mistakes.
   */
  function setPricingStrategy(PricingStrategy _pricingStrategy) public onlyOwner {
    assert(address(_pricingStrategy) != address(0));
    assert(address(pricingStrategy) == address(0));
    pricingStrategy = _pricingStrategy;

    // Don't allow setting bad agent
    if(!pricingStrategy.isPricingStrategy()) {
      throw;
    }
  }

  /**
   * Allow to change the team multisig address in the case of emergency.
   *
   * This allows to save a deployed crowdsale wallet in the case the crowdsale has not yet begun
   * (we have done only few test transactions). After the crowdsale is going
   * then multisig address stays locked for the safety reasons.
   */
  function setMultisig(address addr) public onlyOwner {

    // Change
    if(investorCount > MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE) {
      throw;
    }

    multisigWallet = addr;
  }

  /**
   * @return true if the crowdsale has raised enough money to be a successful.
   */
  function isMinimumGoalReached() public constant returns (bool reached) {
    return weiRaised >= minimumFundingGoal;
  }

  /**
   * Check if the contract relationship looks good.
   */
  function isFinalizerSane() public constant returns (bool sane) {
    return finalizeAgent.isSane();
  }

  /**
   * Check if the contract relationship looks good.
   */
  function isPricingSane() public constant returns (bool sane) {
    return pricingStrategy.isSane(address(this));
  }

  /**
   * Crowdfund state machine management.
   *
   * We make it a function and do not assign the result to a variable, so there is no chance of the variable being stale.
   */
  function getState() public constant returns (State) {
    if(finalized) return State.Finalized;
    else if (address(finalizeAgent) == 0) return State.Preparing;
    else if (!finalizeAgent.isSane()) return State.Preparing;
    else if (!pricingStrategy.isSane(address(this))) return State.Preparing;
    else if (block.timestamp < startsAt) return State.PreFunding;
    else if (block.timestamp <= endsAt && !isCrowdsaleFull()) return State.Funding;
    else if (isMinimumGoalReached()) return State.Success;
    else return State.Failure;
  }

  /** Interface marker. */
  function isCrowdsale() public constant returns (bool) {
    return true;
  }

  //
  // Modifiers
  //

  /** Modified allowing execution only if the crowdsale is currently running.  */
  modifier inState(State state) {
    if(getState() != state) throw;
    _;
  }


  //
  // Abstract functions
  //

  /**
   * Check if the current invested breaks our cap rules.
   *
   *
   * The child contract must define their own cap setting rules.
   * We allow a lot of flexibility through different capping strategies (ETH, token count)
   * Called from invest().
   *
   * @param weiAmount The amount of wei the investor tries to invest in the current transaction
   * @param tokenAmount The amount of tokens we try to give to the investor in the current transaction
   * @param weiRaisedTotal What would be our total raised balance after this transaction
   * @param tokensSoldTotal What would be our total sold tokens count after this transaction
   *
   * @return true if taking this investment would break our cap rules
   */
  function isBreakingCap(uint weiAmount, uint tokenAmount, uint weiRaisedTotal, uint tokensSoldTotal) public constant returns (bool limitBroken);

  function isBreakingInvestorCap(address receiver, uint tokenAmount) public constant returns (bool limitBroken);

  /**
   * Check if the current crowdsale is full and we can no longer sell any tokens.
   */
  function isCrowdsaleFull() public constant returns (bool);

  /**
   * Create new tokens or transfer issued tokens to the investor depending on the cap model.
   */
  function assignTokens(address receiver, uint tokenAmount) private;
}

/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */



/**
 * This smart contract code is Copyright 2017 TokenMarket Ltd. For more information see https://tokenmarket.net
 *
 * Licensed under the Apache License, version 2.0: https://github.com/TokenMarketNet/ico/blob/master/LICENSE.txt
 */








/**
 * Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
 *
 * Based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, SafeMath {

  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  /* Actual balances of token holders */
  mapping(address => uint) balances;

  /* approve() allowances */
  mapping (address => mapping (address => uint)) allowed;

  /* Interface declaration */
  function isToken() public constant returns (bool weAre) {
    return true;
  }

  function transfer(address _to, uint _value) returns (bool success) {
    balances[msg.sender] = safeSub(balances[msg.sender], _value);
    balances[_to] = safeAdd(balances[_to], _value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

    balances[_to] = safeAdd(balances[_to], _value);
    balances[_from] = safeSub(balances[_from], _value);
    allowed[_from][msg.sender] = safeSub(_allowance, _value);
    Transfer(_from, _to, _value);
    return true;
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) throw;

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}





/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableTokenExt is StandardToken, Ownable {

  using SafeMathLibExt for uint;

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state  );

  /** inPercentageUnit is percents of tokens multiplied to 10 up to percents decimals.
  * For example, for reserved tokens in percents 2.54%
  * inPercentageUnit = 254
  * inPercentageDecimals = 2
  */
  struct ReservedTokensData {
    uint inTokens;
    uint inPercentageUnit;
    uint inPercentageDecimals;
    bool isReserved;
    bool isDistributed;
  }

  mapping (address => ReservedTokensData) public reservedTokensList;
  address[] public reservedTokensDestinations;
  uint public reservedTokensDestinationsLen = 0;
  bool reservedTokensDestinationsAreSet = false;

  modifier onlyMintAgent() {
    // Only crowdsale contracts are allowed to mint new tokens
    if(!mintAgents[msg.sender]) {
        throw;
    }
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    if(mintingFinished) throw;
    _;
  }

  function finalizeReservedAddress(address addr) public onlyMintAgent canMint {
    ReservedTokensData storage reservedTokensData = reservedTokensList[addr];
    reservedTokensData.isDistributed = true;
  }

  function isAddressReserved(address addr) public constant returns (bool isReserved) {
    return reservedTokensList[addr].isReserved;
  }

  function areTokensDistributedForAddress(address addr) public constant returns (bool isDistributed) {
    return reservedTokensList[addr].isDistributed;
  }

  function getReservedTokens(address addr) public constant returns (uint inTokens) {
    return reservedTokensList[addr].inTokens;
  }

  function getReservedPercentageUnit(address addr) public constant returns (uint inPercentageUnit) {
    return reservedTokensList[addr].inPercentageUnit;
  }

  function getReservedPercentageDecimals(address addr) public constant returns (uint inPercentageDecimals) {
    return reservedTokensList[addr].inPercentageDecimals;
  }

  function setReservedTokensListMultiple(
    address[] addrs, 
    uint[] inTokens, 
    uint[] inPercentageUnit, 
    uint[] inPercentageDecimals
  ) public canMint onlyOwner {
    assert(!reservedTokensDestinationsAreSet);
    assert(addrs.length == inTokens.length);
    assert(inTokens.length == inPercentageUnit.length);
    assert(inPercentageUnit.length == inPercentageDecimals.length);
    for (uint iterator = 0; iterator < addrs.length; iterator++) {
      if (addrs[iterator] != address(0)) {
        setReservedTokensList(addrs[iterator], inTokens[iterator], inPercentageUnit[iterator], inPercentageDecimals[iterator]);
      }
    }
    reservedTokensDestinationsAreSet = true;
  }

  /**
   * Create new tokens and allocate them to an address..
   *
   * Only callably by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent canMint public {
    totalSupply = totalSupply.plus(amount);
    balances[receiver] = balances[receiver].plus(amount);

    // This will make the mint transaction apper in EtherScan.io
    // We can remove this after there is a standardized minting event
    Transfer(0, receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  function setReservedTokensList(address addr, uint inTokens, uint inPercentageUnit, uint inPercentageDecimals) private canMint onlyOwner {
    assert(addr != address(0));
    if (!isAddressReserved(addr)) {
      reservedTokensDestinations.push(addr);
      reservedTokensDestinationsLen++;
    }

    reservedTokensList[addr] = ReservedTokensData({
      inTokens: inTokens, 
      inPercentageUnit: inPercentageUnit, 
      inPercentageDecimals: inPercentageDecimals,
      isReserved: true,
      isDistributed: false
    });
  }
}

/**
 * ICO crowdsale contract that is capped by amout of tokens.
 *
 * - Tokens are dynamically created during the crowdsale
 *
 *
 */
contract MintedTokenCappedCrowdsaleExt is CrowdsaleExt {

  /* Maximum amount of tokens this crowdsale can sell. */
  uint public maximumSellableTokens;

  function MintedTokenCappedCrowdsaleExt(
    string _name, 
    address _token, 
    PricingStrategy _pricingStrategy, 
    address _multisigWallet, 
    uint _start, uint _end, 
    uint _minimumFundingGoal, 
    uint _maximumSellableTokens, 
    bool _isUpdatable, 
    bool _isWhiteListed
  ) CrowdsaleExt(_name, _token, _pricingStrategy, _multisigWallet, _start, _end, _minimumFundingGoal, _isUpdatable, _isWhiteListed) {
    maximumSellableTokens = _maximumSellableTokens;
  }

  // Crowdsale maximumSellableTokens has been changed
  event MaximumSellableTokensChanged(uint newMaximumSellableTokens);

  /**
   * Called from invest() to confirm if the curret investment does not break our cap rule.
   */
  function isBreakingCap(uint weiAmount, uint tokenAmount, uint weiRaisedTotal, uint tokensSoldTotal) public constant returns (bool limitBroken) {
    return tokensSoldTotal > maximumSellableTokens;
  }

  function isBreakingInvestorCap(address addr, uint tokenAmount) public constant returns (bool limitBroken) {
    assert(isWhiteListed);
    uint maxCap = earlyParticipantWhitelist[addr].maxCap;
    return (tokenAmountOf[addr].plus(tokenAmount)) > maxCap;
  }

  function isCrowdsaleFull() public constant returns (bool) {
    return tokensSold >= maximumSellableTokens;
  }

  function setMaximumSellableTokens(uint tokens) public onlyOwner {
    assert(!finalized);
    assert(isUpdatable);
    assert(now <= startsAt);

    CrowdsaleExt lastTierCntrct = CrowdsaleExt(getLastTier());
    assert(!lastTierCntrct.finalized());

    maximumSellableTokens = tokens;
    MaximumSellableTokensChanged(maximumSellableTokens);
  }

  function updateRate(uint newOneTokenInWei) public onlyOwner {
    assert(!finalized);
    assert(isUpdatable);
    assert(now <= startsAt);

    CrowdsaleExt lastTierCntrct = CrowdsaleExt(getLastTier());
    assert(!lastTierCntrct.finalized());

    pricingStrategy.updateRate(newOneTokenInWei);
  }

  /**
   * Dynamically create tokens and assign them to the investor.
   */
  function assignTokens(address receiver, uint tokenAmount) private {
    MintableTokenExt mintableToken = MintableTokenExt(token);
    mintableToken.mint(receiver, tokenAmount);
  }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"ownerTestValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"invest","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"tokenAmount","type":"uint256"}],"name":"isBreakingInvestorCap","outputs":[{"name":"limitBroken","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[]"}],"name":"updateJoinedCrowdsalesMultiple","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isPricingSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"endsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isUpdatable","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isAddressWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"minimumFundingGoal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setFinalizeAgent","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"whitelistedParticipantsLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investedAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalizeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isTierJoined","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"areReservedTokensDistributed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"}],"name":"setMaximumSellableTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maximumSellableTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsale","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_pricingStrategy","type":"address"}],"name":"setPricingStrategy","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokensSold","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOneTokenInWei","type":"uint256"}],"name":"updateRate","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"time","type":"uint256"}],"name":"setEndsAt","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pricingStrategy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isMinimumGoalReached","outputs":[{"name":"reached","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"joinedCrowdsalesLenMax","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"status","type":"bool"},{"name":"minCap","type":"uint256"},{"name":"maxCap","type":"uint256"}],"name":"setEarlyParticipantWhitelist","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"multisigWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"weiAmount","type":"uint256"},{"name":"tokenAmount","type":"uint256"},{"name":"weiRaisedTotal","type":"uint256"},{"name":"tokensSoldTotal","type":"uint256"}],"name":"isBreakingCap","outputs":[{"name":"limitBroken","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"isFinalizerSane","outputs":[{"name":"sane","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"startsAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getTierPosition","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[]"},{"name":"statuses","type":"bool[]"},{"name":"minCaps","type":"uint256[]"},{"name":"maxCaps","type":"uint256[]"}],"name":"setEarlyParticipantWhitelistMultiple","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"canDistributeReservedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"joinedCrowdsales","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"time","type":"uint256"}],"name":"setStartsAt","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"tokensBought","type":"uint256"}],"name":"updateEarlyParticipantWhitelist","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getLastTier","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"earlyParticipantWhitelist","outputs":[{"name":"status","type":"bool"},{"name":"minCap","type":"uint256"},{"name":"maxCap","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unhalt","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"reservedTokensDistributionBatch","type":"uint256"}],"name":"distributeReservedTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsaleFull","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"whitelistedParticipants","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"joinedCrowdsalesLen","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"isWhiteListed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setMultisig","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_token","type":"address"},{"name":"_pricingStrategy","type":"address"},{"name":"_multisigWallet","type":"address"},{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"},{"name":"_minimumFundingGoal","type":"uint256"},{"name":"_maximumSellableTokens","type":"uint256"},{"name":"_isUpdatable","type":"bool"},{"name":"_isWhiteListed","type":"bool"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newMaximumSellableTokens","type":"uint256"}],"name":"MaximumSellableTokensChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint128"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"minCap","type":"uint256"},{"indexed":false,"name":"maxCap","type":"uint256"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"minCap","type":"uint256"},{"indexed":false,"name":"maxCap","type":"uint256"}],"name":"WhitelistItemChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newStartsAt","type":"uint256"}],"name":"StartsAtChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newEndsAt","type":"uint256"}],"name":"EndsAtChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405260056001556000600a819055600b819055600c55600f805461ffff191661320017905534156200003057fe5b604051620032013803806200320183398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01519790990198959694959394929391929091905b8989898989898988885b5b60008054600160a060020a03191633600160a060020a03161790555b60008054600160a060020a03191633600160a060020a03161790558851620000e19060059060208c0190620002a9565b5060028054600160a060020a031916600160a060020a038a161790556200011687640100000000620001c28102620014b31704565b60068054600160a060020a031916600160a060020a038881169190911791829055161515620001455760006000fd5b841515620001535760006000fd5b6008859055831515620001665760006000fd5b60098490556008548490106200017c5760006000fd5b60078390556013805460ff1916831515179055600d805461ff001916610100831515021790555b50505060178990555050505050505b5050505050505050505062000353565b60005433600160a060020a03908116911614620001df5760006000fd5b600160a060020a0381161515620001f257fe5b600354600160a060020a0316156200020657fe5b60038054600160a060020a031916600160a060020a038381169190911791829055604080516000602091820181905282517f04bbc255000000000000000000000000000000000000000000000000000000008152925194909316936304bbc255936004808501948390030190829087803b15156200028057fe5b6102c65a03f115156200028f57fe5b50506040515115159050620002a45760006000fd5b5b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ec57805160ff19168380011785556200031c565b828001600101855582156200031c579182015b828111156200031c578251825591602001919060010190620002ff565b5b506200032b9291506200032f565b5090565b6200035091905b808211156200032b576000815560010162000336565b5090565b90565b612e9e80620003636000396000f300606060405236156102a35763ffffffff60e060020a6000350416630226401d81146102b157806303f9c793146102d3578063045b1a0c146102e957806304fc7c6d1461031c578063062b01ce1461037157806306fdde03146103955780630a09284a146104255780630e1d2ec81461044757806313f44d101461046b57806313f4e9771461049b5780631865c57d146104bd57806319b667da146104f15780631a98d0de1461050f5780631aae34601461053157806321d5c0f61461055f578063253ebd921461058b57806325e0671f146105bb5780632c2de40a146105df5780633ad075ea146105f45780634042b66f146106165780634551dd59146106385780634bb278f31461065c57806350c677341461066e578063518ab2a81461068c5780635ed7ca5b146106ae5780636203f09f146106c057806369ea1771146106e25780636e50eb3f146106f757806378b99c241461070c5780637c2e08a3146107385780638507bee81461075c578063895594f6146107825780638da5cb5b146107ab5780639075becf146107d757806397b150ca146108035780639d3c663f14610831578063a6f2ae3a14610861578063a7ba44c31461086b578063af4686821461088f578063af58574a146108b1578063b1cb574b146108e3578063b3f05b97146109e0578063b9b8af0b14610a04578063bd71933614610a28578063bede2cac14610a4c578063bf5fc2ee14610a7b578063c12eb19114610a90578063c24becf314610ab1578063cb16e6d014610add578063cb3e64fd14610b19578063cddaf24114610b2b578063d5d0902114610b40578063d7e64c0014610b64578063e6d04d5e14610b86578063ebdfa45514610bb5578063ef674e6614610bdb578063f2fde38b14610bff578063f3283fba14610c1d578063fc0c546a14610c3b575b6102af5b60006000fd5b565b005b34156102b957fe5b6102c1610c67565b60408051918252519081900360200190f35b6102af600160a060020a0360043516610c6d565b005b34156102f157fe5b610308600160a060020a0360043516602435610c7c565b604080519115158252519081900360200190f35b341561032457fe5b6102af600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d3f95505050505050565b005b341561037957fe5b610308610dce565b604080519115158252519081900360200190f35b341561039d57fe5b6103a5610e57565b6040805160208082528351818301528351919283929083019185019080838382156103eb575b8051825260208311156103eb57601f1990920191602091820191016103cb565b505050905090810190601f1680156104175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042d57fe5b6102c1610ee5565b60408051918252519081900360200190f35b341561044f57fe5b610308610eeb565b604080519115158252519081900360200190f35b341561047357fe5b610308600160a060020a0360043516610ef4565b604080519115158252519081900360200190f35b34156104a357fe5b6102c1610f67565b60408051918252519081900360200190f35b34156104c557fe5b6104cd610f6d565b604051808260068111156104dd57fe5b60ff16815260200191505060405180910390f35b34156104f957fe5b6102af600160a060020a036004351661110b565b005b341561051757fe5b6102c16111fa565b60408051918252519081900360200190f35b341561053957fe5b6102c1600160a060020a0360043516611201565b60408051918252519081900360200190f35b341561056757fe5b61056f611213565b60408051600160a060020a039092168252519081900360200190f35b341561059357fe5b610308600160a060020a0360043516611222565b604080519115158252519081900360200190f35b34156105c357fe5b610308611244565b604080519115158252519081900360200190f35b34156105e757fe5b6102af6004356112bc565b005b34156105fc57fe5b6102c16113ab565b60408051918252519081900360200190f35b341561061e57fe5b6102c16113b1565b60408051918252519081900360200190f35b341561064057fe5b6103086113b7565b604080519115158252519081900360200190f35b341561066457fe5b6102af6113bd565b005b341561067657fe5b6102af600160a060020a03600435166114b3565b005b341561069457fe5b6102c16115a1565b60408051918252519081900360200190f35b34156106b657fe5b6102af6115a7565b005b34156106c857fe5b6102c16115eb565b60408051918252519081900360200190f35b34156106ea57fe5b6102af6004356115f1565b005b34156106ff57fe5b6102af60043561171b565b005b341561071457fe5b61056f6118f6565b60408051600160a060020a039092168252519081900360200190f35b341561074057fe5b610308611905565b604080519115158252519081900360200190f35b341561076457fe5b61076c611911565b6040805160ff9092168252519081900360200190f35b341561078a57fe5b6102af600160a060020a0360043516602435151560443560643561191f565b005b34156107b357fe5b61056f611acd565b60408051600160a060020a039092168252519081900360200190f35b34156107df57fe5b61056f611adc565b60408051600160a060020a039092168252519081900360200190f35b341561080b57fe5b6102c1600160a060020a0360043516611aeb565b60408051918252519081900360200190f35b341561083957fe5b610308600435602435604435606435611afd565b604080519115158252519081900360200190f35b6102af611b0b565b005b341561087357fe5b610308611b17565b604080519115158252519081900360200190f35b341561089757fe5b6102c1611b8f565b60408051918252519081900360200190f35b34156108b957fe5b61076c600160a060020a0360043516611b95565b6040805160ff9092168252519081900360200190f35b34156108eb57fe5b6102af600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750949650611bbc95505050505050565b005b34156109e857fe5b610308611ca4565b604080519115158252519081900360200190f35b3415610a0c57fe5b610308611cad565b604080519115158252519081900360200190f35b3415610a3057fe5b610308611cbd565b604080519115158252519081900360200190f35b3415610a5457fe5b61056f600435611e7c565b60408051600160a060020a039092168252519081900360200190f35b3415610a8357fe5b6102af600435611eae565b005b3415610a9857fe5b6102af600160a060020a0360043516602435612083565b005b3415610ab957fe5b61056f61221e565b60408051600160a060020a039092168252519081900360200190f35b3415610ae557fe5b610af9600160a060020a036004351661227e565b604080519315158452602084019290925282820152519081900360600190f35b3415610b2157fe5b6102af6122a3565b005b3415610b3357fe5b6102af6004356122fb565b005b3415610b4857fe5b6103086123ed565b604080519115158252519081900360200190f35b3415610b6c57fe5b6102c16123f9565b60408051918252519081900360200190f35b3415610b8e57fe5b61056f6004356123ff565b60408051600160a060020a039092168252519081900360200190f35b3415610bbd57fe5b61076c612431565b6040805160ff9092168252519081900360200190f35b3415610be357fe5b61030861243a565b604080519115158252519081900360200190f35b3415610c0757fe5b6102af600160a060020a0360043516612448565b005b3415610c2557fe5b6102af600160a060020a03600435166124e0565b005b3415610c4357fe5b61056f61253b565b60408051600160a060020a039092168252519081900360200190f35b60165481565b610c7881600061254a565b5b50565b600d546000908190610100900460ff161515610c9457fe5b50600160a060020a03831660009081526014602090815260408083206002015460128352818420548251840194909452815160e060020a6366098d4f028152600481019490945260248401869052905190928392734d91a9442b7177d9558b44551731e6d4f0a22c76926366098d4f926044808201939291829003018186803b1515610d1c57fe5b6102c65a03f41515610d2a57fe5b505050604051805190501191505b5092915050565b6000805433600160a060020a03908116911614610d5c5760006000fd5b815160009011610d6857fe5b600f5460ff1615610d7557fe5b600f54825161010090910460ff16901115610d8c57fe5b5060005b81518160ff161015610dc857610dbf828260ff16815181101515610db057fe5b90602001906020020151612b5f565b5b600101610d90565b5b5b5050565b600354604080516000602091820181905282517f8e768288000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152935191949390931692638e76828892602480830193919282900301818787803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610edd5780601f10610eb257610100808354040283529160200191610edd565b820191906000526020600020905b815481529060010190602001808311610ec057829003601f168201915b505050505081565b60095481565b60135460ff1681565b6000805b601554811015610f5c5782600160a060020a0316601582815481101515610f1b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610f535760019150610f61565b5b600101610ef8565b600091505b50919050565b60075481565b600d5460009060ff1615610f8357506006610e54565b600454600160a060020a03161515610f9d57506001610e54565b600460009054906101000a9004600160a060020a0316600160a060020a03166382771c8e6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ff857fe5b6102c65a03f1151561100657fe5b5050604051511515905061101c57506001610e54565b600354604080516000602091820181905282517f8e768288000000000000000000000000000000000000000000000000000000008152600160a060020a03308116600483015293519390941693638e768288936024808301949391928390030190829087803b151561108a57fe5b6102c65a03f1151561109857fe5b505060405151151590506110ae57506001610e54565b6008544210156110c057506002610e54565b60095442111580156110d757506110d56123ed565b155b156110e457506003610e54565b6110ec611905565b156110f957506004610e54565b506005610e54565b5b5b5b5b5b5b5b90565b60005433600160a060020a039081169116146111275760006000fd5b600160a060020a038116151561113957fe5b600454600160a060020a03161561114c57fe5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117808355604080516000602091820181905282517f614cb9040000000000000000000000000000000000000000000000000000000081529251939094169463614cb9049483820194929383900390910190829087803b15156111d357fe5b6102c65a03f115156111e157fe5b50506040515115159050610c785760006000fd5b5b5b50565b6015545b90565b60116020526000908152604090205481565b600454600160a060020a031681565b600160a060020a03811660009081526010602052604090205460ff165b919050565b6000600460009054906101000a9004600160a060020a0316600160a060020a031663f9cb6d7a6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b6000805433600160a060020a039081169116146112d95760006000fd5b600d5460ff16156112e657fe5b60135460ff1615156112f457fe5b60085442111561130057fe5b61130861221e565b905080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561135057fe5b6102c65a03f1151561135e57fe5b50506040515115905061136d57fe5b60178290556040805183815290517f7df545c7a1df0d2a1ba979e94124b026facab86a15ed46b6b4a732d995f9e1829181900360200190a15b5b5050565b60175481565b600b5481565b60015b90565b6004805b6113c9610f6d565b60068111156113d457fe5b146113df5760006000fd5b60005433600160a060020a039081169116146113fb5760006000fd5b60005460a060020a900460ff16156114135760006000fd5b600d5460ff16156114245760006000fd5b600454600160a060020a03161561149f5760048054604080517f0bf318a30000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692630bf318a392828201926000929082900301818387803b151561148d57fe5b6102c65a03f1151561149b57fe5b5050505b600d805460ff191660011790555b5b5b5b50565b60005433600160a060020a039081169116146114cf5760006000fd5b600160a060020a03811615156114e157fe5b600354600160a060020a0316156114f457fe5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911791829055604080516000602091820181905282517f04bbc255000000000000000000000000000000000000000000000000000000008152925194909316936304bbc255936004808501948390030190829087803b15156111d357fe5b6102c65a03f115156111e157fe5b50506040515115159050610c785760006000fd5b5b5b50565b600a5481565b60005433600160a060020a039081169116146115c35760006000fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015481565b6000805433600160a060020a0390811691161461160e5760006000fd5b600d5460ff161561161b57fe5b60135460ff16151561162957fe5b60085442111561163557fe5b61163d61221e565b905080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561168557fe5b6102c65a03f1151561169357fe5b5050604051511590506116a257fe5b600354604080517f69ea1771000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916369ea17719160248082019260009290919082900301818387803b151561170457fe5b6102c65a03f1151561171257fe5b5050505b5b5050565b6000805481908190819033600160a060020a0390811691161461173e5760006000fd5b600d5460ff161561174b57fe5b60135460ff16151561175957fe5b428590111561176457fe5b6008548590111561177157fe5b60095442111561177d57fe5b61178561221e565b935083600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156117cd57fe5b6102c65a03f115156117db57fe5b5050604051511590506117ee5760006000fd5b6117f730611b95565b92508260010191505b600f5460ff90811690831610156118b557600e805460ff841690811061182257fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a031663af4686826000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561188a57fe5b6102c65a03f1151561189857fe5b50506040515186111590506118a957fe5b5b600190910190611800565b60098590556040805186815290517fd34bb772c4ae9baa99db852f622773b31c7827e8ee818449fef20d30980bd3109181900360200190a15b5b5050505050565b600354600160a060020a031681565b600754600b5410155b90565b600f54610100900460ff1681565b60005433600160a060020a0390811691161461193b5760006000fd5b600d54610100900460ff1615156119525760006000fd5b600160a060020a038416151561196457fe5b6000811161196e57fe5b8082111561197857fe5b60095442111561198457fe5b61198d84610ef4565b1515611a225760158054600181016119a58382612e27565b916000526020600020900160005b8154600160a060020a038089166101009390930a8381029102199091161790915560408051918252851515602083015281810185905260608201849052517fc03e2cbfed65ba7e1df8d32da4afaccb75208d8a6b188f67800ceb19cb9d526492509081900360800190a1611a74565b60408051600160a060020a038616815284151560208201528082018490526060810183905290517f618943c36e69f6b3bae8b5bc48231e8911852a0c844743af41be110450a2a58f9181900360800190a15b6040805160608101825284151581526020808201858152828401858152600160a060020a03891660009081526014909352939091209151825460ff191690151517825551600182015590516002909101555b5b50505050565b600054600160a060020a031681565b600654600160a060020a031681565b60126020526000908152604090205481565b60175481115b949350505050565b6102ad33610c6d565b5b565b6000600460009054906101000a9004600160a060020a0316600160a060020a03166382771c8e6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b60085481565b600160a060020a038116600090815260106020526040902054610100900460ff165b919050565b6000805433600160a060020a03908116911614611bd95760006000fd5b600d54610100900460ff161515611bf05760006000fd5b600954421115611bfc57fe5b8351855114611c0757fe5b8251845114611c1257fe5b8151835114611c1d57fe5b5060005b845181101561171257611c928582815181101515611c3b57fe5b906020019060200201518583815181101515611c5357fe5b906020019060200201518584815181101515611c6b57fe5b906020019060200201518585815181101515611c8357fe5b9060200190602002015161191f565b5b600101611c21565b5b5b5050505050565b600d5460ff1681565b60005460a060020a900460ff1681565b60006000611cc961221e565b905060045b81600160a060020a0316631865c57d6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611d1457fe5b6102c65a03f11515611d2257fe5b50506040515190506006811115611d3557fe5b148015611d9b575080600160a060020a031663b9b8af0b6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611d8357fe5b6102c65a03f11515611d9157fe5b5050604051511590505b8015611e00575080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611de857fe5b6102c65a03f11515611df657fe5b5050604051511590505b8015611e65575080600160a060020a03166325e0671f6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611e4d57fe5b6102c65a03f11515611e5b57fe5b5050604051511590505b15611e735760019150611e78565b600091505b5090565b600e805482908110611e8a57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805481908190819033600160a060020a03908116911614611ed15760006000fd5b600d5460ff1615611ede57fe5b60135460ff161515611eec57fe5b4285901115611ef757fe5b600954851115611f0357fe5b600854421115611f0f57fe5b611f1761221e565b935083600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611f5f57fe5b6102c65a03f11515611f6d57fe5b505060405151159050611f805760006000fd5b611f8930611b95565b9250600091505b8260ff168260ff16101561204257600e805460ff8416908110611faf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a0316630a09284a6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561201757fe5b6102c65a03f1151561202557fe5b505060405151861015905061203657fe5b5b600190910190611f90565b60088590556040805186815290517fa3f2a813a039e5195c620dabcd490267a9aa5a50e4e1383bc474e9b800f7defe9181900360200190a15b5b5050505050565b600d54600090610100900460ff16151561209d5760006000fd5b600160a060020a03831615156120af57fe5b6009544211156120bb57fe5b6120c433611222565b15156120cc57fe5b600160a060020a0383166000908152601460205260409020600101548210801561210c5750600160a060020a038316600090815260126020526040902054155b156121175760006000fd5b50600160a060020a038216600090815260146020908152604080832060020154815183019390935280517ff4f3bdc100000000000000000000000000000000000000000000000000000000815260048101849052602481018590529051734d91a9442b7177d9558b44551731e6d4f0a22c769263f4f3bdc19260448082019391829003018186803b15156121a757fe5b6102c65a03f415156121b557fe5b5050604080518051606082018352600160a060020a038716600081815260146020818152868320805460ff811615158852828801858152988801878152959094529190529351151560ff199091161783559251600183015591516002909101559150505b505050565b600f5460009060ff168190111561227257600f54600e8054909160001960ff918216011690811061224b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03169050610e54565b506000610e54565b5b90565b60146020526000908152604090208054600182015460029092015460ff909116919083565b60005433600160a060020a039081169116146122bf5760006000fd5b60005460a060020a900460ff1615156122d85760006000fd5b6000805474ff0000000000000000000000000000000000000000191690555b5b5b565b6004805b612307610f6d565b600681111561231257fe5b1461231d5760006000fd5b60005433600160a060020a039081169116146123395760006000fd5b60005460a060020a900460ff16156123515760006000fd5b600d5460ff16156123625760006000fd5b600454600160a060020a031615610dc85760048054604080517fcddaf24100000000000000000000000000000000000000000000000000000000815292830185905251600160a060020a039091169163cddaf24191602480830192600092919082900301818387803b151561170457fe5b6102c65a03f1151561171257fe5b5050505b5b5b5b5b5050565b601754600a5410155b90565b600c5481565b6015805482908110611e8a57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600f5460ff1681565b600d54610100900460ff1681565b60005433600160a060020a039081169116146124645760006000fd5b600160a060020a038116151561247a5760006000fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60005433600160a060020a039081169116146124fc5760006000fd5b600154600c54111561250e5760006000fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600254600160a060020a031681565b60008054819060a060020a900460ff16156125655760006000fd5b60025b612570610f6d565b600681111561257b57fe5b14156125875760006000fd5b60035b612592610f6d565b600681111561259d57fe5b14156102a757600d54610100900460ff16156125db57600160a060020a03841660009081526014602052604090205460ff1615156125db5760006000fd5b5b6125e7565b60006000fd5b5b349150600360009054906101000a9004600160a060020a0316600160a060020a03166318a4155e83600b54600a5433600260009054906101000a9004600160a060020a0316600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561267257fe5b6102c65a03f1151561268057fe5b505050604051805190506000604051602001526040518663ffffffff1660e060020a0281526004018086815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182815260200195505050505050602060405180830381600087803b15156126f657fe5b6102c65a03f1151561270457fe5b50506040515191505080151561271a5760006000fd5b600d54610100900460ff161561279957600160a060020a0384166000908152601460205260409020600101548110801561276a5750600160a060020a038416600090815260126020526040902054155b156127755760006000fd5b61277f8482610c7c565b1561278a5760006000fd5b6127948482612c5c565b612842565b600254604080516000602091820181905282517f3fa615b00000000000000000000000000000000000000000000000000000000081529251600160a060020a0390941693633fa615b09360048082019493918390030190829087803b15156127fd57fe5b6102c65a03f1151561280b57fe5b5050604051518210905080156128375750600160a060020a038416600090815260126020526040902054155b156128425760006000fd5b5b600160a060020a038416600090815260116020526040902054151561286c57600c805460010190555b600160a060020a0384166000908152601160209081526040808320548151830193909352805160e060020a6366098d4f02815260048101939093526024830185905251734d91a9442b7177d9558b44551731e6d4f0a22c76926366098d4f926044808301939192829003018186803b15156128e357fe5b6102c65a03f415156128f157fe5b5050604080518051600160a060020a03881660009081526011602090815284822092909255601282528381205492820152825160e060020a6366098d4f0281526004810192909252602482018590529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f92604480840193919291829003018186803b151561297857fe5b6102c65a03f4151561298657fe5b5050604080518051600160a060020a03881660009081526012602090815284822092909255600b5492820152825160e060020a6366098d4f0281526004810192909252602482018690529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f92604480840193919291829003018186803b1515612a0857fe5b6102c65a03f41515612a1657fe5b5050604080518051600b55600a546000602092830152825160e060020a6366098d4f0281526004810191909152602481018590529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f926044808201939291829003018186803b1515612a8157fe5b6102c65a03f41515612a8f57fe5b505060405151600a819055600b54612aac92508491849190611afd565b15612ab75760006000fd5b612ac18482612da3565b600654604051600160a060020a039091169083156108fc029084906000818181858888f193505050501515612af65760006000fd5b60408051600160a060020a0386168152602081018490528082018390526fffffffffffffffffffffffffffffffff8516606082015290517f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc433509181900360800190a15b5b50505050565b60005433600160a060020a03908116911614612b7b5760006000fd5b600160a060020a0381161515612b8d57fe5b600f5460ff6101008204811691161115612ba357fe5b612bac81611222565b15612bb357fe5b600e805460018101612bc58382612e27565b916000526020600020900160005b8154600160a060020a0380861661010093840a818102920219909216179092556040805180820182526001808252600f805460ff908116602080860191825260009889526010905294909620925183549451871690950261ff001995151560ff1995861617959095169490941790915582548085169091019093169216919091179055505b5b50565b600060006000600d60019054906101000a900460ff161515612c7e5760006000fd5b600160a060020a03851660009081526014602052604090206001015484108015612cbe5750600160a060020a038516600090815260126020526040902054155b15612cc95760006000fd5b612cd230611b95565b92508260010191505b600f5460ff908116908316101561171257600e805460ff8416908110612cfd57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a031663c12eb19186866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1515612d7e57fe5b6102c65a03f11515612d8c57fe5b5050505b600190910190612cdb565b5b5050505050565b600254604080517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169182916340c10f199160448082019260009290919082900301818387803b1515612e1057fe5b6102c65a03f11515612e1e57fe5b5050505b505050565b81548183558181151161221957600083815260209020612219918101908301612e51565b5b505050565b610e5491905b80821115611e785760008155600101612e57565b5090565b905600a165627a7a723058205e94f15c4184f186b43cc338ee2b12410c3e0cfc35f5f0b58ded6cadf0a5e73100290000000000000000000000000000000000000000000000000000000000000140000000000000000000000000e569b660732efa6a1240636964fd4d55aec8b6fe000000000000000000000000810c6945e6863cf367f2cd636c67c68d097cc2f00000000000000000000000006393895b469896a5b1861c20ac83cfcee15d9b15000000000000000000000000000000000000000000000000000000005a95757c000000000000000000000000000000000000000000000000000000005a95838c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065469657220310000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x606060405236156102a35763ffffffff60e060020a6000350416630226401d81146102b157806303f9c793146102d3578063045b1a0c146102e957806304fc7c6d1461031c578063062b01ce1461037157806306fdde03146103955780630a09284a146104255780630e1d2ec81461044757806313f44d101461046b57806313f4e9771461049b5780631865c57d146104bd57806319b667da146104f15780631a98d0de1461050f5780631aae34601461053157806321d5c0f61461055f578063253ebd921461058b57806325e0671f146105bb5780632c2de40a146105df5780633ad075ea146105f45780634042b66f146106165780634551dd59146106385780634bb278f31461065c57806350c677341461066e578063518ab2a81461068c5780635ed7ca5b146106ae5780636203f09f146106c057806369ea1771146106e25780636e50eb3f146106f757806378b99c241461070c5780637c2e08a3146107385780638507bee81461075c578063895594f6146107825780638da5cb5b146107ab5780639075becf146107d757806397b150ca146108035780639d3c663f14610831578063a6f2ae3a14610861578063a7ba44c31461086b578063af4686821461088f578063af58574a146108b1578063b1cb574b146108e3578063b3f05b97146109e0578063b9b8af0b14610a04578063bd71933614610a28578063bede2cac14610a4c578063bf5fc2ee14610a7b578063c12eb19114610a90578063c24becf314610ab1578063cb16e6d014610add578063cb3e64fd14610b19578063cddaf24114610b2b578063d5d0902114610b40578063d7e64c0014610b64578063e6d04d5e14610b86578063ebdfa45514610bb5578063ef674e6614610bdb578063f2fde38b14610bff578063f3283fba14610c1d578063fc0c546a14610c3b575b6102af5b60006000fd5b565b005b34156102b957fe5b6102c1610c67565b60408051918252519081900360200190f35b6102af600160a060020a0360043516610c6d565b005b34156102f157fe5b610308600160a060020a0360043516602435610c7c565b604080519115158252519081900360200190f35b341561032457fe5b6102af600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610d3f95505050505050565b005b341561037957fe5b610308610dce565b604080519115158252519081900360200190f35b341561039d57fe5b6103a5610e57565b6040805160208082528351818301528351919283929083019185019080838382156103eb575b8051825260208311156103eb57601f1990920191602091820191016103cb565b505050905090810190601f1680156104175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042d57fe5b6102c1610ee5565b60408051918252519081900360200190f35b341561044f57fe5b610308610eeb565b604080519115158252519081900360200190f35b341561047357fe5b610308600160a060020a0360043516610ef4565b604080519115158252519081900360200190f35b34156104a357fe5b6102c1610f67565b60408051918252519081900360200190f35b34156104c557fe5b6104cd610f6d565b604051808260068111156104dd57fe5b60ff16815260200191505060405180910390f35b34156104f957fe5b6102af600160a060020a036004351661110b565b005b341561051757fe5b6102c16111fa565b60408051918252519081900360200190f35b341561053957fe5b6102c1600160a060020a0360043516611201565b60408051918252519081900360200190f35b341561056757fe5b61056f611213565b60408051600160a060020a039092168252519081900360200190f35b341561059357fe5b610308600160a060020a0360043516611222565b604080519115158252519081900360200190f35b34156105c357fe5b610308611244565b604080519115158252519081900360200190f35b34156105e757fe5b6102af6004356112bc565b005b34156105fc57fe5b6102c16113ab565b60408051918252519081900360200190f35b341561061e57fe5b6102c16113b1565b60408051918252519081900360200190f35b341561064057fe5b6103086113b7565b604080519115158252519081900360200190f35b341561066457fe5b6102af6113bd565b005b341561067657fe5b6102af600160a060020a03600435166114b3565b005b341561069457fe5b6102c16115a1565b60408051918252519081900360200190f35b34156106b657fe5b6102af6115a7565b005b34156106c857fe5b6102c16115eb565b60408051918252519081900360200190f35b34156106ea57fe5b6102af6004356115f1565b005b34156106ff57fe5b6102af60043561171b565b005b341561071457fe5b61056f6118f6565b60408051600160a060020a039092168252519081900360200190f35b341561074057fe5b610308611905565b604080519115158252519081900360200190f35b341561076457fe5b61076c611911565b6040805160ff9092168252519081900360200190f35b341561078a57fe5b6102af600160a060020a0360043516602435151560443560643561191f565b005b34156107b357fe5b61056f611acd565b60408051600160a060020a039092168252519081900360200190f35b34156107df57fe5b61056f611adc565b60408051600160a060020a039092168252519081900360200190f35b341561080b57fe5b6102c1600160a060020a0360043516611aeb565b60408051918252519081900360200190f35b341561083957fe5b610308600435602435604435606435611afd565b604080519115158252519081900360200190f35b6102af611b0b565b005b341561087357fe5b610308611b17565b604080519115158252519081900360200190f35b341561089757fe5b6102c1611b8f565b60408051918252519081900360200190f35b34156108b957fe5b61076c600160a060020a0360043516611b95565b6040805160ff9092168252519081900360200190f35b34156108eb57fe5b6102af600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989a998901989297509082019550935083925085019084908082843750949650611bbc95505050505050565b005b34156109e857fe5b610308611ca4565b604080519115158252519081900360200190f35b3415610a0c57fe5b610308611cad565b604080519115158252519081900360200190f35b3415610a3057fe5b610308611cbd565b604080519115158252519081900360200190f35b3415610a5457fe5b61056f600435611e7c565b60408051600160a060020a039092168252519081900360200190f35b3415610a8357fe5b6102af600435611eae565b005b3415610a9857fe5b6102af600160a060020a0360043516602435612083565b005b3415610ab957fe5b61056f61221e565b60408051600160a060020a039092168252519081900360200190f35b3415610ae557fe5b610af9600160a060020a036004351661227e565b604080519315158452602084019290925282820152519081900360600190f35b3415610b2157fe5b6102af6122a3565b005b3415610b3357fe5b6102af6004356122fb565b005b3415610b4857fe5b6103086123ed565b604080519115158252519081900360200190f35b3415610b6c57fe5b6102c16123f9565b60408051918252519081900360200190f35b3415610b8e57fe5b61056f6004356123ff565b60408051600160a060020a039092168252519081900360200190f35b3415610bbd57fe5b61076c612431565b6040805160ff9092168252519081900360200190f35b3415610be357fe5b61030861243a565b604080519115158252519081900360200190f35b3415610c0757fe5b6102af600160a060020a0360043516612448565b005b3415610c2557fe5b6102af600160a060020a03600435166124e0565b005b3415610c4357fe5b61056f61253b565b60408051600160a060020a039092168252519081900360200190f35b60165481565b610c7881600061254a565b5b50565b600d546000908190610100900460ff161515610c9457fe5b50600160a060020a03831660009081526014602090815260408083206002015460128352818420548251840194909452815160e060020a6366098d4f028152600481019490945260248401869052905190928392734d91a9442b7177d9558b44551731e6d4f0a22c76926366098d4f926044808201939291829003018186803b1515610d1c57fe5b6102c65a03f41515610d2a57fe5b505050604051805190501191505b5092915050565b6000805433600160a060020a03908116911614610d5c5760006000fd5b815160009011610d6857fe5b600f5460ff1615610d7557fe5b600f54825161010090910460ff16901115610d8c57fe5b5060005b81518160ff161015610dc857610dbf828260ff16815181101515610db057fe5b90602001906020020151612b5f565b5b600101610d90565b5b5b5050565b600354604080516000602091820181905282517f8e768288000000000000000000000000000000000000000000000000000000008152600160a060020a033081166004830152935191949390931692638e76828892602480830193919282900301818787803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610edd5780601f10610eb257610100808354040283529160200191610edd565b820191906000526020600020905b815481529060010190602001808311610ec057829003601f168201915b505050505081565b60095481565b60135460ff1681565b6000805b601554811015610f5c5782600160a060020a0316601582815481101515610f1b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610f535760019150610f61565b5b600101610ef8565b600091505b50919050565b60075481565b600d5460009060ff1615610f8357506006610e54565b600454600160a060020a03161515610f9d57506001610e54565b600460009054906101000a9004600160a060020a0316600160a060020a03166382771c8e6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610ff857fe5b6102c65a03f1151561100657fe5b5050604051511515905061101c57506001610e54565b600354604080516000602091820181905282517f8e768288000000000000000000000000000000000000000000000000000000008152600160a060020a03308116600483015293519390941693638e768288936024808301949391928390030190829087803b151561108a57fe5b6102c65a03f1151561109857fe5b505060405151151590506110ae57506001610e54565b6008544210156110c057506002610e54565b60095442111580156110d757506110d56123ed565b155b156110e457506003610e54565b6110ec611905565b156110f957506004610e54565b506005610e54565b5b5b5b5b5b5b5b90565b60005433600160a060020a039081169116146111275760006000fd5b600160a060020a038116151561113957fe5b600454600160a060020a03161561114c57fe5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117808355604080516000602091820181905282517f614cb9040000000000000000000000000000000000000000000000000000000081529251939094169463614cb9049483820194929383900390910190829087803b15156111d357fe5b6102c65a03f115156111e157fe5b50506040515115159050610c785760006000fd5b5b5b50565b6015545b90565b60116020526000908152604090205481565b600454600160a060020a031681565b600160a060020a03811660009081526010602052604090205460ff165b919050565b6000600460009054906101000a9004600160a060020a0316600160a060020a031663f9cb6d7a6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b6000805433600160a060020a039081169116146112d95760006000fd5b600d5460ff16156112e657fe5b60135460ff1615156112f457fe5b60085442111561130057fe5b61130861221e565b905080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561135057fe5b6102c65a03f1151561135e57fe5b50506040515115905061136d57fe5b60178290556040805183815290517f7df545c7a1df0d2a1ba979e94124b026facab86a15ed46b6b4a732d995f9e1829181900360200190a15b5b5050565b60175481565b600b5481565b60015b90565b6004805b6113c9610f6d565b60068111156113d457fe5b146113df5760006000fd5b60005433600160a060020a039081169116146113fb5760006000fd5b60005460a060020a900460ff16156114135760006000fd5b600d5460ff16156114245760006000fd5b600454600160a060020a03161561149f5760048054604080517f0bf318a30000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692630bf318a392828201926000929082900301818387803b151561148d57fe5b6102c65a03f1151561149b57fe5b5050505b600d805460ff191660011790555b5b5b5b50565b60005433600160a060020a039081169116146114cf5760006000fd5b600160a060020a03811615156114e157fe5b600354600160a060020a0316156114f457fe5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038381169190911791829055604080516000602091820181905282517f04bbc255000000000000000000000000000000000000000000000000000000008152925194909316936304bbc255936004808501948390030190829087803b15156111d357fe5b6102c65a03f115156111e157fe5b50506040515115159050610c785760006000fd5b5b5b50565b600a5481565b60005433600160a060020a039081169116146115c35760006000fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015481565b6000805433600160a060020a0390811691161461160e5760006000fd5b600d5460ff161561161b57fe5b60135460ff16151561162957fe5b60085442111561163557fe5b61163d61221e565b905080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561168557fe5b6102c65a03f1151561169357fe5b5050604051511590506116a257fe5b600354604080517f69ea1771000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916369ea17719160248082019260009290919082900301818387803b151561170457fe5b6102c65a03f1151561171257fe5b5050505b5b5050565b6000805481908190819033600160a060020a0390811691161461173e5760006000fd5b600d5460ff161561174b57fe5b60135460ff16151561175957fe5b428590111561176457fe5b6008548590111561177157fe5b60095442111561177d57fe5b61178561221e565b935083600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b15156117cd57fe5b6102c65a03f115156117db57fe5b5050604051511590506117ee5760006000fd5b6117f730611b95565b92508260010191505b600f5460ff90811690831610156118b557600e805460ff841690811061182257fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a031663af4686826000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561188a57fe5b6102c65a03f1151561189857fe5b50506040515186111590506118a957fe5b5b600190910190611800565b60098590556040805186815290517fd34bb772c4ae9baa99db852f622773b31c7827e8ee818449fef20d30980bd3109181900360200190a15b5b5050505050565b600354600160a060020a031681565b600754600b5410155b90565b600f54610100900460ff1681565b60005433600160a060020a0390811691161461193b5760006000fd5b600d54610100900460ff1615156119525760006000fd5b600160a060020a038416151561196457fe5b6000811161196e57fe5b8082111561197857fe5b60095442111561198457fe5b61198d84610ef4565b1515611a225760158054600181016119a58382612e27565b916000526020600020900160005b8154600160a060020a038089166101009390930a8381029102199091161790915560408051918252851515602083015281810185905260608201849052517fc03e2cbfed65ba7e1df8d32da4afaccb75208d8a6b188f67800ceb19cb9d526492509081900360800190a1611a74565b60408051600160a060020a038616815284151560208201528082018490526060810183905290517f618943c36e69f6b3bae8b5bc48231e8911852a0c844743af41be110450a2a58f9181900360800190a15b6040805160608101825284151581526020808201858152828401858152600160a060020a03891660009081526014909352939091209151825460ff191690151517825551600182015590516002909101555b5b50505050565b600054600160a060020a031681565b600654600160a060020a031681565b60126020526000908152604090205481565b60175481115b949350505050565b6102ad33610c6d565b5b565b6000600460009054906101000a9004600160a060020a0316600160a060020a03166382771c8e6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515610e3c57fe5b6102c65a03f11515610e4a57fe5b5050604051519150505b90565b60085481565b600160a060020a038116600090815260106020526040902054610100900460ff165b919050565b6000805433600160a060020a03908116911614611bd95760006000fd5b600d54610100900460ff161515611bf05760006000fd5b600954421115611bfc57fe5b8351855114611c0757fe5b8251845114611c1257fe5b8151835114611c1d57fe5b5060005b845181101561171257611c928582815181101515611c3b57fe5b906020019060200201518583815181101515611c5357fe5b906020019060200201518584815181101515611c6b57fe5b906020019060200201518585815181101515611c8357fe5b9060200190602002015161191f565b5b600101611c21565b5b5b5050505050565b600d5460ff1681565b60005460a060020a900460ff1681565b60006000611cc961221e565b905060045b81600160a060020a0316631865c57d6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611d1457fe5b6102c65a03f11515611d2257fe5b50506040515190506006811115611d3557fe5b148015611d9b575080600160a060020a031663b9b8af0b6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611d8357fe5b6102c65a03f11515611d9157fe5b5050604051511590505b8015611e00575080600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611de857fe5b6102c65a03f11515611df657fe5b5050604051511590505b8015611e65575080600160a060020a03166325e0671f6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611e4d57fe5b6102c65a03f11515611e5b57fe5b5050604051511590505b15611e735760019150611e78565b600091505b5090565b600e805482908110611e8a57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b6000805481908190819033600160a060020a03908116911614611ed15760006000fd5b600d5460ff1615611ede57fe5b60135460ff161515611eec57fe5b4285901115611ef757fe5b600954851115611f0357fe5b600854421115611f0f57fe5b611f1761221e565b935083600160a060020a031663b3f05b976000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b1515611f5f57fe5b6102c65a03f11515611f6d57fe5b505060405151159050611f805760006000fd5b611f8930611b95565b9250600091505b8260ff168260ff16101561204257600e805460ff8416908110611faf57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a0316630a09284a6000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561201757fe5b6102c65a03f1151561202557fe5b505060405151861015905061203657fe5b5b600190910190611f90565b60088590556040805186815290517fa3f2a813a039e5195c620dabcd490267a9aa5a50e4e1383bc474e9b800f7defe9181900360200190a15b5b5050505050565b600d54600090610100900460ff16151561209d5760006000fd5b600160a060020a03831615156120af57fe5b6009544211156120bb57fe5b6120c433611222565b15156120cc57fe5b600160a060020a0383166000908152601460205260409020600101548210801561210c5750600160a060020a038316600090815260126020526040902054155b156121175760006000fd5b50600160a060020a038216600090815260146020908152604080832060020154815183019390935280517ff4f3bdc100000000000000000000000000000000000000000000000000000000815260048101849052602481018590529051734d91a9442b7177d9558b44551731e6d4f0a22c769263f4f3bdc19260448082019391829003018186803b15156121a757fe5b6102c65a03f415156121b557fe5b5050604080518051606082018352600160a060020a038716600081815260146020818152868320805460ff811615158852828801858152988801878152959094529190529351151560ff199091161783559251600183015591516002909101559150505b505050565b600f5460009060ff168190111561227257600f54600e8054909160001960ff918216011690811061224b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03169050610e54565b506000610e54565b5b90565b60146020526000908152604090208054600182015460029092015460ff909116919083565b60005433600160a060020a039081169116146122bf5760006000fd5b60005460a060020a900460ff1615156122d85760006000fd5b6000805474ff0000000000000000000000000000000000000000191690555b5b5b565b6004805b612307610f6d565b600681111561231257fe5b1461231d5760006000fd5b60005433600160a060020a039081169116146123395760006000fd5b60005460a060020a900460ff16156123515760006000fd5b600d5460ff16156123625760006000fd5b600454600160a060020a031615610dc85760048054604080517fcddaf24100000000000000000000000000000000000000000000000000000000815292830185905251600160a060020a039091169163cddaf24191602480830192600092919082900301818387803b151561170457fe5b6102c65a03f1151561171257fe5b5050505b5b5b5b5b5050565b601754600a5410155b90565b600c5481565b6015805482908110611e8a57fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600f5460ff1681565b600d54610100900460ff1681565b60005433600160a060020a039081169116146124645760006000fd5b600160a060020a038116151561247a5760006000fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60005433600160a060020a039081169116146124fc5760006000fd5b600154600c54111561250e5760006000fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600254600160a060020a031681565b60008054819060a060020a900460ff16156125655760006000fd5b60025b612570610f6d565b600681111561257b57fe5b14156125875760006000fd5b60035b612592610f6d565b600681111561259d57fe5b14156102a757600d54610100900460ff16156125db57600160a060020a03841660009081526014602052604090205460ff1615156125db5760006000fd5b5b6125e7565b60006000fd5b5b349150600360009054906101000a9004600160a060020a0316600160a060020a03166318a4155e83600b54600a5433600260009054906101000a9004600160a060020a0316600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561267257fe5b6102c65a03f1151561268057fe5b505050604051805190506000604051602001526040518663ffffffff1660e060020a0281526004018086815260200185815260200184815260200183600160a060020a0316600160a060020a0316815260200182815260200195505050505050602060405180830381600087803b15156126f657fe5b6102c65a03f1151561270457fe5b50506040515191505080151561271a5760006000fd5b600d54610100900460ff161561279957600160a060020a0384166000908152601460205260409020600101548110801561276a5750600160a060020a038416600090815260126020526040902054155b156127755760006000fd5b61277f8482610c7c565b1561278a5760006000fd5b6127948482612c5c565b612842565b600254604080516000602091820181905282517f3fa615b00000000000000000000000000000000000000000000000000000000081529251600160a060020a0390941693633fa615b09360048082019493918390030190829087803b15156127fd57fe5b6102c65a03f1151561280b57fe5b5050604051518210905080156128375750600160a060020a038416600090815260126020526040902054155b156128425760006000fd5b5b600160a060020a038416600090815260116020526040902054151561286c57600c805460010190555b600160a060020a0384166000908152601160209081526040808320548151830193909352805160e060020a6366098d4f02815260048101939093526024830185905251734d91a9442b7177d9558b44551731e6d4f0a22c76926366098d4f926044808301939192829003018186803b15156128e357fe5b6102c65a03f415156128f157fe5b5050604080518051600160a060020a03881660009081526011602090815284822092909255601282528381205492820152825160e060020a6366098d4f0281526004810192909252602482018590529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f92604480840193919291829003018186803b151561297857fe5b6102c65a03f4151561298657fe5b5050604080518051600160a060020a03881660009081526012602090815284822092909255600b5492820152825160e060020a6366098d4f0281526004810192909252602482018690529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f92604480840193919291829003018186803b1515612a0857fe5b6102c65a03f41515612a1657fe5b5050604080518051600b55600a546000602092830152825160e060020a6366098d4f0281526004810191909152602481018590529151734d91a9442b7177d9558b44551731e6d4f0a22c7693506366098d4f926044808201939291829003018186803b1515612a8157fe5b6102c65a03f41515612a8f57fe5b505060405151600a819055600b54612aac92508491849190611afd565b15612ab75760006000fd5b612ac18482612da3565b600654604051600160a060020a039091169083156108fc029084906000818181858888f193505050501515612af65760006000fd5b60408051600160a060020a0386168152602081018490528082018390526fffffffffffffffffffffffffffffffff8516606082015290517f0396f60aaad038749091d273dc13aaabc63db6e2271c7bad442d5cf25cc433509181900360800190a15b5b50505050565b60005433600160a060020a03908116911614612b7b5760006000fd5b600160a060020a0381161515612b8d57fe5b600f5460ff6101008204811691161115612ba357fe5b612bac81611222565b15612bb357fe5b600e805460018101612bc58382612e27565b916000526020600020900160005b8154600160a060020a0380861661010093840a818102920219909216179092556040805180820182526001808252600f805460ff908116602080860191825260009889526010905294909620925183549451871690950261ff001995151560ff1995861617959095169490941790915582548085169091019093169216919091179055505b5b50565b600060006000600d60019054906101000a900460ff161515612c7e5760006000fd5b600160a060020a03851660009081526014602052604090206001015484108015612cbe5750600160a060020a038516600090815260126020526040902054155b15612cc95760006000fd5b612cd230611b95565b92508260010191505b600f5460ff908116908316101561171257600e805460ff8416908110612cfd57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316905080600160a060020a031663c12eb19186866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1515612d7e57fe5b6102c65a03f11515612d8c57fe5b5050505b600190910190612cdb565b5b5050505050565b600254604080517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169182916340c10f199160448082019260009290919082900301818387803b1515612e1057fe5b6102c65a03f11515612e1e57fe5b5050505b505050565b81548183558181151161221957600083815260209020612219918101908301612e51565b5b505050565b610e5491905b80821115611e785760008155600101612e57565b5090565b905600a165627a7a723058205e94f15c4184f186b43cc338ee2b12410c3e0cfc35f5f0b58ded6cadf0a5e7310029

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

0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000e569b660732efa6a1240636964fd4d55aec8b6fe000000000000000000000000810c6945e6863cf367f2cd636c67c68d097cc2f00000000000000000000000006393895b469896a5b1861c20ac83cfcee15d9b15000000000000000000000000000000000000000000000000000000005a95757c000000000000000000000000000000000000000000000000000000005a95838c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065469657220310000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Tier 1
Arg [1] : _token (address): 0xe569B660732EFa6a1240636964fd4d55AeC8B6FE
Arg [2] : _pricingStrategy (address): 0x810c6945E6863cf367F2cd636c67C68D097Cc2f0
Arg [3] : _multisigWallet (address): 0x6393895B469896a5B1861c20AC83cFCEe15D9b15
Arg [4] : _start (uint256): 1519744380
Arg [5] : _end (uint256): 1519747980
Arg [6] : _minimumFundingGoal (uint256): 0
Arg [7] : _maximumSellableTokens (uint256): 1000000000000000000000
Arg [8] : _isUpdatable (bool): False
Arg [9] : _isWhiteListed (bool): False

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 000000000000000000000000e569b660732efa6a1240636964fd4d55aec8b6fe
Arg [2] : 000000000000000000000000810c6945e6863cf367f2cd636c67c68d097cc2f0
Arg [3] : 0000000000000000000000006393895b469896a5b1861c20ac83cfcee15d9b15
Arg [4] : 000000000000000000000000000000000000000000000000000000005a95757c
Arg [5] : 000000000000000000000000000000000000000000000000000000005a95838c
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 00000000000000000000000000000000000000000000003635c9adc5dea00000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [11] : 5469657220310000000000000000000000000000000000000000000000000000


Libraries Used


Swarm Source

bzzr://5e94f15c4184f186b43cc338ee2b12410c3e0cfc35f5f0b58ded6cadf0a5e731
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.