Contract 0x899f3b22908ff5674f8237c321ab309417887606

 

TxHash Block Age From To Value [TxFee]
0x2c85a3d8b272e4f40fcd4edc6b02b57763c2767389e07a0f7bc747c9097495d8717500218 days 3 hrs ago0x2bea34f39dd897f81a19aa79b685d81af82ef7e4 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000099592
0xf6c45b8f4ebd5e4b60a7763e7f7a91e37295196e7412a5411acd700651f4fb4f717500218 days 3 hrs ago0x0200242bbf8cf53b6ad5c0e90fde0000a6fd5f39 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000098312
0xb552803f293af7ff6c9fa57120e7db55c7751153e34a995547692da4cdaa84e8717498518 days 4 hrs ago0x2bea34f39dd897f81a19aa79b685d81af82ef7e4 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000309478
0x17e641b8c6144c6d116077b08d132bed1569d8325f4512d9d35b8f7aa518239b717498318 days 4 hrs ago0x0200242bbf8cf53b6ad5c0e90fde0000a6fd5f39 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000308454
0xd2c4af3e457399574d73c35177409ed9d0613b1df651f9d55e72dd64eecd93e3716207620 days 19 hrs ago0x3c5d3f0ef2a48379a80b934bfdae3f7e14da7d6f IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000148044
0x05e7a95f50d7f1b75f1978ce15589eaf26d46c06f3cf7fd7fa92c2de6f9db03a716206420 days 19 hrs ago0x3c5d3f0ef2a48379a80b934bfdae3f7e14da7d6f IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000464409
0xebe9f04722b69f2f638ed47e1a64045d9cc3c7761efaaab89d0232c8f8c50064716006821 days 4 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000245406
0x44a3194c4494dc0c8daf3222ae45b0f9290fb25e49d0b07740fafcdda7660a85716006121 days 5 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000245406
0xb9eb4193ccb003d2113d344a464c57147c9a34b29b3956b0ef2bbd4a7487b96a715079523 days 2 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000245022
0x8513f95b888850907cc98ab98bce059c06e889142972949e3f51b1d7e819d3c4715076423 days 2 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000245406
0x5276eb3113d829543cd0cf7fddc8f3abe6efd92f70674a66ec04f33bd8558c406625930113 days 2 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000214936
0xb60ddb061c7265c5db554296a5f7c8389096d95a9eca073824313b543b55be036625861113 days 3 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000563712
0xa79e2d456680525f5b688008796ea726555fddfb6b1e8c5c70434bd76cef346a6618821114 days 6 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.0005888
0x3ff54016e81abe70adc95818e15da73d84ec9b2946aa89f613ef30bcafdcc3e06613620115 days 3 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.0005888
0x8d7ecce08081ca9a84099fe8dc5713a3f3e3bbddd91756b5e3d045db48e598b56613569115 days 3 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000563712
0xd43126cc611b88326c69acb22592985678e7acef13e83016959c88c2200a82546272156171 days 4 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00036276
0xfe33aa154a23c6a7a26e6507b97b96f782b8186185f1d5a2b7217637e5b52d876272134171 days 4 hrs ago0xcb23dc840271c26ad9ec3588dbfc2c7f6e730641 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000981624
0x157a7fa03c7ebe9f889b33f9cc9e80ce9c8f96b692967b878a8e7ba2f582fae76224644179 days 4 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000793544
0xa6da98dff33f09e3d8812821e77323670f0097197fe018c86a771416ecc2551e6206123182 days 7 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00024802
0xe450099aa7f71c8ed5da35091ecbd53ae4f22677f15c95f91eec5f6c4113f4426206112182 days 7 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000773375
0xbcdf0fa0ac0d960b720e07482f70a7cfb6e323a245b8f4f96b0478bb2e6260c16206101182 days 7 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00049604
0x60706213d60355b835ba4f7e4820c734e0b5a7c14b3c7c949ff51095598e312b6206084182 days 7 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00154675
0x959db501a0a8ce04b9c471774a506ff9b964094c3e255b711ed24df6743b58776205877182 days 8 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.00099208
0xa7718f8bf22d0bce13090662900eecd40d49dc4f52782552ebc73d3536f591596205855182 days 8 hrs ago0xe324e9320c42f4f55de0b1ef3f5a60029023430e IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.003815675
0x179ec257731a3407064ee4585226258930850a68356f693a8f7ea68a5b622a506196786183 days 21 hrs ago0xf31930014f57b93496f967698f92b2430c62fc43 IN  0x899f3b22908ff5674f8237c321ab3094178876060 Ether0.000683712
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: Atonomi
Compiler Version: v0.4.23+commit.124ca40d
Optimization Enabled: No
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.23;

// File: zeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @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() public {
    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) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: zeppelin-solidity/contracts/lifecycle/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

// File: zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

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

// File: zeppelin-solidity/contracts/lifecycle/TokenDestructible.sol

/**
 * @title TokenDestructible:
 * @author Remco Bloemen <[email protected]π.com>
 * @dev Base contract that can be destroyed by owner. All funds in contract including
 * listed tokens will be sent to the owner.
 */
contract TokenDestructible is Ownable {

  function TokenDestructible() public payable { }

  /**
   * @notice Terminate contract and refund to owner
   * @param tokens List of addresses of ERC20 or ERC20Basic token contracts to
   refund.
   * @notice The called token contracts could try to re-enter this contract. Only
   supply token contracts you trust.
   */
  function destroy(address[] tokens) onlyOwner public {

    // Transfer tokens to owner
    for (uint256 i = 0; i < tokens.length; i++) {
      ERC20Basic token = ERC20Basic(tokens[i]);
      uint256 balance = token.balanceOf(this);
      token.transfer(owner, balance);
    }

    // Transfer Eth to owner and terminate contract
    selfdestruct(owner);
  }
}

// File: contracts/Atonomi.sol

// solhint-disable-line




/// @title ERC-20 Token Standard
/// @author Fabian Vogelsteller <[email protected]>, Vitalik Buterin <[email protected]>
/// @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
interface ERC20Interface {
    function decimals() public constant returns (uint8);
    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);   // solhint-disable-line
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}


/// @title Safe Math library
/// @dev Math operations with safety checks that throw on error
/// @dev https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol
library SafeMath {
    /// @dev Multiplies two numbers, throws on overflow.
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    /// @dev Integer division of two numbers, truncating the quotient.
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /// @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /// @dev Adds two numbers, throws on overflow.
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}


/// @dev Interface for the Network Settings contract
interface SettingsInterface {
    function registrationFee() external view returns (uint256);
    function activationFee() external view returns (uint256);
    function defaultReputationReward() external view returns (uint256);
    function reputationIRNNodeShare() external view returns (uint256);
    function blockThreshold() external view returns (uint256);
}


/// @title Atonomi Smart Contract
/// @author Atonomi
/// @notice Governs the activation, registration, and reputation of devices on the Atonomi network
/// @dev Ownable: Owner governs the access of Atonomi Admins, Fees, and Rewards on the network
/// @dev Pausable: Gives ability for Owner to pull emergency stop to prevent actions on the network
/// @dev TokenDestructible: Gives owner ability to kill the contract and extract funds to a new contract
contract Atonomi is Pausable, TokenDestructible {
    using SafeMath for uint256;

    /// @title ATMI Token
    /// @notice Standard ERC20 Token
    /// @dev AMLToken source: https://github.com/TokenMarketNet/ico/blob/master/contracts/AMLToken.sol
    ERC20Interface public token;

    /// @title Network Settings
    /// @notice Atonomi Owner controlled settings are governed in this contract
    SettingsInterface public settings;

    ///
    /// STORAGE MAPPINGS 
    ///
    /// @title Atonomi Devices registry
    /// @notice Contains all devices participating in the Atonomi Network
    /// @dev Key is a keccak256 hash of the device id
    /// @dev Value is a struct that contains the device status and metadata
    mapping (bytes32 => Device) public devices;

    /// @title Atonomi Participant whitelist
    /// @notice Contains all the network participants
    /// @dev Atonomi Admins: Govern the access to manufacturers and IRN Nodes on the network
    /// @dev IRN Nodes: Governs reputation score data of devices
    /// @dev Manufacturers: Governs devices on the network
    /// @dev Key is ethereum account of the participant
    /// @dev Value is a struct that contains the role of the participant
    mapping (address => NetworkMember) public network;

    /// @title Token Pools
    /// @notice each manufacturer will manage a pool of tokens for reputation rewards
    /// @dev Key is ethereum account for pool owner
    /// @dev Value is struct representing token pool attributes
    /// @dev incoming tokens will come from registrations, activations, or public donations
    /// @dev outgoing tokens will come from reputation rewards
    mapping (address => TokenPool) public pools;

    /// @title Reward Balances
    /// @notice balances of rewards that are able to be claimed by participants
    /// @dev Key is ethereum account of the owner of the tokens
    /// @dev Value is tokens available for withdraw
    mapping (address => uint256) public rewards;

    /// @title Lookup by Manufacturer ID the wallet for reputation rewards
    /// @dev Key is the manufacturer id
    /// @dev Value is ethereum account to be rewarded
    mapping (bytes32 => address) public manufacturerRewards;

    /// @title Track last write by reputation author
    /// @dev First key is the ethereum address of the reputation author
    /// @dev Second key is the device id
    /// @dev Value is the block number of the last time the author has submitted a score for the device
    mapping (address => mapping (bytes32 => uint256)) public authorWrites;

    /// @title Default Repuration score for manufacturers
    /// @dev Key is the manufacturer id
    /// @dev value is the score to use for newly registered devices
    mapping (bytes32 => bytes32) public defaultManufacturerReputations;

    ///
    /// TYPES 
    ///
    /// @title Atonomi Device
    /// @notice Contains the device state on the Atonomi network
    /// @dev manufacturerId is the manufacturer the device belongs to
    /// @dev deviceType is the type of device categorized by the manufacturer
    /// @dev registered is true when device is registered, otherwise false
    /// @dev activated is true when device is activated, otherwise false
    /// @dev reputationScore is official Atonomi Reputation score for the device
    /// @dev devicePublicKey is public key used by IRN Nodes for validation
    struct Device {
        bytes32 manufacturerId;
        bytes32 deviceType;
        bool registered;
        bool activated;
        bytes32 reputationScore;
        bytes32 devicePublicKey;
    }

    /// @title Token Pool
    /// @notice Contains balance and reputation reward amounts for each token pool
    /// @dev balance is total amount of tokens available in the pool
    /// @dev rewardAmount is the total amount distributed between the manufacturer and reputation author
    struct TokenPool {
        uint256 balance;
        uint256 rewardAmount;
    }

    /// @title Atonomi Network Participant
    /// @notice Contains role information for a participant
    /// @dev isIRNAdmin is true if participant is an IRN Admin, otherwise false
    /// @dev isManufacturer is true if participant is a Manufacturer, otherwise false
    /// @dev isIRNNode is true if participant is an IRN Node, otherwise false
    /// @dev memberId is the manufacturer id, for all other participants this will be 0
    struct NetworkMember {
        bool isIRNAdmin;
        bool isManufacturer;
        bool isIRNNode;
        bytes32 memberId;
    }

    ///
    /// MODIFIERS
    ///
    /// @notice only manufacturers can call, otherwise throw
    modifier onlyManufacturer() {
        require(network[msg.sender].isManufacturer, "must be a manufacturer");
        _;
    }

    /// @notice only IRNAdmins or Owner can call, otherwise throw
    modifier onlyIRNorOwner() {
        require(msg.sender == owner || network[msg.sender].isIRNAdmin, "must be owner or an irn admin");
        _;
    }

    /// @notice only IRN Nodes can call, otherwise throw
    modifier onlyIRNNode() {
        require(network[msg.sender].isIRNNode, "must be an irn node");
        _;
    }

    /// @notice Constructor sets the ERC Token contract and initial values for network fees
    /// @param _token is the Atonomi Token contract address (must be ERC20)
    /// @param _settings is the Atonomi Network Settings contract address
    constructor (
        address _token,
        address _settings) public {
        require(_token != address(0), "token address cannot be 0x0");
        require(_settings != address(0), "settings address cannot be 0x0");
        token = ERC20Interface(_token);
        settings = SettingsInterface(_settings);
    }

    ///
    /// EVENTS 
    ///
    /// @notice emitted on successful device registration
    /// @param _sender manufacturer paying for registration
    /// @param _fee registration fee paid by manufacturer
    /// @param _deviceHashKey keccak256 hash of device id used as the key in devices mapping
    /// @param _manufacturerId of the manufacturer the device belongs to
    /// @param _deviceType is the type of device categorized by the manufacturer
    event DeviceRegistered(
        address indexed _sender,
        uint256 _fee,
        bytes32 indexed _deviceHashKey,
        bytes32 indexed _manufacturerId,
        bytes32 _deviceType
    );

    /// @notice emitted on successful device activation
    /// @param _sender manufacturer or device owner paying for activation
    /// @param _fee registration fee paid by manufacturer
    /// @param _deviceId the real device id (only revealed after activation)
    /// @param _manufacturerId of the manufacturer the device belongs to
    /// @param _deviceType is the type of device categorized by the manufacturer
    event DeviceActivated(
        address indexed _sender,
        uint256 _fee,
        bytes32 indexed _deviceId,
        bytes32 indexed _manufacturerId,
        bytes32 _deviceType
    );

    /// @notice emitted on reputation change for a device
    /// @param _deviceId device id of the target device
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @param _newScore updated reputation score
    /// @param _irnNode IRN node submitting the new reputation
    /// @param _irnReward tokens awarded to irn node
    /// @param _manufacturerWallet manufacturer associated with the device is rewared a share of tokens
    /// @param _manufacturerReward tokens awarded to contributor
    event ReputationScoreUpdated(
        bytes32 indexed _deviceId,
        bytes32 _deviceType,
        bytes32 _newScore,
        address indexed _irnNode,
        uint256 _irnReward,
        address indexed _manufacturerWallet,
        uint256 _manufacturerReward
    );

    /// @notice emitted on successful addition of network member address
    /// @param _sender ethereum account of participant that made the change
    /// @param _member address of added member
    /// @param _memberId manufacturer id for manufacturer, otherwise 0x0
    event NetworkMemberAdded(
        address indexed _sender,
        address indexed _member,
        bytes32 indexed _memberId
    );

    /// @notice emitted on successful removal of network member address
    /// @param _sender ethereum account of participant that made the change
    /// @param _member address of removed member
    /// @param _memberId manufacturer id for manufacturer, otherwise 0x0
    event NetworkMemberRemoved(
        address indexed _sender,
        address indexed _member,
        bytes32 indexed _memberId
    );

    /// @notice emitted everytime a manufacturer changes their wallet for rewards
    /// @param _old ethereum account
    /// @param _new ethereum account
    /// @param _manufacturerId that the member belongs to
    event ManufacturerRewardWalletChanged(
        address indexed _old,
        address indexed _new,
        bytes32 indexed _manufacturerId
    );

    /// @notice emitted everytime a token pool reward amount changes
    /// @param _sender ethereum account of the token pool owner
    /// @param _newReward new reward value in ATMI tokens
    event TokenPoolRewardUpdated(
        address indexed _sender,
        uint256 _newReward
    );

    /// @notice emitted everytime someone donates tokens to a manufacturer
    /// @param _sender ethereum account of the donater
    /// @param _manufacturerId of the manufacturer
    /// @param _manufacturer ethereum account
    /// @param _amount of tokens deposited
    event TokensDeposited(
        address indexed _sender,
        bytes32 indexed _manufacturerId,
        address indexed _manufacturer,
        uint256 _amount
    );
    
    /// @notice emitted everytime a participant withdraws from token pool
    /// @param _sender ethereum account of participant that made the change
    /// @param _amount tokens withdrawn
    event TokensWithdrawn(
        address indexed _sender,
        uint256 _amount
    );

    /// @notice emitted everytime the default reputation for a manufacturer changes
    /// @param _sender ethereum account of participant that made the change
    /// @param _manufacturerId of the manufacturer
    /// @param _newDefaultScore to use for newly registered devices
    event DefaultReputationScoreChanged(
        address indexed _sender,
        bytes32 indexed _manufacturerId,
        bytes32 _newDefaultScore
    );

    ///
    /// DEVICE ONBOARDING
    ///
    /// @notice registers device on the Atonomi network
    /// @param _deviceIdHash keccak256 hash of the device's id (needs to be hashed by caller)
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @dev devicePublicKey is public key used by IRN Nodes for validation
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerDevice(
        bytes32 _deviceIdHash,
        bytes32 _deviceType,
        bytes32 _devicePublicKey)
        public onlyManufacturer whenNotPaused returns (bool)
    {
        uint256 registrationFee = settings.registrationFee();
        Device memory d = _registerDevice(msg.sender, _deviceIdHash, _deviceType, _devicePublicKey);
        emit DeviceRegistered(
            msg.sender,
            registrationFee,
            _deviceIdHash,
            d.manufacturerId,
            _deviceType);
        _depositTokens(msg.sender, registrationFee);
        require(token.transferFrom(msg.sender, address(this), registrationFee), "transferFrom failed");
        return true;
    }

    /// @notice Activates the device
    /// @param _deviceId id of the real device id to be activated (not the hash of the device id)
    /// @return true if successful, otherwise false
    /// @dev if the hash doesnt match, the device is considered not registered and will throw
    /// @dev anyone with the device id (in hand) is considered the device owner
    /// @dev tokens will be deducted from the device owner and added to the token pool
    /// @dev owner has ability to pause this operation
    function activateDevice(bytes32 _deviceId) public whenNotPaused returns (bool) {
        uint256 activationFee = settings.activationFee();
        Device memory d = _activateDevice(_deviceId);
        emit DeviceActivated(msg.sender, activationFee, _deviceId, d.manufacturerId, d.deviceType);
        address manufacturer = manufacturerRewards[d.manufacturerId];
        require(manufacturer != address(this), "manufacturer is unknown");
        _depositTokens(manufacturer, activationFee);
        require(token.transferFrom(msg.sender, address(this), activationFee), "transferFrom failed");
        return true;
    }

    /// @notice Registers and immediately activates device, used by manufacturers to prepay activation
    /// @param _deviceId id of the real device id to be activated (not the has of the device id)
    /// @param _deviceType is the type of device categorized by the manufacturer
    /// @return true if successful, otherwise false
    /// @dev since the manufacturer is trusted, no need for the caller to hash the device id
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerAndActivateDevice(
        bytes32 _deviceId,
        bytes32 _deviceType,
        bytes32 _devicePublicKey) 
        public onlyManufacturer whenNotPaused returns (bool)
    {
        uint256 registrationFee = settings.registrationFee();
        uint256 activationFee = settings.activationFee();

        bytes32 deviceIdHash = keccak256(_deviceId);
        Device memory d = _registerDevice(msg.sender, deviceIdHash, _deviceType, _devicePublicKey);
        bytes32 manufacturerId = d.manufacturerId;
        emit DeviceRegistered(msg.sender, registrationFee, deviceIdHash, manufacturerId, _deviceType);

        d = _activateDevice(_deviceId);
        emit DeviceActivated(msg.sender, activationFee, _deviceId, manufacturerId, _deviceType);

        uint256 fee = registrationFee.add(activationFee);
        _depositTokens(msg.sender, fee);
        require(token.transferFrom(msg.sender, address(this), fee), "transferFrom failed");
        return true;
    }

    ///
    /// REPUTATION MANAGEMENT
    ///
    /// @notice updates reputation for a device
    /// @param _deviceId target device Id
    /// @param _reputationScore updated reputation score computed by the author
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the reputation author (either irn node or the reputation auditor)
    /// @dev tokens will be deducted from the contract pool
    /// @dev author and manufacturer will be rewarded a split of the tokens
    /// @dev owner has ability to pause this operation
    function updateReputationScore(
        bytes32 _deviceId,
        bytes32 _reputationScore)
        public onlyIRNNode whenNotPaused returns (bool)
    {
        Device memory d = _updateReputationScore(_deviceId, _reputationScore);

        address _manufacturerWallet = manufacturerRewards[d.manufacturerId];
        require(_manufacturerWallet != address(0), "_manufacturerWallet cannot be 0x0");
        require(_manufacturerWallet != msg.sender, "manufacturers cannot collect the full reward");

        uint256 irnReward;
        uint256 manufacturerReward;
        (irnReward, manufacturerReward) = getReputationRewards(msg.sender, _manufacturerWallet, _deviceId);
        _distributeRewards(_manufacturerWallet, msg.sender, irnReward);
        _distributeRewards(_manufacturerWallet, _manufacturerWallet, manufacturerReward);
        emit ReputationScoreUpdated(
            _deviceId,
            d.deviceType,
            _reputationScore,
            msg.sender,
            irnReward,
            _manufacturerWallet,
            manufacturerReward);
        authorWrites[msg.sender][_deviceId] = block.number;
        return true;
    }

    /// @notice computes the portion of the reputation reward allotted to the manufacturer and author
    /// @param author is the reputation node submitting the score
    /// @param manufacturer is the token pool owner
    /// @param deviceId of the device being updated
    /// @return irnReward and manufacturerReward
    function getReputationRewards(
        address author,
        address manufacturer,
        bytes32 deviceId)
        public view returns (uint256 irnReward, uint256 manufacturerReward)
    {
        uint256 lastWrite = authorWrites[author][deviceId];
        uint256 blocks = 0;
        if (lastWrite > 0) {
            blocks = block.number.sub(lastWrite);
        }
        uint256 totalRewards = calculateReward(pools[manufacturer].rewardAmount, blocks);
        irnReward = totalRewards.mul(settings.reputationIRNNodeShare()).div(100);
        manufacturerReward = totalRewards.sub(irnReward);
    }

    /// @notice computes total reward based on the authors last submission
    /// @param rewardAmount total amount available for reward
    /// @param blocksSinceLastWrite number of blocks since last write
    /// @return actual reward available
    function calculateReward(uint256 rewardAmount, uint256 blocksSinceLastWrite) public view returns (uint256) {
        uint256 totalReward = rewardAmount;
        uint256 blockThreshold = settings.blockThreshold();
        if (blocksSinceLastWrite > 0 && blocksSinceLastWrite < blockThreshold) {
            uint256 multiplier = 10 ** uint256(token.decimals());
            totalReward = rewardAmount.mul(blocksSinceLastWrite.mul(multiplier)).div(blockThreshold.mul(multiplier));
        }
        return totalReward;
    }

    ///
    /// BULK OPERATIONS
    ///
    /// @notice registers multiple devices on the Atonomi network
    /// @param _deviceIdHashes array of keccak256 hashed ID's of each device
    /// @param _deviceTypes array of types of device categorized by the manufacturer
    /// @param _devicePublicKeys array of public keys associated with the devices
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be the manufacturer
    /// @dev tokens will be deducted from the manufacturer and added to the token pool
    /// @dev owner has ability to pause this operation
    function registerDevices(
        bytes32[] _deviceIdHashes,
        bytes32[] _deviceTypes,
        bytes32[] _devicePublicKeys)
        public onlyManufacturer whenNotPaused returns (bool)
    {
        require(_deviceIdHashes.length > 0, "at least one device is required");
        require(
            _deviceIdHashes.length == _deviceTypes.length,
            "device type array needs to be same size as devices"
        );
        require(
            _deviceIdHashes.length == _devicePublicKeys.length,
            "device public key array needs to be same size as devices"
        );

        uint256 runningBalance = 0;
        uint256 registrationFee = settings.registrationFee();
        for (uint256 i = 0; i < _deviceIdHashes.length; i++) {
            bytes32 deviceIdHash = _deviceIdHashes[i];
            bytes32 deviceType = _deviceTypes[i];
            bytes32 devicePublicKey = _devicePublicKeys[i];
            Device memory d = _registerDevice(msg.sender, deviceIdHash, deviceType, devicePublicKey);
            emit DeviceRegistered(msg.sender, registrationFee, deviceIdHash, d.manufacturerId, deviceType);

            runningBalance = runningBalance.add(registrationFee);
        }

        _depositTokens(msg.sender, runningBalance);
        require(token.transferFrom(msg.sender, address(this), runningBalance), "transferFrom failed");
        return true;
    }

    ///
    /// WHITELIST PARTICIPANT MANAGEMENT
    ///
    /// @notice add a member to the network
    /// @param _member ethereum address of member to be added
    /// @param _isIRNAdmin true if an irn admin, otherwise false
    /// @param _isManufacturer true if an manufactuter, otherwise false
    /// @param _memberId manufacturer id for manufacturers, otherwise 0x0
    /// @return true if successful, otherwise false
    /// @dev _memberId is only relevant for manufacturer, but is flexible to allow use for other purposes
    /// @dev msg.sender is expected to be either owner or irn admin
    function addNetworkMember(
        address _member,
        bool _isIRNAdmin,
        bool _isManufacturer,
        bool _isIRNNode,
        bytes32 _memberId)
        public onlyIRNorOwner returns(bool)
    {
        NetworkMember storage m = network[_member];
        require(!m.isIRNAdmin, "already an irn admin");
        require(!m.isManufacturer, "already a manufacturer");
        require(!m.isIRNNode, "already an irn node");
        require(m.memberId == 0, "already assigned a member id");

        m.isIRNAdmin = _isIRNAdmin;
        m.isManufacturer = _isManufacturer;
        m.isIRNNode = _isIRNNode;
        m.memberId = _memberId;

        if (m.isManufacturer) {
            require(_memberId != 0, "manufacturer id is required");

            // keep lookup for rewards in sync
            require(manufacturerRewards[m.memberId] == address(0), "manufacturer is already assigned");
            manufacturerRewards[m.memberId] = _member;

            // set reputation reward if token pool doesnt exist
            if (pools[_member].rewardAmount == 0) {
                pools[_member].rewardAmount = settings.defaultReputationReward();
            }
        }

        emit NetworkMemberAdded(msg.sender, _member, _memberId);

        return true;
    }

    /// @notice remove a member from the network
    /// @param _member ethereum address of member to be removed
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be either owner or irn admin
    function removeNetworkMember(address _member) public onlyIRNorOwner returns(bool) {
        bytes32 memberId = network[_member].memberId;
        if (network[_member].isManufacturer) {
            // remove token pool if there is a zero balance
            if (pools[_member].balance == 0) {
                delete pools[_member];
            }

            // keep lookup with rewards in sync
            delete manufacturerRewards[memberId];
        }

        delete network[_member];

        emit NetworkMemberRemoved(msg.sender, _member, memberId);
        return true;
    }

    //
    // TOKEN POOL MANAGEMENT
    //
    /// @notice changes the ethereum wallet for a manufacturer used in reputation rewards
    /// @param _new new ethereum account
    /// @return true if successful, otherwise false
    /// @dev msg.sender is expected to be original manufacturer account
    function changeManufacturerWallet(address _new) public onlyManufacturer returns (bool) {
        require(_new != address(0), "new address cannot be 0x0");

        NetworkMember memory old = network[msg.sender];
        require(old.isManufacturer && old.memberId != 0, "must be a manufacturer");

        // copy permissions
        require(!network[_new].isIRNAdmin, "already an irn admin");
        require(!network[_new].isManufacturer, "already a manufacturer");
        require(!network[_new].isIRNNode, "already an irn node");
        require(network[_new].memberId == 0, "memberId already exists");
        network[_new] = NetworkMember(
            old.isIRNAdmin,
            old.isManufacturer,
            old.isIRNNode,
            old.memberId
        );

        // transfer balance from old pool to the new pool
        require(pools[_new].balance == 0 && pools[_new].rewardAmount == 0, "new token pool already exists");
        pools[_new].balance = pools[msg.sender].balance;
        pools[_new].rewardAmount = pools[msg.sender].rewardAmount;
        delete pools[msg.sender];

        // update reward mapping
        manufacturerRewards[old.memberId] = _new;

        // delete old member
        delete network[msg.sender];

        emit ManufacturerRewardWalletChanged(msg.sender, _new, old.memberId);
        return true;
    }

    /// @notice allows a token pool owner to set a new reward amount
    /// @param newReward new reputation reward amount
    /// @return true if successful, otherwise false
    /// @dev msg.sender expected to be manufacturer
    function setTokenPoolReward(uint256 newReward) public onlyManufacturer returns (bool) {
        require(newReward != 0, "newReward is required");

        TokenPool storage p = pools[msg.sender];
        require(p.rewardAmount != newReward, "newReward should be different");

        p.rewardAmount = newReward;
        emit TokenPoolRewardUpdated(msg.sender, newReward);
        return true;
    }

    /// @notice anyone can donate tokens to a manufacturer's pool
    /// @param manufacturerId of the manufacturer to receive the tokens
    /// @param amount of tokens to deposit
    function depositTokens(bytes32 manufacturerId, uint256 amount) public returns (bool) {
        require(manufacturerId != 0, "manufacturerId is required");
        require(amount > 0, "amount is required");

        address manufacturer = manufacturerRewards[manufacturerId];
        require(manufacturer != address(0));

        _depositTokens(manufacturer, amount);
        emit TokensDeposited(msg.sender, manufacturerId, manufacturer, amount);

        require(token.transferFrom(msg.sender, address(this), amount));
        return true;
    }

    /// @notice allows participants in the Atonomi network to claim their rewards
    /// @return true if successful, otherwise false
    /// @dev owner has ability to pause this operation
    function withdrawTokens() public whenNotPaused returns (bool) {
        uint256 amount = rewards[msg.sender];
        require(amount > 0, "amount is zero");

        rewards[msg.sender] = 0;
        emit TokensWithdrawn(msg.sender, amount);

        require(token.transfer(msg.sender, amount), "token transfer failed");
        return true;
    }

    /// @notice allows the owner to change the default reputation for manufacturers
    /// @param _manufacturerId of the manufacturer
    /// @param _newDefaultScore to use for newly registered devices
    /// @return true if successful, otherwise false
    /// @dev owner is the only one with this feature
    function setDefaultReputationForManufacturer(
        bytes32 _manufacturerId,
        bytes32 _newDefaultScore) public onlyOwner returns (bool) {
        require(_manufacturerId != 0, "_manufacturerId is required");
        require(
            _newDefaultScore != defaultManufacturerReputations[_manufacturerId],
            "_newDefaultScore should be different"
        );

        defaultManufacturerReputations[_manufacturerId] = _newDefaultScore;
        emit DefaultReputationScoreChanged(msg.sender, _manufacturerId, _newDefaultScore);
        return true;
    }

    ///
    /// INTERNAL FUNCTIONS
    ///
    /// @dev track balances of any deposits going into a token pool
    function _depositTokens(address _owner, uint256 _amount) internal {
        pools[_owner].balance = pools[_owner].balance.add(_amount);
    }

    /// @dev track balances of any rewards going out of the token pool
    function _distributeRewards(address _manufacturer, address _owner, uint256 _amount) internal {
        require(_amount > 0, "_amount is required");
        pools[_manufacturer].balance = pools[_manufacturer].balance.sub(_amount);
        rewards[_owner] = rewards[_owner].add(_amount);
    }

    /// @dev ensure a device is validated for registration
    /// @dev updates device registry
    function _registerDevice(
        address _manufacturer,
        bytes32 _deviceIdHash,
        bytes32 _deviceType,
        bytes32 _devicePublicKey) internal returns (Device) {
        require(_manufacturer != address(0), "manufacturer is required");
        require(_deviceIdHash != 0, "device id hash is required");
        require(_deviceType != 0, "device type is required");
        require(_devicePublicKey != 0, "device public key is required");

        Device storage d = devices[_deviceIdHash];
        require(!d.registered, "device is already registered");
        require(!d.activated, "device is already activated");

        bytes32 manufacturerId = network[_manufacturer].memberId;
        require(manufacturerId != 0, "manufacturer id is unknown");

        d.manufacturerId = manufacturerId;
        d.deviceType = _deviceType;
        d.registered = true;
        d.activated = false;
        d.reputationScore = defaultManufacturerReputations[manufacturerId];
        d.devicePublicKey = _devicePublicKey;
        return d;
    }

    /// @dev ensure a device is validated for activation
    /// @dev updates device registry
    function _activateDevice(bytes32 _deviceId) internal returns (Device) {
        bytes32 deviceIdHash = keccak256(_deviceId);
        Device storage d = devices[deviceIdHash];
        require(d.registered, "not registered");
        require(!d.activated, "already activated");
        require(d.manufacturerId != 0, "no manufacturer id was found");

        d.activated = true;
        return d;
    }

    /// @dev ensure a device is validated for a new reputation score
    /// @dev updates device registry
    function _updateReputationScore(bytes32 _deviceId, bytes32 _reputationScore) internal returns (Device) {
        require(_deviceId != 0, "device id is empty");

        Device storage d = devices[keccak256(_deviceId)];
        require(d.registered, "not registered");
        require(d.activated, "not activated");
        require(d.reputationScore != _reputationScore, "new score needs to be different");

        d.reputationScore = _reputationScore;
        return d;
    }
}

Contract ABI
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"rewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"manufacturerRewards","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_member","type":"address"},{"name":"_isIRNAdmin","type":"bool"},{"name":"_isManufacturer","type":"bool"},{"name":"_isIRNNode","type":"bool"},{"name":"_memberId","type":"bytes32"}],"name":"addNetworkMember","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"rewardAmount","type":"uint256"},{"name":"blocksSinceLastWrite","type":"uint256"}],"name":"calculateReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_manufacturerId","type":"bytes32"},{"name":"_newDefaultScore","type":"bytes32"}],"name":"setDefaultReputationForManufacturer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"author","type":"address"},{"name":"manufacturer","type":"address"},{"name":"deviceId","type":"bytes32"}],"name":"getReputationRewards","outputs":[{"name":"irnReward","type":"uint256"},{"name":"manufacturerReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"manufacturerId","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newReward","type":"uint256"}],"name":"setTokenPoolReward","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"},{"name":"_reputationScore","type":"bytes32"}],"name":"updateReputationScore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"defaultManufacturerReputations","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"}],"name":"activateDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deviceId","type":"bytes32"},{"name":"_deviceType","type":"bytes32"},{"name":"_devicePublicKey","type":"bytes32"}],"name":"registerAndActivateDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deviceIdHash","type":"bytes32"},{"name":"_deviceType","type":"bytes32"},{"name":"_devicePublicKey","type":"bytes32"}],"name":"registerDevice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"changeManufacturerWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deviceIdHashes","type":"bytes32[]"},{"name":"_deviceTypes","type":"bytes32[]"},{"name":"_devicePublicKeys","type":"bytes32[]"}],"name":"registerDevices","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pools","outputs":[{"name":"balance","type":"uint256"},{"name":"rewardAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_member","type":"address"}],"name":"removeNetworkMember","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"network","outputs":[{"name":"isIRNAdmin","type":"bool"},{"name":"isManufacturer","type":"bool"},{"name":"isIRNNode","type":"bool"},{"name":"memberId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"devices","outputs":[{"name":"manufacturerId","type":"bytes32"},{"name":"deviceType","type":"bytes32"},{"name":"registered","type":"bool"},{"name":"activated","type":"bool"},{"name":"reputationScore","type":"bytes32"},{"name":"devicePublicKey","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"address[]"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"settings","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"bytes32"}],"name":"authorWrites","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_settings","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"},{"indexed":true,"name":"_deviceHashKey","type":"bytes32"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"}],"name":"DeviceRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"},{"indexed":true,"name":"_deviceId","type":"bytes32"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"}],"name":"DeviceActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_deviceId","type":"bytes32"},{"indexed":false,"name":"_deviceType","type":"bytes32"},{"indexed":false,"name":"_newScore","type":"bytes32"},{"indexed":true,"name":"_irnNode","type":"address"},{"indexed":false,"name":"_irnReward","type":"uint256"},{"indexed":true,"name":"_manufacturerWallet","type":"address"},{"indexed":false,"name":"_manufacturerReward","type":"uint256"}],"name":"ReputationScoreUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_member","type":"address"},{"indexed":true,"name":"_memberId","type":"bytes32"}],"name":"NetworkMemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_member","type":"address"},{"indexed":true,"name":"_memberId","type":"bytes32"}],"name":"NetworkMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_old","type":"address"},{"indexed":true,"name":"_new","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"}],"name":"ManufacturerRewardWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_newReward","type":"uint256"}],"name":"TokenPoolRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":true,"name":"_manufacturer","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":true,"name":"_manufacturerId","type":"bytes32"},{"indexed":false,"name":"_newDefaultScore","type":"bytes32"}],"name":"DefaultReputationScoreChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code
608060405260008060146101000a81548160ff0219169083151502179055503480156200002b57600080fd5b5060405160408062005f6f8339810180604052810190808051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156200013f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f746f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620001e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f73657474696e677320616464726573732063616e6e6f7420626520307830000081525060200191505060405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050615cf680620002796000396000f300608060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630700037d1461017a578063135ca124146101d157806313ac2bdb1461024257806313ed0846146102cf5780631db1c8051461031a5780632217bf7814610371578063222b8947146103fd578063252dbc36146104505780633d32cb63146104955780633e870203146104ec5780633f4ba83a14610539578063568f9ce1146105505780635c975abb146105995780636d54ec91146105c85780637900438b1461062d5780638456cb59146106925780638b3edbdf146106a95780638d8f2adb146107045780638da5cb5b1461073357806395f62fb91461078a578063a4063dbc1461088e578063b27f829e146108ec578063c3aa168414610947578063c5c400de146109c7578063c6786e5a14610a57578063e06174e414610abd578063f2fde38b14610b14578063fc0c546a14610b57578063fe4a22eb14610bae575b600080fd5b34801561018657600080fd5b506101bb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c13565b6040518082815260200191505060405180910390f35b3480156101dd57600080fd5b506102006004803603810190808035600019169060200190929190505050610c2b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561024e57600080fd5b506102b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291908035151590602001909291908035151590602001909291908035600019169060200190929190505050610c5e565b604051808215151515815260200191505060405180910390f35b3480156102db57600080fd5b5061030460048036038101908080359060200190929190803590602001909291905050506113cf565b6040518082815260200191505060405180910390f35b34801561032657600080fd5b50610357600480360381019080803560001916906020019092919080356000191690602001909291905050506115d0565b604051808215151515815260200191505060405180910390f35b34801561037d57600080fd5b506103e0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291905050506117f7565b604051808381526020018281526020019250505060405180910390f35b34801561040957600080fd5b506104366004803603810190808035600019169060200190929190803590602001909291905050506119d3565b604051808215151515815260200191505060405180910390f35b34801561045c57600080fd5b5061047b60048036038101908080359060200190929190505050611d06565b604051808215151515815260200191505060405180910390f35b3480156104a157600080fd5b506104d260048036038101908080356000191690602001909291908035600019169060200190929190505050611f64565b604051808215151515815260200191505060405180910390f35b3480156104f857600080fd5b5061051b6004803603810190808035600019169060200190929190505050612360565b60405180826000191660001916815260200191505060405180910390f35b34801561054557600080fd5b5061054e612378565b005b34801561055c57600080fd5b5061057f6004803603810190808035600019169060200190929190505050612436565b604051808215151515815260200191505060405180910390f35b3480156105a557600080fd5b506105ae612840565b604051808215151515815260200191505060405180910390f35b3480156105d457600080fd5b50610613600480360381019080803560001916906020019092919080356000191690602001909291908035600019169060200190929190505050612853565b604051808215151515815260200191505060405180910390f35b34801561063957600080fd5b50610678600480360381019080803560001916906020019092919080356000191690602001909291908035600019169060200190929190505050612db2565b604051808215151515815260200191505060405180910390f35b34801561069e57600080fd5b506106a7613199565b005b3480156106b557600080fd5b506106ea600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613259565b604051808215151515815260200191505060405180910390f35b34801561071057600080fd5b50610719613cc8565b604051808215151515815260200191505060405180910390f35b34801561073f57600080fd5b50610748613fb0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079657600080fd5b50610874600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613fd5565b604051808215151515815260200191505060405180910390f35b34801561089a57600080fd5b506108cf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614602565b604051808381526020018281526020019250505060405180910390f35b3480156108f857600080fd5b5061092d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614626565b604051808215151515815260200191505060405180910390f35b34801561095357600080fd5b50610988600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506149aa565b60405180851515151581526020018415151515815260200183151515158152602001826000191660001916815260200194505050505060405180910390f35b3480156109d357600080fd5b506109f66004803603810190808035600019169060200190929190505050614a01565b6040518087600019166000191681526020018660001916600019168152602001851515151581526020018415151515815260200183600019166000191681526020018260001916600019168152602001965050505050505060405180910390f35b348015610a6357600080fd5b50610abb60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050614a57565b005b348015610ac957600080fd5b50610ad2614cfe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b2057600080fd5b50610b55600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614d24565b005b348015610b6357600080fd5b50610b6c614e79565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bba57600080fd5b50610bfd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190505050614e9f565b6040518082815260200191505060405180910390f35b60066020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d085750600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1515610d7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6d757374206265206f776e6572206f7220616e2069726e2061646d696e00000081525060200191505060405180910390fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900460ff16151515610e44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c726561647920616e2069726e2061646d696e00000000000000000000000081525060200191505060405180910390fd5b8060000160019054906101000a900460ff16151515610ecb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616c72656164792061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b8060000160029054906101000a900460ff16151515610f52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b6000600102816001015460001916141515610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f616c72656164792061737369676e65642061206d656d6265722069640000000081525060200191505060405180910390fd5b858160000160006101000a81548160ff021916908315150217905550848160000160016101000a81548160ff021916908315150217905550838160000160026101000a81548160ff021916908315150217905550828160010181600019169055508060000160019054906101000a900460ff16156113625760006001028360001916141515156110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d616e756661637475726572206964206973207265717569726564000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166007600083600101546000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6d616e75666163747572657220697320616c72656164792061737369676e656481525060200191505060405180910390fd5b866007600083600101546000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561136157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a10a77826040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b8101908080519060200190929190505050600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b5b82600019168773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb4fd010b1822efc1cfe6c978216999bda713c5f143d17f2e142d61d79c2cfaf60405160405180910390a4600191505095945050505050565b600080600080859250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c41a6c76040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561145e57600080fd5b505af1158015611472573d6000803e3d6000fd5b505050506040513d602081101561148857600080fd5b810190808051906020019092919050505091506000851180156114aa57508185105b156115c457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050506040513d602081101561155f57600080fd5b810190808051906020019092919050505060ff16600a0a90506115c161158e8284614ec490919063ffffffff16565b6115b36115a48489614ec490919063ffffffff16565b89614ec490919063ffffffff16565b614efc90919063ffffffff16565b92505b82935050505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162d57600080fd5b60006001028360001916141515156116ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5f6d616e7566616374757265724964206973207265717569726564000000000081525060200191505060405180910390fd5b600960008460001916600019168152602001908152602001600020546000191682600019161415151561176e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f5f6e657744656661756c7453636f72652073686f756c6420626520646966666581526020017f72656e740000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600960008560001916600019168152602001908152602001600020816000191690555082600019163373ffffffffffffffffffffffffffffffffffffffff167f06d7e68cd9327cfb10eceecb9d9ad605c95ee202de1c6c65dbe0436ef4a5e6138460405180826000191660001916815260200191505060405180910390a36001905092915050565b6000806000806000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000876000191660001916815260200190815260200160002054925060009150600083111561187d5761187a8343614f1290919063ffffffff16565b91505b6118c9600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154836113cf565b90506119b160646119a3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aaabdf166040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561195957600080fd5b505af115801561196d573d6000803e3d6000fd5b505050506040513d602081101561198357600080fd5b810190808051906020019092919050505084614ec490919063ffffffff16565b614efc90919063ffffffff16565b94506119c68582614f1290919063ffffffff16565b9350505050935093915050565b6000806000600102846000191614151515611a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d616e756661637475726572496420697320726571756972656400000000000081525060200191505060405180910390fd5b600083111515611ace576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f616d6f756e74206973207265717569726564000000000000000000000000000081525060200191505060405180910390fd5b60076000856000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4857600080fd5b611b528184614f2b565b8073ffffffffffffffffffffffffffffffffffffffff1684600019163373ffffffffffffffffffffffffffffffffffffffff167f811880d278d5f75cf96199a9c79c2fa6e8eebee04e2afda088a7b1dd765889bb866040518082815260200191505060405180910390a4600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611cb557600080fd5b505af1158015611cc9573d6000803e3d6000fd5b505050506040513d6020811015611cdf57600080fd5b81019080805190602001909291905050501515611cfb57600080fd5b600191505092915050565b600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515611dcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b60008314151515611e46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6e6577526577617264206973207265717569726564000000000000000000000081525060200191505060405180910390fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816001015414151515611f03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e65775265776172642073686f756c6420626520646966666572656e7400000081525060200191505060405180910390fd5b8281600101819055503373ffffffffffffffffffffffffffffffffffffffff167f78b008c8623496713f0a108a67aa2804f75d388bf5f12cd93e8a5bb404b579e5846040518082815260200191505060405180910390a26001915050919050565b6000611f6e615c51565b6000806000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff161515612037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6d75737420626520616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615151561205357600080fd5b61205d8787614fca565b93506007600085600001516000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f5f6d616e75666163747572657257616c6c65742063616e6e6f7420626520307881526020017f300000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f6d616e756661637475726572732063616e6e6f7420636f6c6c6563742074686581526020017f2066756c6c20726577617264000000000000000000000000000000000000000081525060400191505060405180910390fd5b6122413384896117f7565b80925081935050506122548333846152be565b61225f8384836152be565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1688600019167f623469fb6c872fc53daa40e4a20f7eb2fc3fe6816dacc59ad6f3b924f679174587602001518a8787604051808560001916600019168152602001846000191660001916815260200183815260200182815260200194505050505060405180910390a443600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000896000191660001916815260200190815260200160002081905550600194505050505092915050565b60096020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123d357600080fd5b600060149054906101000a900460ff1615156123ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080612441615c51565b60008060149054906101000a900460ff1615151561245e57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377d630ae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156124e457600080fd5b505af11580156124f8573d6000803e3d6000fd5b505050506040513d602081101561250e57600080fd5b8101908080519060200190929190505050925061252a8561546b565b915081600001516000191685600019163373ffffffffffffffffffffffffffffffffffffffff167fba2136e45a61f966f69316c7c8ff08dc8ffb4886fc5d9027314755ee1a6238578686602001516040518083815260200182600019166000191681526020019250505060405180910390a46007600083600001516000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6d616e75666163747572657220697320756e6b6e6f776e00000000000000000081525060200191505060405180910390fd5b61268c8184614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561278557600080fd5b505af1158015612799573d6000803e3d6000fd5b505050506040513d60208110156127af57600080fd5b81019080805190602001909291905050501515612834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b60019350505050919050565b600060149054906101000a900460ff1681565b600080600080612861615c51565b600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515612928576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff1615151561294457600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b81019080805190602001909291905050509550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166377d630ae6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612a8d57600080fd5b505af1158015612aa1573d6000803e3d6000fd5b505050506040513d6020811015612ab757600080fd5b810190808051906020019092919050505094508960405180826000191660001916815260200191505060405180910390209350612af633858b8b6156f5565b925082600001519150816000191684600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d5898d6040518083815260200182600019166000191681526020019250505060405180910390a4612b708a61546b565b925081600019168a600019163373ffffffffffffffffffffffffffffffffffffffff167fba2136e45a61f966f69316c7c8ff08dc8ffb4886fc5d9027314755ee1a623857888d6040518083815260200182600019166000191681526020019250505060405180910390a4612bed8587615c3590919063ffffffff16565b9050612bf93382614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b505050506040513d6020811015612d1c57600080fd5b81019080805190602001909291905050501515612da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b600196505050505050509392505050565b600080612dbd615c51565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515612e81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff16151515612e9d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6020811015612f4d57600080fd5b81019080805190602001909291905050509150612f6c338787876156f5565b905080600001516000191686600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d585896040518083815260200182600019166000191681526020019250505060405180910390a4612fe43383614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156130dd57600080fd5b505af11580156130f1573d6000803e3d6000fd5b505050506040513d602081101561310757600080fd5b8101908080519060200190929190505050151561318c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b6001925050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131f457600080fd5b600060149054906101000a900460ff1615151561321057600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000613263615c98565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff161515613327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156133cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6e657720616464726573732063616e6e6f74206265203078300000000000000081525060200191505060405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020608060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a900460ff1615151515815260200160018201546000191660001916815250509050806020015180156134995750600060010281606001516000191614155b151561350d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c726561647920616e2069726e2061646d696e00000000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16151515613697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616c72656164792061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff1615151561375c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920616e2069726e206e6f64650000000000000000000000000081525060200191505060405180910390fd5b6000600102600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546000191614151561381d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6d656d626572496420616c72656164792065786973747300000000000000000081525060200191505060405180910390fd5b608060405190810160405280826000015115158152602001826020015115158152602001826040015115158152602001826060015160001916815250600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550606082015181600101906000191690559050506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414801561399f57506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b1515613a13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6e657720746f6b656e20706f6f6c20616c72656164792065786973747300000081525060200191505060405180910390fd5b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090555050826007600083606001516000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff0219169055600182016000905550508060600151600019168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd2abdf6b4e963e07e9584816486597def4b3ec7dee88f7f66ad7dfb2c40d79e60405160405180910390a46001915050919050565b600080600060149054906101000a900460ff16151515613ce757600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111515613da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f616d6f756e74206973207a65726f00000000000000000000000000000000000081525060200191505060405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040518082815260200191505060405180910390a2600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613ef957600080fd5b505af1158015613f0d573d6000803e3d6000fd5b505050506040513d6020811015613f2357600080fd5b81019080805190602001909291905050501515613fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b600191505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000613fe8615c51565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1615156140ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d7573742062652061206d616e7566616374757265720000000000000000000081525060200191505060405180910390fd5b600060149054906101000a900460ff161515156140c857600080fd5b60008b51111515614141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6174206c65617374206f6e65206465766963652069732072657175697265640081525060200191505060405180910390fd5b89518b511415156141e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f6465766963652074797065206172726179206e6565647320746f20626520736181526020017f6d652073697a652061732064657669636573000000000000000000000000000081525060400191505060405180910390fd5b88518b5114151561427f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f646576696365207075626c6963206b6579206172726179206e6565647320746f81526020017f2062652073616d652073697a652061732064657669636573000000000000000081525060400191505060405180910390fd5b60009650600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314c44e096040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561430957600080fd5b505af115801561431d573d6000803e3d6000fd5b505050506040513d602081101561433357600080fd5b81019080805190602001909291905050509550600094505b8a5185101561443e578a8581518110151561436257fe5b906020019060200201519350898581518110151561437c57fe5b906020019060200201519250888581518110151561439657fe5b9060200190602002015191506143ae338585856156f5565b905080600001516000191684600019163373ffffffffffffffffffffffffffffffffffffffff167f0eb7a49a7f427b424a9fe87d487fd12d3f155c956145b0ac06a72ea85235e7d589876040518083815260200182600019166000191681526020019250505060405180910390a461442f8688615c3590919063ffffffff16565b9650848060010195505061434b565b6144483388614f2b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308a6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561454157600080fd5b505af1158015614555573d6000803e3d6000fd5b505050506040513d602081101561456b57600080fd5b810190808051906020019092919050505015156145f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b60019750505050505050509392505050565b60056020528060005260406000206000915090508060000154908060010154905082565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806146d05750600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b1515614744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6d757374206265206f776e6572206f7220616e2069726e2061646d696e00000081525060200191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff16156148bb576000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561487c57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b60076000826000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff02191690556001820160009055505080600019168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdb9b3d3fa67ccdd9e527c3495268d215a339f094b8e0997c3bc9eef209a5016060405160405180910390a46001915050919050565b60046020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060010154905084565b60036020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060030154908060040154905086565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614ab757600080fd5b600092505b8351831015614cc4578383815181101515614ad357fe5b9060200190602002015191508173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614b7a57600080fd5b505af1158015614b8e573d6000803e3d6000fd5b505050506040513d6020811015614ba457600080fd5b810190808051906020019092919050505090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614c7b57600080fd5b505af1158015614c8f573d6000803e3d6000fd5b505050506040513d6020811015614ca557600080fd5b8101908080519060200190929190505050508280600101935050614abc565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614d7f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614dbb57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052816000526040600020602052806000526040600020600091509150505481565b600080831415614ed75760009050614ef6565b8183029050818382811515614ee857fe5b04141515614ef257fe5b8090505b92915050565b60008183811515614f0957fe5b04905092915050565b6000828211151515614f2057fe5b818303905092915050565b614f8081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154615c3590919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b614fd2615c51565b600080600102846000191614151515615053576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f64657669636520696420697320656d707479000000000000000000000000000081525060200191505060405180910390fd5b600360008560405180826000191660001916815260200191505060405180910390206000191660001916815260200190815260200160002090508060020160009054906101000a900460ff161515615113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6e6f74207265676973746572656400000000000000000000000000000000000081525060200191505060405180910390fd5b8060020160019054906101000a900460ff161515615199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6e6f74206163746976617465640000000000000000000000000000000000000081525060200191505060405180910390fd5b82600019168160030154600019161415151561521d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6e65772073636f7265206e6565647320746f20626520646966666572656e740081525060200191505060405180910390fd5b828160030181600019169055508060c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505091505092915050565b600081111515615336576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5f616d6f756e742069732072657175697265640000000000000000000000000081525060200191505060405180910390fd5b61538b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154614f1290919063ffffffff16565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061542381600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615c3590919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b615473615c51565b600080836040518082600019166000191681526020019150506040518091039020915060036000836000191660001916815260200190815260200160002090508060020160009054906101000a900460ff161515615539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6e6f74207265676973746572656400000000000000000000000000000000000081525060200191505060405180910390fd5b8060020160019054906101000a900460ff161515156155c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f616c72656164792061637469766174656400000000000000000000000000000081525060200191505060405180910390fd5b600060010281600001546000191614151515615644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6e6f206d616e7566616374757265722069642077617320666f756e640000000081525060200191505060405180910390fd5b60018160020160016101000a81548160ff0219169083151502179055508060c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505092505050919050565b6156fd615c51565b600080600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141515156157a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6d616e756661637475726572206973207265717569726564000000000000000081525060200191505060405180910390fd5b6000600102866000191614151515615825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f646576696365206964206861736820697320726571756972656400000000000081525060200191505060405180910390fd5b60006001028560001916141515156158a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f646576696365207479706520697320726571756972656400000000000000000081525060200191505060405180910390fd5b6000600102846000191614151515615925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f646576696365207075626c6963206b657920697320726571756972656400000081525060200191505060405180910390fd5b60036000876000191660001916815260200190815260200160002091508160020160009054906101000a900460ff161515156159c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64657669636520697320616c726561647920726567697374657265640000000081525060200191505060405180910390fd5b8160020160019054906101000a900460ff16151515615a50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f64657669636520697320616c726561647920616374697661746564000000000081525060200191505060405180910390fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600102816000191614151515615b15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d616e75666163747572657220696420697320756e6b6e6f776e00000000000081525060200191505060405180910390fd5b808260000181600019169055508482600101816000191690555060018260020160006101000a81548160ff02191690831515021790555060008260020160016101000a81548160ff02191690831515021790555060096000826000191660001916815260200190815260200160002054826003018160001916905550838260040181600019169055508160c060405190810160405290816000820154600019166000191681526020016001820154600019166000191681526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152602001600382015460001916600019168152602001600482015460001916600019168152505092505050949350505050565b60008183019050828110151515615c4857fe5b80905092915050565b60c060405190810160405280600080191681526020016000801916815260200160001515815260200160001515815260200160008019168152602001600080191681525090565b6080604051908101604052806000151581526020016000151581526020016000151581526020016000801916815250905600a165627a7a723058204d2ff784448524fb6edf8e9272a47100642593d626e1d13ec6015e6dfe28949b002900000000000000000000000097aeb5066e1a590e868b511457beb6fe99d329f50000000000000000000000002566c658331eac75d3b3ccd0e45c78d9cf6c4c4c


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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000097aeb5066e1a590e868b511457beb6fe99d329f5
Arg [1] : 0000000000000000000000002566c658331eac75d3b3ccd0e45c78d9cf6c4c4c


   Swarm Source:
bzzr://4d2ff784448524fb6edf8e9272a47100642593d626e1d13ec6015e6dfe28949b
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.