ETH Price: $1,616.73 (+0.35%)
Gas: 8 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x60806040112750462020-11-17 11:01:361044 days 22 hrs ago1605610896IN
 Create: TwoKeyAdmin
0 ETH0.2872774260

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwoKeyAdmin

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-02
*/

pragma solidity ^0.4.13;

contract ERC20 {
    function totalSupply() public view returns (uint256);
    function balanceOf(address _who) public view returns (uint256);
    function transfer(address _to, uint256 _value) public returns (bool);
    function allowance(address _ocwner, address _spender) public view returns (uint256);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

contract IERC20 {
    function balanceOf(
        address whom
    )
    external
    view
    returns (uint);


    function transfer(
        address _to,
        uint256 _value
    )
    external
    returns (bool);


    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
    external
    returns (bool);



    function approve(
        address _spender,
        uint256 _value
    )
    public
    returns (bool);



    function decimals()
    external
    view
    returns (uint);


    function symbol()
    external
    view
    returns (string);


    function name()
    external
    view
    returns (string);


    function freezeTransfers()
    external;


    function unfreezeTransfers()
    external;
}

contract IKyberReserveInterface {

    // Pricing contract
    uint public collectedFeesInTwei;
    // Pricing contract
    function resetCollectedFees() public;
    // Pricing contract
    function setLiquidityParams(
        uint _rInFp,
        uint _pMinInFp,
        uint _numFpBits,
        uint _maxCapBuyInWei,
        uint _maxCapSellInWei,
        uint _feeInBps,
        uint _maxTokenToEthRateInPrecision,
        uint _minTokenToEthRateInPrecision
    ) public;

    function withdraw(ERC20 token, uint amount, address destination) public returns(bool);
    function disableTrade() public returns (bool);
    function enableTrade() public returns (bool);
    function withdrawEther(uint amount, address sendTo) external;
    function withdrawToken(ERC20 token, uint amount, address sendTo) external;
    function setContracts(address _kyberNetwork, address _conversionRates, address _sanityRates) public;
    function getDestQty(ERC20 src, ERC20 dest, uint srcQty, uint rate) public view returns(uint);
}

contract IStructuredStorage {

    function setProxyLogicContractAndDeployer(address _proxyLogicContract, address _deployer) external;
    function setProxyLogicContract(address _proxyLogicContract) external;

    // *** Getter Methods ***
    function getUint(bytes32 _key) external view returns(uint);
    function getString(bytes32 _key) external view returns(string);
    function getAddress(bytes32 _key) external view returns(address);
    function getBytes(bytes32 _key) external view returns(bytes);
    function getBool(bytes32 _key) external view returns(bool);
    function getInt(bytes32 _key) external view returns(int);
    function getBytes32(bytes32 _key) external view returns(bytes32);

    // *** Getter Methods For Arrays ***
    function getBytes32Array(bytes32 _key) external view returns (bytes32[]);
    function getAddressArray(bytes32 _key) external view returns (address[]);
    function getUintArray(bytes32 _key) external view returns (uint[]);
    function getIntArray(bytes32 _key) external view returns (int[]);
    function getBoolArray(bytes32 _key) external view returns (bool[]);

    // *** Setter Methods ***
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string _value) external;
    function setAddress(bytes32 _key, address _value) external;
    function setBytes(bytes32 _key, bytes _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    function setBytes32(bytes32 _key, bytes32 _value) external;

    // *** Setter Methods For Arrays ***
    function setBytes32Array(bytes32 _key, bytes32[] _value) external;
    function setAddressArray(bytes32 _key, address[] _value) external;
    function setUintArray(bytes32 _key, uint[] _value) external;
    function setIntArray(bytes32 _key, int[] _value) external;
    function setBoolArray(bytes32 _key, bool[] _value) external;

    // *** Delete Methods ***
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteAddress(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;
    function deleteBytes32(bytes32 _key) external;
}

contract ITwoKeyCampaign {

    function getNumberOfUsersToContractor(
        address _user
    )
    public
    view
    returns (uint);

    function getReceivedFrom(
        address _receiver
    )
    public
    view
    returns (address);

    function balanceOf(
        address _owner
    )
    public
    view
    returns (uint256);

    function getReferrerCut(
        address me
    )
    public
    view
    returns (uint256);

    function getReferrerPlasmaBalance(
        address _influencer
    )
    public
    view
    returns (uint);

    function updateReferrerPlasmaBalance(
        address _influencer,
        uint _balance
    )
    public;

    function updateModeratorRewards(
        uint moderatorTokens
    )
    public;

    address public logicHandler;
    address public conversionHandler;

}

contract ITwoKeyCampaignValidator {
    function isCampaignValidated(address campaign) public view returns (bool);
    function validateAcquisitionCampaign(address campaign, string nonSingletonHash) public;
    function validateDonationCampaign(address campaign, address donationConversionHandler, address donationLogicHandler, string nonSingletonHash) public;
    function validateCPCCampaign(address campaign, string nonSingletonHash) public;
}

contract ITwoKeyDeepFreezeTokenPool {
    function updateReceivedTokensForSuccessfulConversions(
        uint amount,
        address campaignAddress
    )
    public;
}

contract ITwoKeyEventSource {

    function ethereumOf(address me) public view returns (address);
    function plasmaOf(address me) public view returns (address);
    function isAddressMaintainer(address _maintainer) public view returns (bool);
    function getTwoKeyDefaultIntegratorFeeFromAdmin() public view returns (uint);
    function joined(address _campaign, address _from, address _to) external;
    function rejected(address _campaign, address _converter) external;

    function convertedAcquisition(
        address _campaign,
        address _converterPlasma,
        uint256 _baseTokens,
        uint256 _bonusTokens,
        uint256 _conversionAmount,
        bool _isFiatConversion,
        uint _conversionId
    )
    external;

    function getTwoKeyDefaultNetworkTaxPercent()
    public
    view
    returns (uint);

    function convertedDonation(
        address _campaign,
        address _converterPlasma,
        uint256 _conversionAmount,
        uint256 _conversionId
    )
    external;

    function executed(
        address _campaignAddress,
        address _converterPlasmaAddress,
        uint _conversionId,
        uint tokens
    )
    external;

    function tokensWithdrawnFromPurchasesHandler(
        address campaignAddress,
        uint _conversionID,
        uint _tokensAmountWithdrawn
    )
    external;

    function emitDebtEvent(
        address _plasmaAddress,
        uint _amount,
        bool _isAddition,
        string _currency
    )
    external;

    function emitReceivedTokensToDeepFreezeTokenPool(
        address _campaignAddress,
        uint _amountOfTokens
    )
    public;

    function emitReceivedTokensAsModerator(
        address _campaignAddress,
        uint _amountOfTokens
    )
    public;

    function emitDAIReleasedAsIncome(
        address _campaignContractAddress,
        uint _amountOfDAI
    )
    public;

    function emitEndedBudgetCampaign(
        address campaignPlasmaAddress,
        uint contractorLeftover,
        uint moderatorEarningsDistributed
    )
    public;


    function emitUserWithdrawnNetworkEarnings(
        address user,
        uint amountOfTokens
    )
    public;

    function emitRebalancedRewards(
        uint cycleId,
        uint difference,
        string action
    )
    public;
}

contract ITwoKeyFeeManager {
    function payDebtWhenConvertingOrWithdrawingProceeds(address _plasmaAddress, uint _debtPaying) public payable;
    function getDebtForUser(address _userPlasma) public view returns (uint);
    function payDebtWithDAI(address _plasmaAddress, uint _totalDebt, uint _debtPaid) public;
    function payDebtWith2Key(address _beneficiaryPublic, address _plasmaAddress, uint _amountOf2keyForRewards) public;
    function payDebtWith2KeyV2(
        address _beneficiaryPublic,
        address _plasmaAddress,
        uint _amountOf2keyForRewards,
        address _twoKeyEconomy,
        address _twoKeyAdmin
    ) public;
    function setRegistrationFeeForUser(address _plasmaAddress, uint _registrationFee) public;
    function addDebtForUser(address _plasmaAddress, uint _debtAmount, string _debtType) public;
    function withdrawEtherCollected() public returns (uint);
    function withdraw2KEYCollected() public returns (uint);
    function withdrawDAICollected(address _dai) public returns (uint);
}

contract ITwoKeyMaintainersRegistry {
    function checkIsAddressMaintainer(address _sender) public view returns (bool);
    function checkIsAddressCoreDev(address _sender) public view returns (bool);

    function addMaintainers(address [] _maintainers) public;
    function addCoreDevs(address [] _coreDevs) public;
    function removeMaintainers(address [] _maintainers) public;
    function removeCoreDevs(address [] _coreDevs) public;
}

contract ITwoKeyReg {
    function addTwoKeyEventSource(address _twoKeyEventSource) public;
    function changeTwoKeyEventSource(address _twoKeyEventSource) public;
    function addWhereContractor(address _userAddress, address _contractAddress) public;
    function addWhereModerator(address _userAddress, address _contractAddress) public;
    function addWhereReferrer(address _userAddress, address _contractAddress) public;
    function addWhereConverter(address _userAddress, address _contractAddress) public;
    function getContractsWhereUserIsContractor(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsModerator(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsRefferer(address _userAddress) public view returns (address[]);
    function getContractsWhereUserIsConverter(address _userAddress) public view returns (address[]);
    function getTwoKeyEventSourceAddress() public view returns (address);
    function addName(string _name, address _sender, string _fullName, string _email, bytes signature) public;
    function addNameByUser(string _name) public;
    function getName2Owner(string _name) public view returns (address);
    function getOwner2Name(address _sender) public view returns (string);
    function getPlasmaToEthereum(address plasma) public view returns (address);
    function getEthereumToPlasma(address ethereum) public view returns (address);
    function checkIfTwoKeyMaintainerExists(address _maintainer) public view returns (bool);
    function getUserData(address _user) external view returns (bytes);
}

contract ITwoKeySingletoneRegistryFetchAddress {
    function getContractProxyAddress(string _contractName) public view returns (address);
    function getNonUpgradableContractAddress(string contractName) public view returns (address);
    function getLatestCampaignApprovedVersion(string campaignType) public view returns (string);
}

interface ITwoKeySingletonesRegistry {

    /**
    * @dev This event will be emitted every time a new proxy is created
    * @param proxy representing the address of the proxy created
    */
    event ProxyCreated(address proxy);


    /**
    * @dev This event will be emitted every time a new implementation is registered
    * @param version representing the version name of the registered implementation
    * @param implementation representing the address of the registered implementation
    * @param contractName is the name of the contract we added new version
    */
    event VersionAdded(string version, address implementation, string contractName);

    /**
    * @dev Registers a new version with its implementation address
    * @param version representing the version name of the new implementation to be registered
    * @param implementation representing the address of the new implementation to be registered
    */
    function addVersion(string _contractName, string version, address implementation) public;

    /**
    * @dev Tells the address of the implementation for a given version
    * @param _contractName is the name of the contract we're querying
    * @param version to query the implementation of
    * @return address of the implementation registered for the given version
    */
    function getVersion(string _contractName, string version) public view returns (address);
}

contract IUpgradableExchange {

    function buyRate2key() public view returns (uint);
    function sellRate2key() public view returns (uint);

    function buyTokensWithERC20(
        uint amountOfTokens,
        address tokenAddress
    )
    public
    returns (uint,uint);

    function buyTokens(
        address _beneficiary
    )
    public
    payable
    returns (uint,uint);

    function buyStableCoinWith2key(
        uint _twoKeyUnits,
        address _beneficiary
    )
    public
    payable;

    function report2KEYWithdrawnFromNetwork(
        uint amountOfTokensWithdrawn
    )
    public;

    function getEth2DaiAverageExchangeRatePerContract(
        uint _contractID
    )
    public
    view
    returns (uint);

    function getContractId(
        address _contractAddress
    )
    public
    view
    returns (uint);

    function getEth2KeyAverageRatePerContract(
        uint _contractID
    )
    public
    view
    returns (uint);

    function returnLeftoverAfterRebalancing(
        uint amountOf2key
    )
    public;


    function getMore2KeyTokensForRebalancing(
        uint amountOf2KeyRequested
    )
    public
    view
    returns (uint);


    function releaseAllDAIFromContractToReserve()
    public;

    function setKyberReserveInterfaceContractAddress(
        address kyberReserveContractAddress
    )
    public;

    function setSpreadWei(
        uint newSpreadWei
    )
    public;

    function withdrawDAIAvailableToFill2KEYReserve(
        uint amountOfDAI
    )
    public
    returns (uint);

    function returnTokensBackToExchangeV1(
        uint amountOfTokensToReturn
    )
    public;


    function getMore2KeyTokensForRebalancingV1(
        uint amountOfTokensRequested
    )
    public;
}

contract ITwoKeyAdminStorage is IStructuredStorage {

}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    require(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) {
    require(_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;
    require(c >= _a);
    return c;
  }
}

contract ITwoKeySingletonUtils {

    address public TWO_KEY_SINGLETON_REGISTRY;

    // Modifier to restrict method calls only to maintainers
    modifier onlyMaintainer {
        address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry("TwoKeyMaintainersRegistry");
        require(ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).checkIsAddressMaintainer(msg.sender));
        _;
    }

    /**
     * @notice Function to get any singleton contract proxy address from TwoKeySingletonRegistry contract
     * @param contractName is the name of the contract we're looking for
     */
    function getAddressFromTwoKeySingletonRegistry(
        string contractName
    )
    internal
    view
    returns (address)
    {
        return ITwoKeySingletoneRegistryFetchAddress(TWO_KEY_SINGLETON_REGISTRY)
            .getContractProxyAddress(contractName);
    }

    function getNonUpgradableContractAddressFromTwoKeySingletonRegistry(
        string contractName
    )
    internal
    view
    returns (address)
    {
        return ITwoKeySingletoneRegistryFetchAddress(TWO_KEY_SINGLETON_REGISTRY)
            .getNonUpgradableContractAddress(contractName);
    }
}

contract UpgradeabilityStorage {
    // Versions registry
    ITwoKeySingletonesRegistry internal registry;

    // Address of the current implementation
    address internal _implementation;

    /**
    * @dev Tells the address of the current implementation
    * @return address of the current implementation
    */
    function implementation() public view returns (address) {
        return _implementation;
    }
}

contract Upgradeable is UpgradeabilityStorage {
    /**
     * @dev Validates the caller is the versions registry.
     * @param sender representing the address deploying the initial behavior of the contract
     */
    function initialize(address sender) public payable {
        require(msg.sender == address(registry));
    }
}

contract TwoKeyAdmin is Upgradeable, ITwoKeySingletonUtils {

	using SafeMath for *;


	/**
	 * Storage keys are stored on the top. Here they are in order to avoid any typos
	 */
	string constant _twoKeyIntegratorDefaultFeePercent = "twoKeyIntegratorDefaultFeePercent";
	string constant _twoKeyNetworkTaxPercent = "twoKeyNetworkTaxPercent";
	string constant _twoKeyTokenRate = "twoKeyTokenRate";
	string constant _rewardReleaseAfter = "rewardReleaseAfter";

    /**
     * Accounting necessary stuff
     */

    //Income to ADMIN
    string constant _rewardsReceivedAsModeratorTotal = "rewardsReceivedAsModeratorTotal";
    string constant _moderatorEarningsPerCampaign = "moderatorEarningsPerCampaign";
    string constant _feesFromFeeManagerCollectedInCurrency = "feesFromFeeManagerCollectedInCurrency";
	string constant _feesCollectedFromKyber = "feesCollectedFromKyber";
	string constant _daiCollectedFromUpgradableExchange = "daiCollectedFromUpgradableExchange";
	string constant _feesCollectedFromDistributionRewards = "feesCollectedFromDistributionRewards";


	// Withdrawals from ADMIN
	string constant _amountWithdrawnFromModeratorEarningsPool = "amountWithdrawnFromModeratorEarningsPool";
	string constant _amountWithdrawnFromFeeManagerPoolInCurrency = "amountWithdrawnFromFeeManagerPoolInCurrency";
	string constant _amountWithdrawnFromKyberFeesPool = "amountWithdrawnFromKyberFeesPool";
	string constant _amountWithdrawnFromCollectedDaiFromUpgradableExchange = "amountWithdrawnFromCollectedDaiFromUpgradableExchange";
	string constant _amountWithdrawnFromCollectedDistributionRewards = "amountWithdrawnFromCollectedDistributionRewards";

	/**
     * Keys for the addresses we're accessing
     */
	string constant _twoKeyCongress = "TwoKeyCongress";
	string constant _twoKeyUpgradableExchange = "TwoKeyUpgradableExchange";
	string constant _twoKeyRegistry = "TwoKeyRegistry";
	string constant _twoKeyEconomy = "TwoKeyEconomy";
	string constant _twoKeyCampaignValidator = "TwoKeyCampaignValidator";
	string constant _twoKeyEventSource = "TwoKeyEventSource";
	string constant _twoKeyFeeManager = "TwoKeyFeeManager";
	string constant _twoKeyMaintainersRegistry = "TwoKeyMaintainersRegistry";
	string constant _DAI_TOKEN = "DAI";

	bool initialized = false;


	ITwoKeyAdminStorage public PROXY_STORAGE_CONTRACT; 			//Pointer to storage contract


	/**
	 * @notice 			Modifier which throws if caller is not TwoKeyCongress
	 */
	modifier onlyTwoKeyCongress {
		require(msg.sender == getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyCongress));
	    _;
	}

	modifier onlyTwoKeyBudgetCampaignsPaymentsHandler {
		address twoKeyBudgetCampaignsPaymentsHandler = getAddressFromTwoKeySingletonRegistry("TwoKeyBudgetCampaignsPaymentsHandler");
		require(msg.sender == twoKeyBudgetCampaignsPaymentsHandler);
		_;
	}

	/**
	 * @notice 			Modifier which throws if the campaign contract sending request is not validated
	 * 					by TwoKeyCampaignValidator contract
	 */
	modifier onlyAllowedContracts {
		address twoKeyCampaignValidator = getAddressFromTwoKeySingletonRegistry(_twoKeyCampaignValidator);
		require(ITwoKeyCampaignValidator(twoKeyCampaignValidator).isCampaignValidated(msg.sender) == true);
		_;
	}


	/**
	 * @notice			Modifier which throws if the contract sending request is not
	 *					TwoKeyFeeManager contract
	 */
	modifier onlyTwoKeyFeeManager {
		require(msg.sender == getAddressFromTwoKeySingletonRegistry(_twoKeyFeeManager));
		_;
	}


    /**
     * @notice 			Function to set initial parameters in the contract including singletones
     *
     * @param 			_twoKeySingletonRegistry is the singletons registry contract address
     * @param 			_proxyStorageContract is the address of proxy for storage for this contract
     *
     * @dev 			This function can be called only once, which will be done immediately after deployment.
     */
    function setInitialParams(
		address _twoKeySingletonRegistry,
		address _proxyStorageContract,
		uint _twoKeyTokenReleaseDate
    )
	public
	{
        require(initialized == false);

		TWO_KEY_SINGLETON_REGISTRY = _twoKeySingletonRegistry;
		PROXY_STORAGE_CONTRACT = ITwoKeyAdminStorage(_proxyStorageContract);

		setUint(_twoKeyIntegratorDefaultFeePercent,2);
		setUint(_twoKeyNetworkTaxPercent,25);
		setUint(_rewardReleaseAfter, _twoKeyTokenReleaseDate);

        initialized = true;
    }


    /**
     * @notice 			Function where only TwoKeyCongress can transfer ether to an address
     *
     * @dev 			We're recurring to address different from address 0 and value is in WEI
     *
     * @param 			to is representing receiver's address
     * @param 			amount of ether to be transferred

     */
	function transferEtherByAdmins(
		address to,
		uint256 amount
	)
	external
	onlyTwoKeyCongress
	{
		require(to != address(0));
		to.transfer(amount);
	}


	/**
	 * @notice 			Function to forward call from congress to the Maintainers Registry and add core devs
	 *
	 * @param 			_coreDevs is the array of core devs to be added to the system
	 */
	function addCoreDevsToMaintainerRegistry(
		address [] _coreDevs
	)
	external
	onlyTwoKeyCongress
	{
		address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyMaintainersRegistry);
		ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).addCoreDevs(_coreDevs);
	}


	/**
	 * @notice 			Function to forward call from congress to the Maintainers Registry and add maintainers
	 *
	 * @param 			_maintainers is the array of core devs to be added to the system
	 */
	function addMaintainersToMaintainersRegistry(
		address [] _maintainers
	)
	external
	onlyTwoKeyCongress
	{
		address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyMaintainersRegistry);
		ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).addMaintainers(_maintainers);
	}


	/**
	 * @notice 			Function to forward call from congress to the Maintainers Registry and remove core devs
	 *
	 * @param 			_coreDevs is the array of core devs to be removed from the system
	 */
	function removeCoreDevsFromMaintainersRegistry(
		address [] _coreDevs
	)
	external
	onlyTwoKeyCongress
	{
		address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyMaintainersRegistry);
		ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).removeCoreDevs(_coreDevs);
	}


	/**
	 * @notice 			Function to forward call from congress to the Maintainers Registry and remove maintainers
	 *
	 * @param 			_maintainers is the array of maintainers to be removed from the system
	 */
	function removeMaintainersFromMaintainersRegistry(
		address [] _maintainers
	)
	external
	onlyTwoKeyCongress
	{
		address twoKeyMaintainersRegistry = getAddressFromTwoKeySingletonRegistry(_twoKeyMaintainersRegistry);
		ITwoKeyMaintainersRegistry(twoKeyMaintainersRegistry).removeMaintainers(_maintainers);
	}



	/**
	 * @notice 			Function to freeze all transfers for 2KEY token
	 *					Which means that no one transfer of ERC20 2KEY can be performed
	 * @dev 			Restricted only to TwoKeyCongress contract
	 */
	function freezeTransfersInEconomy()
	external
	onlyTwoKeyCongress
	{
		address twoKeyEconomy = getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyEconomy);
		IERC20(twoKeyEconomy).freezeTransfers();
	}


	/**
	 * @notice 			Function to unfreeze all transfers for 2KEY token
	 *
	 * @dev 			Restricted only to TwoKeyCongress contract
	 */
	function unfreezeTransfersInEconomy()
	external
	onlyTwoKeyCongress
	{
		address twoKeyEconomy = getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyEconomy);
		IERC20(twoKeyEconomy).unfreezeTransfers();
	}


	/**
	 * @notice 			Function to transfer 2key tokens from the admin contract
	 * @dev 			only TwoKeyCongress can call this function
	 * @param 			_to is address representing tokens receiver
	 * @param 			_amount is the amount of tokens to be transferred
 	 */
    function transfer2KeyTokens(
		address _to,
		uint256 _amount
	)
	external
	onlyTwoKeyCongress
	returns (bool)
	{
		address twoKeyEconomy = getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyEconomy);
		bool completed = IERC20(twoKeyEconomy).transfer(_to, _amount);
		return completed;
	}

	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
	 *                                                                               *
	 *				ACCOUNTING (BOOKKEEPING) NECESSARY STUFF                         *
	 *                                                                               *
	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

	/**
	 * @notice			Function to update whenever some funds are arriving to TwoKeyAdmin
	 *					from TwoKeyFeeManager contract
	 *
	 * @param			currency is in which currency contract received asset
	 * @param			amount is the amount which is received
	 */
	function addFeesCollectedInCurrency(
		string currency,
		uint amount
	)
	public
	payable
	onlyTwoKeyFeeManager
	{
		bytes32 key = keccak256(_feesFromFeeManagerCollectedInCurrency, currency);
		uint feesCollectedFromFeeManagerInCurrency = PROXY_STORAGE_CONTRACT.getUint(key);
		PROXY_STORAGE_CONTRACT.setUint(key, feesCollectedFromFeeManagerInCurrency.add(amount));
	}


	//	/**
	//	 * @notice			Function to handle and update state every time there's an
	//	 *					income from Kyber network fees
	//	 *
	//	 * @param			amount is the amount contract have received from there
	//	 */
	//	function addFeesCollectedFromKyber(
	//		uint amount
	//	)
	//	internal
	//	{
	//		bytes32 key = keccak256(_feesCollectedFromKyber);
	//		uint feesCollectedFromKyber = PROXY_STORAGE_CONTRACT.getUint(key);
	//		PROXY_STORAGE_CONTRACT.setUint(key, feesCollectedFromKyber.add(amount));
	//	}

	//	/**
	//	 * @notice			Function to withdraw fees collected on Kyber contract to Admin contract
	//	 *
	//	 * @param			reserveContract	is the address of kyber reserve contract for 2KEY token
	//	 * @param			pricingContract is the address of kyber pricing contract for 2KEY token
	//	 */
	//	function withdrawFeesFromKyber(
	//		address reserveContract,
	//		address pricingContract
	//	)
	//	external
	//	onlyTwoKeyCongress
	//	{
	//		disableTradeInKyberInternal(reserveContract);
	//		uint availableFees = getKyberAvailableFeesOnReserve(pricingContract);
	//		withdrawTokensFromKyberReserveInternal(
	//			reserveContract,
	//			ERC20(getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyEconomy)),
	//			availableFees,
	//			address(this)
	//		);
	//		resetFeesCounterOnKyberContract(pricingContract);
	//		enableTradeInKyberInternal(reserveContract);
	//		addFeesCollectedFromKyber(availableFees);
	//	}


	/**
	 * @notice 			Function to withdraw DAI we have on TwoKeyUpgradableExchange contract
	 *
	 * @param			_amountOfTokens is the amount of the tokens we're willing to withdraw
	 *
	 * @dev 			Restricted only to TwoKeyCongress contract
	 */
	function withdrawDAIAvailableToFillReserveFromUpgradableExchange(
		uint _amountOfTokens
	)
	external
	onlyTwoKeyCongress
	{
		address twoKeyUpgradableExchange = getAddressFromTwoKeySingletonRegistry(_twoKeyUpgradableExchange);
		uint collectedDAI = IUpgradableExchange(twoKeyUpgradableExchange).withdrawDAIAvailableToFill2KEYReserve(_amountOfTokens);

		bytes32 key = keccak256(_daiCollectedFromUpgradableExchange);
		uint _amountWithdrawnCurrently = PROXY_STORAGE_CONTRACT.getUint(key);
		PROXY_STORAGE_CONTRACT.setUint(key, _amountWithdrawnCurrently.add(collectedDAI));
	}

	/**
	 * @notice			Function to withdraw moderator earnings from TwoKeyAdmin contract
	 * 					If 0 is passed as amountToBeWithdrawn, everything available will
	 *					be withdrawn
	 *
	 * @param			beneficiary is the address which is receiving tokens
	 * @param			amountToBeWithdrawn is the amount of tokens which will be withdrawn
	 */
	function withdrawModeratorEarningsFromAdmin(
		address beneficiary,
		uint amountToBeWithdrawn
	)
	public
	onlyTwoKeyCongress
	{
		uint moderatorEarningsReceived = getAmountOfTokensReceivedAsModerator();
		uint moderatorEarningsWithdrawn = getAmountOfTokensWithdrawnFromModeratorEarnings();

		if(amountToBeWithdrawn == 0) {
			amountToBeWithdrawn = moderatorEarningsReceived.sub(moderatorEarningsWithdrawn);
		} else {
			require(amountToBeWithdrawn <= moderatorEarningsReceived.sub(moderatorEarningsWithdrawn));
		}

		transferTokens(_twoKeyEconomy, beneficiary, amountToBeWithdrawn);

		bytes32 keyHash = keccak256(_amountWithdrawnFromModeratorEarningsPool);
		PROXY_STORAGE_CONTRACT.setUint(keyHash, moderatorEarningsWithdrawn.add(amountToBeWithdrawn));
	}

//	function burnModeratorEarnings()
	//TODO: Add function to BURN moderator earnings from Admin (send to 0x0)
	//TODO: For all WITHDRAW funnels if amountToBeWithdrawn = 0 then withdraw/burn everything which is there
	function withdrawFeeManagerEarningsFromAdmin(
		address beneficiary,
		string currency,
		uint amountToBeWithdrawn
	)
	public
	onlyTwoKeyCongress
	{

		uint feeManagerEarningsInCurrency = getAmountCollectedFromFeeManagerInCurrency(currency);
		uint feeManagerEarningsWithdrawn = getAmountWithdrawnFromFeeManagerEarningsInCurrency(currency);

		if(amountToBeWithdrawn == 0) {
			amountToBeWithdrawn = feeManagerEarningsInCurrency.sub(feeManagerEarningsWithdrawn);
		} else {
			require(feeManagerEarningsInCurrency.sub(feeManagerEarningsWithdrawn) >= amountToBeWithdrawn);
		}

		if(keccak256(currency) == keccak256("ETH")) {
			beneficiary.transfer(amountToBeWithdrawn);
		} else {
			transferTokens(currency, beneficiary, amountToBeWithdrawn);
		}
		PROXY_STORAGE_CONTRACT.setUint(keccak256(_amountWithdrawnFromFeeManagerPoolInCurrency,currency), feeManagerEarningsWithdrawn.add(amountToBeWithdrawn));
	}

	/**
	 * @notice			Function to withdraw earnings collected from Kyber fees from Admin contract
	 *
	 * @param			beneficiary is the address which is receiving tokens
	 * @param			amountToBeWithdrawn is the amount of tokens to be withdrawn
	 */
	function withdrawKyberFeesEarningsFromAdmin(
		address beneficiary,
		uint amountToBeWithdrawn
	)
	public
	onlyTwoKeyCongress
	{
		uint kyberTotalReceived = getAmountCollectedFromKyber();
		uint kyberTotalWithdrawn = getAmountWithdrawnFromKyberEarnings();

		if(amountToBeWithdrawn == 0) {
			amountToBeWithdrawn = kyberTotalReceived.sub(kyberTotalWithdrawn);
		} else {
			require(amountToBeWithdrawn <= kyberTotalReceived.sub(kyberTotalWithdrawn));
		}

		transferTokens(_twoKeyEconomy, beneficiary, amountToBeWithdrawn);

		PROXY_STORAGE_CONTRACT.setUint(
			keccak256(_amountWithdrawnFromKyberFeesPool),
			kyberTotalWithdrawn.add(amountToBeWithdrawn)
		);
	}

	/**
	 * @notice 			Function to withdraw DAI collected from UpgradableExchange from Admin
	 *
	 * @param			beneficiary is the address which is receiving tokens
	 * @param			amountToBeWithdrawn is the amount of tokens to be withdrawns
	 */
	function withdrawUpgradableExchangeDaiCollectedFromAdmin(
		address beneficiary,
		uint amountToBeWithdrawn
	)
	public
	onlyTwoKeyCongress
	{
		uint totalDAICollectedFromPool = getAmountCollectedInDAIFromUpgradableExchange();
		uint totalDAIWithdrawnFromPool = getAmountWithdrawnFromCollectedDAIUpgradableExchangeEarnings();

		if (amountToBeWithdrawn == 0) {
			amountToBeWithdrawn = totalDAICollectedFromPool.sub(totalDAIWithdrawnFromPool);
		} else {
			require(totalDAIWithdrawnFromPool.add(amountToBeWithdrawn) <= totalDAICollectedFromPool);
		}

		transferTokens(_DAI_TOKEN, beneficiary, amountToBeWithdrawn);

		PROXY_STORAGE_CONTRACT.setUint(keccak256(_amountWithdrawnFromCollectedDaiFromUpgradableExchange), totalDAIWithdrawnFromPool.add(amountToBeWithdrawn));
	}

	function withdrawFeesCollectedFromDistributionRewards(
		address beneficiary,
		uint amountToWithdraw
	)
	public
	onlyTwoKeyCongress
	{
		uint totalFeesCollected = getAmountOfTokensReceivedFromDistributionFees();
		uint totalFeesWithdrawn = getAmountOfTokensWithdrawnFromDistributionFees();

		if (amountToWithdraw == 0) {
			amountToWithdraw = totalFeesCollected.sub(totalFeesWithdrawn);
		} else {
			require(totalFeesWithdrawn.add(amountToWithdraw) <= totalFeesCollected);
		}

		transferTokens(_twoKeyEconomy, beneficiary, amountToWithdraw);
		PROXY_STORAGE_CONTRACT.setUint(keccak256(_amountWithdrawnFromCollectedDistributionRewards), totalFeesWithdrawn.add(amountToWithdraw));
	}

	/**
	 * @notice			Function for PPC campaigns to update received tokens
	 */
	function updateReceivedTokensAsModeratorPPC(
		uint amountOfTokens,
		address campaignPlasma
	)
	public
	onlyTwoKeyBudgetCampaignsPaymentsHandler
	{
		updateTokensReceivedAsModeratorInternal(amountOfTokens, campaignPlasma);
	}

	/**
	 * @notice			Function to update tokens received from distribution fees
	 * @param			amountOfTokens is the amount of tokens to be sent to admin
	 */
	function updateTokensReceivedFromDistributionFees(
		uint amountOfTokens
	)
	public
	onlyTwoKeyBudgetCampaignsPaymentsHandler
	{
		uint amountCollected = getAmountOfTokensReceivedFromDistributionFees();

        PROXY_STORAGE_CONTRACT.setUint(
            keccak256(_feesCollectedFromDistributionRewards),
            amountCollected.add(amountOfTokens)
        );
    }


    /**
     * @notice 			Function which will be used take the tokens from the campaign and distribute
     * 					them between itself and TwoKeyDeepFreezeTokenPool
     *
     * @param			amountOfTokens is the amount of the tokens which are for moderator rewards
      */
    function updateReceivedTokensAsModerator(
        uint amountOfTokens
    )
	public
	onlyAllowedContracts
	{
		uint moderatorTokens = updateTokensReceivedAsModeratorInternal(amountOfTokens, msg.sender);
		//Update moderator earnings to campaign
		ITwoKeyCampaign(msg.sender).updateModeratorRewards(moderatorTokens);
	}

	function updateTokensReceivedAsModeratorInternal(
		uint amountOfTokens,
		address campaignAddress
	)
	internal
	returns (uint)
	{
		// Network fee which will be taken from moderator
		uint networkFee = getDefaultNetworkTaxPercent();

		uint moderatorTokens = amountOfTokens.mul(100 - networkFee).div(100);

		bytes32 keyHashTotalRewards = keccak256(_rewardsReceivedAsModeratorTotal);
		PROXY_STORAGE_CONTRACT.setUint(keyHashTotalRewards, moderatorTokens.add((PROXY_STORAGE_CONTRACT.getUint(keyHashTotalRewards))));

		//Emit event through TwoKeyEventSource for the campaign
		ITwoKeyEventSource(getAddressFromTwoKeySingletonRegistry(_twoKeyEventSource)).emitReceivedTokensAsModerator(campaignAddress, moderatorTokens);

		//Now update twoKeyDeepFreezeTokenPool
		address twoKeyEconomy = getNonUpgradableContractAddressFromTwoKeySingletonRegistry(_twoKeyEconomy);
		address deepFreezeTokenPool = getAddressFromTwoKeySingletonRegistry("TwoKeyDeepFreezeTokenPool");

		uint tokensForDeepFreezeTokenPool = amountOfTokens.sub(moderatorTokens);

		//Transfer tokens to deep freeze token pool
		transferTokens(_twoKeyEconomy, deepFreezeTokenPool, tokensForDeepFreezeTokenPool);

		//Update contract on receiving tokens
		ITwoKeyDeepFreezeTokenPool(deepFreezeTokenPool).updateReceivedTokensForSuccessfulConversions(tokensForDeepFreezeTokenPool, campaignAddress);

		// Compute the hash for the storage for moderator earnings per campaign
		bytes32 keyHashEarningsPerCampaign = keccak256(_moderatorEarningsPerCampaign, campaignAddress);
		// Take the current earnings
		uint currentEarningsForThisCampaign = PROXY_STORAGE_CONTRACT.getUint(keyHashEarningsPerCampaign);
		// Increase them by earnings added now and store
		PROXY_STORAGE_CONTRACT.setUint(keyHashEarningsPerCampaign, currentEarningsForThisCampaign.add(moderatorTokens));

		return moderatorTokens;
	}


	//    /**
	//     * @notice          Function to call setLiquidityParams on LiquidityConversionRates.sol
	//     *                  contract, it can be called only by TwoKeyAdmin.sol contract
	//     *
	//     * @param           liquidityConversionRatesContractAddress is the address of liquidity conversion rates contract
	//                        the right address depending on environment can be found in configurationFiles/kyberAddresses.json
	//                        It's named "pricing" in the json object
	//     */
	//	function setLiquidityParametersInKyber(
	//        address liquidityConversionRatesContractAddress,
	//        uint _rInFp,
	//        uint _pMinInFp,
	//        uint _numFpBits,
	//        uint _maxCapBuyInWei,
	//        uint _maxCapSellInWei,
	//        uint _feeInBps,
	//        uint _maxTokenToEthRateInPrecision,
	//        uint _minTokenToEthRateInPrecision
	//	)
	//	public
	//	onlyTwoKeyCongress
	//	{
	//        // Call on the contract set liquidity params
	//        IKyberReserveInterface(liquidityConversionRatesContractAddress).setLiquidityParams(
	//            _rInFp,
	//            _pMinInFp,
	//            _numFpBits,
	//            _maxCapBuyInWei,
	//            _maxCapSellInWei,
	//            _feeInBps,
	//            _maxTokenToEthRateInPrecision,
	//            _minTokenToEthRateInPrecision
	//        );
	//	}
	//
	//
	//	/**
	//	 * @notice			Contract to disable trade through Kyber
	//	 *
	//	 * @param			reserveContract is the address of reserve contract
	//	 */
	//	function disableTradeInKyber(
	//		address reserveContract
	//	)
	//	external
	//	onlyTwoKeyCongress
	//	{
	//		disableTradeInKyberInternal(reserveContract);
	//	}
	//
	//	function disableTradeInKyberInternal(
	//		address reserveContract
	//	)
	//	internal
	//	{
	//		IKyberReserveInterface(reserveContract).disableTrade();
	//	}
	//
	//
	//	/**
	//	 * @notice			Contract to enable trade through Kyber
	//	 *
	//	 * @param			reserveContract is the address of reserve contract
	//	 */
	//	function enableTradeInKyber(
	//		address reserveContract
	//	)
	//	external
	//	onlyTwoKeyCongress
	//	{
	//		enableTradeInKyberInternal(reserveContract);
	//	}
	//
	//	function enableTradeInKyberInternal(
	//		address reserveContract
	//	)
	//	internal
	//	{
	//		IKyberReserveInterface(reserveContract).enableTrade();
	//	}
	//
	//	function getKyberAvailableFeesOnReserve(
	//		address pricingContract
	//	)
	//	internal
	//	view
	//	returns (uint)
	//	{
	//		return IKyberReserveInterface(pricingContract).collectedFeesInTwei();
	//	}
	//
	//
	//	function resetFeesCounterOnKyberContract(
	//		address pricingContract
	//	)
	//	internal
	//	{
	//		IKyberReserveInterface(pricingContract).resetCollectedFees();
	//	}
	//
	//
	//    /**
	//     * @notice          Function to call withdraw on KyberReserve.sol contract
	//     *                  It can be only called by TwoKeyAdmin.sol contract
	//     *
	//     * @param           kyberReserveContractAddress is the address of kyber reserve contract
	//     *                  right address depending on environment can be found in configurationFiles/kyberAddresses.json
	//                        It's named "reserve" in the json object.
	//     */
	//    function withdrawTokensFromKyberReserve(
	//        address kyberReserveContractAddress,
	//        ERC20 tokenToWithdraw,
	//        uint amountToBeWithdrawn,
	//        address receiverAddress
	//    )
	//    external
	//    onlyTwoKeyCongress
	//    {
	//		withdrawTokensFromKyberReserveInternal(
	//			kyberReserveContractAddress,
	//			tokenToWithdraw,
	//			amountToBeWithdrawn,
	//			receiverAddress
	//		);
	//    }

	//	/**
	//	 * @notice			Function to set contracts on Kyber, mostly used to swap from their
	//	 *					staging and production environments
	//	 *
	//	 * @param			kyberReserveContractAddress is our reserve contract address
	//	 * @param			kyberNetworkAddress is the address of kyber network
	//	 * @param			conversionRatesContractAddress is the address of conversion rates contract
	//	 * @param			sanityRatesContractAddress is the address of sanity rates contract
	//	 */
	//	function setContractsKyber(
	//		address kyberReserveContractAddress,
	//		address kyberNetworkAddress,
	//		address conversionRatesContractAddress,
	//		address sanityRatesContractAddress
	//	)
	//	external
	//	onlyTwoKeyCongress
	//	{
	//		IKyberReserveInterface(kyberReserveContractAddress).setContracts(
	//			kyberNetworkAddress,
	//			conversionRatesContractAddress,
	//			sanityRatesContractAddress
	//		);
	//	}

	//
	//	function withdrawTokensFromKyberReserveInternal(
	//		address kyberReserveContractAddress,
	//		ERC20 tokenToWithdraw,
	//		uint amountToBeWithdrawn,
	//		address receiverAddress
	//	)
	//	internal
	//	{
	//		IKyberReserveInterface(kyberReserveContractAddress).withdrawToken(
	//			tokenToWithdraw,
	//			amountToBeWithdrawn,
	//			receiverAddress
	//		);
	//	}


	/**
	 * @notice 			Function to get uint from the storage
	 *
	 * @param 			key is the name of the key in the storages
	 */
	function getUint(
		string key
	)
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(key));
	}


	/**
	 * @notice 			Setter for all integers we'd like to store
	 *
	 * @param 			key is the key (var name)
	 * @param 			value is the value of integer we'd like to store
	 */
	function setUint(
		string key,
		uint value
	)
	internal
	{
		PROXY_STORAGE_CONTRACT.setUint(keccak256(key), value);
	}


	/**
	 * @notice 			Getter for moderator earnings per campaign
	 *
	 * @param 			_campaignAddress is the address of the campaign we're searching for moderator earnings
 	 */
	function getModeratorEarningsPerCampaign(
		address _campaignAddress
	)
	public
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_moderatorEarningsPerCampaign, _campaignAddress));
	}


	/**
	 * @notice 			Function to return the release date when 2KEY token can be withdrawn from the
	 * 					network
	 */
	function getTwoKeyRewardsReleaseDate()
	external
	view
	returns(uint)
	{
		return getUint(_rewardReleaseAfter);
	}


	/**
	 * @notice			Getter for default moderator percent he takes
 	 */
	function getDefaultIntegratorFeePercent()
	public
	view
	returns (uint)
	{
		return getUint(_twoKeyIntegratorDefaultFeePercent);
	}



	/**
	 * @notice 			Getter for network tax percent which is taken from moderator
	 */
	function getDefaultNetworkTaxPercent()
	public
	view
	returns (uint)
	{
		return getUint(_twoKeyNetworkTaxPercent);
	}



	/**
	 * @notice			Setter in case TwoKeyCongress decides to change integrator fee percent
	 */
	function setDefaultIntegratorFeePercent(
		uint newFeePercent
	)
	external
	onlyTwoKeyCongress
	{
		PROXY_STORAGE_CONTRACT.setUint(keccak256(_twoKeyIntegratorDefaultFeePercent),newFeePercent);
	}


	/**
	 * @notice 			Getter to check how many total tokens TwoKeyAdmin received as a moderator from
	 *					various campaign contracts running on 2key.network
	 */
    function getAmountOfTokensReceivedAsModerator()
    public
    view
    returns (uint)
    {
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_rewardsReceivedAsModeratorTotal));
	}

	function getAmountOfTokensReceivedFromDistributionFees()
	public
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_feesCollectedFromDistributionRewards));
	}

	function getAmountOfTokensWithdrawnFromDistributionFees()
	public
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_amountWithdrawnFromCollectedDistributionRewards));
	}

	function getAmountCollectedFromFeeManagerInCurrency(
		string currency
	)
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_feesFromFeeManagerCollectedInCurrency, currency));
	}

	function getAmountCollectedFromKyber()
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_feesCollectedFromKyber));
	}


	function getAmountCollectedInDAIFromUpgradableExchange()
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_daiCollectedFromUpgradableExchange));
	}


	function getAmountOfTokensWithdrawnFromModeratorEarnings()
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_amountWithdrawnFromModeratorEarningsPool));
	}

	function getAmountWithdrawnFromFeeManagerEarningsInCurrency(
		string currency
	)
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_amountWithdrawnFromFeeManagerPoolInCurrency,currency));
	}

	function getAmountWithdrawnFromKyberEarnings()
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_amountWithdrawnFromKyberFeesPool));
	}

	function getAmountWithdrawnFromCollectedDAIUpgradableExchangeEarnings()
	internal
	view
	returns (uint)
	{
		return PROXY_STORAGE_CONTRACT.getUint(keccak256(_amountWithdrawnFromCollectedDaiFromUpgradableExchange));
	}

	function transferTokens(
		string token,
		address beneficiary,
		uint amount
	)
	internal
	{
		IERC20(getNonUpgradableContractAddressFromTwoKeySingletonRegistry(token)).transfer(
			beneficiary,
			amount
		);
	}

	function getAccountingReport()
	public
	view
	returns (bytes)
	{
		return (
			abi.encodePacked(
				getAmountOfTokensReceivedAsModerator(),
				getAmountCollectedFromFeeManagerInCurrency("DAI"),
				getAmountCollectedFromFeeManagerInCurrency("ETH"),
				getAmountCollectedFromFeeManagerInCurrency("2KEY"),
				getAmountCollectedFromKyber(),
				getAmountCollectedInDAIFromUpgradableExchange(),
				getAmountOfTokensReceivedFromDistributionFees(),
				getAmountOfTokensWithdrawnFromModeratorEarnings(),
				getAmountWithdrawnFromKyberEarnings(),
				getAmountWithdrawnFromCollectedDAIUpgradableExchangeEarnings(),
				getAmountWithdrawnFromFeeManagerEarningsInCurrency("DAI"),
				getAmountWithdrawnFromFeeManagerEarningsInCurrency("ETH"),
				getAmountWithdrawnFromFeeManagerEarningsInCurrency("2KEY"),
				getAmountOfTokensWithdrawnFromDistributionFees()
			)
		);
	}


	/**
	 * @notice Free ether is always accepted :)
 	 */
	function()
	external
	payable
	{

	}

}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"freezeTransfersInEconomy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amountOfTokens","type":"uint256"},{"name":"campaignPlasma","type":"address"}],"name":"updateReceivedTokensAsModeratorPPC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PROXY_STORAGE_CONTRACT","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_coreDevs","type":"address[]"}],"name":"removeCoreDevsFromMaintainersRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_coreDevs","type":"address[]"}],"name":"addCoreDevsToMaintainerRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unfreezeTransfersInEconomy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDefaultIntegratorFeePercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAmountOfTokensWithdrawnFromDistributionFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAmountOfTokensReceivedAsModerator","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maintainers","type":"address[]"}],"name":"addMaintainersToMaintainersRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDefaultNetworkTaxPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amountOfTokens","type":"uint256"}],"name":"updateReceivedTokensAsModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_twoKeySingletonRegistry","type":"address"},{"name":"_proxyStorageContract","type":"address"},{"name":"_twoKeyTokenReleaseDate","type":"uint256"}],"name":"setInitialParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_campaignAddress","type":"address"}],"name":"getModeratorEarningsPerCampaign","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amountOfTokens","type":"uint256"}],"name":"updateTokensReceivedFromDistributionFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amountToBeWithdrawn","type":"uint256"}],"name":"withdrawKyberFeesEarningsFromAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"currency","type":"string"},{"name":"amountToBeWithdrawn","type":"uint256"}],"name":"withdrawFeeManagerEarningsFromAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TWO_KEY_SINGLETON_REGISTRY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAmountOfTokensReceivedFromDistributionFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amountToBeWithdrawn","type":"uint256"}],"name":"withdrawModeratorEarningsFromAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"currency","type":"string"},{"name":"amount","type":"uint256"}],"name":"addFeesCollectedInCurrency","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer2KeyTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferEtherByAdmins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAccountingReport","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maintainers","type":"address[]"}],"name":"removeMaintainersFromMaintainersRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amountToBeWithdrawn","type":"uint256"}],"name":"withdrawUpgradableExchangeDaiCollectedFromAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTwoKeyRewardsReleaseDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"amountToWithdraw","type":"uint256"}],"name":"withdrawFeesCollectedFromDistributionRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amountOfTokens","type":"uint256"}],"name":"withdrawDAIAvailableToFillReserveFromUpgradableExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newFeePercent","type":"uint256"}],"name":"setDefaultIntegratorFeePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"}]

60806040526000600260146101000a81548160ff02191690831515021790555034801561002b57600080fd5b50615627806200003c6000396000f300608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630729d5e1146101985780630c644a1b146101af578063105005a1146101fc578063168480101461025357806322fdcc101461028e578063264198ad146102c957806327fe7641146102e057806343d884321461030b578063490e543e146103365780634c1c1a04146103615780635795aa561461039c5780635c60da1b146103c75780635fb6b16a1461041e578063627c98051461044b5780636975caee146104b85780636c4876921461050f57806375f64ebd1461053c5780637d434a89146105895780638830afa01461061c578063892d083b1461067357806391c7645a1461069e5780639ff07564146106eb5780639ffe94d914610751578063a3b688f2146107b6578063ba754f3914610803578063bfe41ddb14610893578063c4d66de8146108ce578063cbdde3d714610904578063f0cd4dce14610951578063f41ca86a1461097c578063f561cd83146109c9578063f87f9167146109f6575b005b3480156101a457600080fd5b506101ad610a23565b005b3480156101bb57600080fd5b506101fa60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5b565b005b34801561020857600080fd5b50610211610c0e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025f57600080fd5b5061028c600480360381019080803590602001908201803590602001919091929391929390505050610c34565b005b34801561029a57600080fd5b506102c7600480360381019080803590602001908201803590602001919091929391929390505050610d96565b005b3480156102d557600080fd5b506102de610ef8565b005b3480156102ec57600080fd5b506102f5611030565b6040518082815260200191505060405180910390f35b34801561031757600080fd5b5061032061109c565b6040518082815260200191505060405180910390f35b34801561034257600080fd5b5061034b611235565b6040518082815260200191505060405180910390f35b34801561036d57600080fd5b5061039a6004803603810190808035906020019082018035906020019190919293919293905050506113a7565b005b3480156103a857600080fd5b506103b1611509565b6040518082815260200191505060405180910390f35b3480156103d357600080fd5b506103dc61154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561042a57600080fd5b5061044960048036038101908080359060200190929190505050611578565b005b34801561045757600080fd5b506104b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061173b565b005b3480156104c457600080fd5b506104f9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118e5565b6040518082815260200191505060405180910390f35b34801561051b57600080fd5b5061053a60048036038101908080359060200190929190505050611a9c565b005b34801561054857600080fd5b50610587600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd8565b005b34801561059557600080fd5b5061061a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190505050611f53565b005b34801561062857600080fd5b5061063161230c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067f57600080fd5b50610688612332565b6040518082815260200191505060405180910390f35b3480156106aa57600080fd5b506106e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124cb565b005b61074f600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190505050612773565b005b34801561075d57600080fd5b5061079c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612aaa565b604051808215151515815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c51565b005b34801561080f57600080fd5b50610818612d4f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085857808201518184015260208101905061083d565b50505050905090810190601f1680156108855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561089f57600080fd5b506108cc600480360381019080803590602001908201803590602001919091929391929390505050612f84565b005b610902600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130e6565b005b34801561091057600080fd5b5061094f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613144565b005b34801561095d57600080fd5b506109666133e6565b6040518082815260200191505060405180910390f35b34801561098857600080fd5b506109c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061342b565b005b3480156109d557600080fd5b506109f4600480360381019080803590602001909291905050506136cd565b005b348015610a0257600080fd5b50610a2160048036038101908080359060200190929190505050613a9f565b005b6000610a636040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9c57600080fd5b610ada6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b90508073ffffffffffffffffffffffffffffffffffffffff1663015024606040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b5050505050565b6000610bc2606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bfe57600080fd5b610c088383613f04565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610c746040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cad57600080fd5b610ceb6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff1663a7510dd784846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b158015610d7957600080fd5b505af1158015610d8d573d6000803e3d6000fd5b50505050505050565b6000610dd66040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e0f57600080fd5b610e4d6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff166327d8fa0984846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b158015610edb57600080fd5b505af1158015610eef573d6000803e3d6000fd5b50505050505050565b6000610f386040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f7157600080fd5b610faf6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b90508073ffffffffffffffffffffffffffffffffffffffff166331c420d46040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b5050505050565b6000611097606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f7400000000000000000000000000000000000000000000000000000000000000815250614696565b905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602f81526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644469737481526020017f7269627574696f6e5265776172647300000000000000000000000000000000008152506040518082805190602001908083835b60208310151561116e5780518252602082019150602081019050602083039250611149565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156111f557600080fd5b505af1158015611209573d6000803e3d6000fd5b505050506040513d602081101561121f57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601f81526020017f72657761726473526563656976656441734d6f64657261746f72546f74616c008152506040518082805190602001908083835b6020831015156112e057805182526020820191506020810190506020830392506112bb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561136757600080fd5b505af115801561137b573d6000803e3d6000fd5b505050506040513d602081101561139157600080fd5b8101908080519060200190929190505050905090565b60006113e76040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561142057600080fd5b61145e6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff16631d4bf2c984846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b50505050505050565b60006115496040805190810160405280601781526020017f74776f4b65794e6574776f726b54617850657263656e74000000000000000000815250614696565b905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806115b96040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613dca565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b505050506040513d602081101561168457600080fd5b810190808051906020019092919050505015151415156116a357600080fd5b6116ad8333613f04565b91503373ffffffffffffffffffffffffffffffffffffffff16639dd222b4836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b50505050505050565b60001515600260149054906101000a900460ff16151514151561175d57600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611846606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f740000000000000000000000000000000000000000000000000000000000000081525060026147d5565b6118866040805190810160405280601781526020017f74776f4b65794e6574776f726b54617850657263656e7400000000000000000081525060196147d5565b6118c56040805190810160405280601281526020017f72657761726452656c6561736541667465720000000000000000000000000000815250826147d5565b6001600260146101000a81548160ff021916908315150217905550505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601c81526020017f6d6f64657261746f724561726e696e677350657243616d706169676e00000000815250846040518083805190602001908083835b602083101515611991578051825260208201915060208101905060208303925061196c565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015611a5a57600080fd5b505af1158015611a6e573d6000803e3d6000fd5b505050506040513d6020811015611a8457600080fd5b81019080805190602001909291905050509050919050565b600080611b04606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b4057600080fd5b611b48612332565b9150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602481526020017f66656573436f6c6c656374656446726f6d446973747269627574696f6e52657781526020017f61726473000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515611c1a5780518252602082019150602081019050602083039250611bf5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611c5a86866148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015611cbb57600080fd5b505af1158015611ccf573d6000803e3d6000fd5b50505050505050565b600080611d196040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d5257600080fd5b611d5a614913565b9150611d64614a85565b90506000831415611d8957611d828183614bf790919063ffffffff16565b9250611dab565b611d9c8183614bf790919063ffffffff16565b8311151515611daa57600080fd5b5b611deb6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a6040805190810160405280602081526020017f616d6f756e7457697468647261776e46726f6d4b7962657246656573506f6f6c8152506040518082805190602001908083835b602083101515611e945780518252602082019150602081019050602083039250611e6f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611ed486856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b5050505050505050565b600080611f946040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fcd57600080fd5b611fd684614cff565b9150611fe184614eef565b9050600083141561200657611fff8183614bf790919063ffffffff16565b9250612028565b8261201a8284614bf790919063ffffffff16565b1015151561202757600080fd5b5b60405180807f45544800000000000000000000000000000000000000000000000000000000008152506003019050604051809103902060001916846040518082805190602001908083835b6020831015156120985780518252602082019150602081019050602083039250612073565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141561211b578473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015612115573d6000803e3d6000fd5b50612127565b612126848685614c13565b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602b81526020017f616d6f756e7457697468647261776e46726f6d4665654d616e61676572506f6f81526020017f6c496e43757272656e6379000000000000000000000000000000000000000000815250866040518083805190602001908083835b6020831015156121f857805182526020820191506020810190506020830392506121d3565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310151561224b5780518252602082019150602081019050602083039250612226565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051809103902061228c86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156122ed57600080fd5b505af1158015612301573d6000803e3d6000fd5b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602481526020017f66656573436f6c6c656374656446726f6d446973747269627574696f6e52657781526020017f61726473000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b60208310151561240457805182526020820191506020810190506020830392506123df565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506040513d60208110156124b557600080fd5b8101908080519060200190929190505050905090565b600080600061250e6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561254757600080fd5b61254f611235565b92506125596150df565b9150600084141561257e576125778284614bf790919063ffffffff16565b93506125a0565b6125918284614bf790919063ffffffff16565b841115151561259f57600080fd5b5b6125e06040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508686614c13565b606060405190810160405280602881526020017f616d6f756e7457697468647261776e46726f6d4d6f64657261746f724561726e81526020017f696e6773506f6f6c0000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515612672578051825260208201915060208101905060208303925061264d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a826126f387866148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561275457600080fd5b505af1158015612768573d6000803e3d6000fd5b505050505050505050565b6000806127b46040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613dca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ed57600080fd5b606060405190810160405280602581526020017f6665657346726f6d4665654d616e61676572436f6c6c6563746564496e43757281526020017f72656e6379000000000000000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515612880578051825260208201915060208101905060208303925061285b565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831015156128d357805182526020820191506020810190506020830392506128ae565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83612a2b86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b5050505050505050565b6000806000612aed6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b2657600080fd5b612b646040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b91508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612c0957600080fd5b505af1158015612c1d573d6000803e3d6000fd5b505050506040513d6020811015612c3357600080fd5b81019080805190602001909291905050509050809250505092915050565b612c8f6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cc857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d0457600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d4a573d6000803e3d6000fd5b505050565b6060612d59611235565b612d976040805190810160405280600381526020017f4441490000000000000000000000000000000000000000000000000000000000815250614cff565b612dd56040805190810160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250614cff565b612e136040805190810160405280600481526020017f324b455900000000000000000000000000000000000000000000000000000000815250614cff565b612e1b614913565b612e23615278565b612e2b612332565b612e336150df565b612e3b614a85565b612e43615411565b612e816040805190810160405280600381526020017f4441490000000000000000000000000000000000000000000000000000000000815250614eef565b612ebf6040805190810160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250614eef565b612efd6040805190810160405280600481526020017f324b455900000000000000000000000000000000000000000000000000000000815250614eef565b612f0561109c565b604051602001808f81526020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e505050505050505050505050505050604051602081830303815290604052905090565b6000612fc46040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ffd57600080fd5b61303b6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff1663705a483b84846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b1580156130c957600080fd5b505af11580156130dd573d6000803e3d6000fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314157600080fd5b50565b6000806131856040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131be57600080fd5b6131c6615278565b91506131d0615411565b905060008314156131f5576131ee8183614bf790919063ffffffff16565b9250613217565b8161320984836148f490919063ffffffff16565b1115151561321657600080fd5b5b6132576040805190810160405280600381526020017f44414900000000000000000000000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280603581526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644461694681526020017f726f6d55706772616461626c6545786368616e676500000000000000000000008152506040518082805190602001908083835b6020831015156133275780518252602082019150602081019050602083039250613302565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902061336786856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156133c857600080fd5b505af11580156133dc573d6000803e3d6000fd5b5050505050505050565b60006134266040805190810160405280601281526020017f72657761726452656c6561736541667465720000000000000000000000000000815250614696565b905090565b60008061346c6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134a557600080fd5b6134ad612332565b91506134b761109c565b905060008314156134dc576134d58183614bf790919063ffffffff16565b92506134fe565b816134f084836148f490919063ffffffff16565b111515156134fd57600080fd5b5b61353e6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602f81526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644469737481526020017f7269627574696f6e5265776172647300000000000000000000000000000000008152506040518082805190602001908083835b60208310151561360e57805182526020820191506020810190506020830392506135e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902061364e86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156136af57600080fd5b505af11580156136c3573d6000803e3d6000fd5b5050505050505050565b6000806000806137116040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561374a57600080fd5b6137886040805190810160405280601881526020017f54776f4b657955706772616461626c6545786368616e67650000000000000000815250613dca565b93508373ffffffffffffffffffffffffffffffffffffffff1663edacdbee866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156137f957600080fd5b505af115801561380d573d6000803e3d6000fd5b505050506040513d602081101561382357600080fd5b81019080805190602001909291905050509250606060405190810160405280602281526020017f646169436f6c6c656374656446726f6d55706772616461626c6545786368616e81526020017f67650000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b6020831015156138c857805182526020820191506020810190506020830392506138a3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050506040513d60208110156139ba57600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83613a1f86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015613a8057600080fd5b505af1158015613a94573d6000803e3d6000fd5b505050505050505050565b613add6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b1657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f74000000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515613be65780518252602082019150602081019050602083039250613bc1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015613c7557600080fd5b505af1158015613c89573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f716c79a836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3c578082015181840152602081019050613d21565b50505050905090810190601f168015613d695780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613d8857600080fd5b505af1158015613d9c573d6000803e3d6000fd5b505050506040513d6020811015613db257600080fd5b81019080805190602001909291905050509050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db7a6d90836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e76578082015181840152602081019050613e5b565b50505050905090810190601f168015613ea35780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613ec257600080fd5b505af1158015613ed6573d6000803e3d6000fd5b505050506040513d6020811015613eec57600080fd5b81019080805190602001909291905050509050919050565b6000806000806000806000806000613f1a611509565b9750613f456064613f378a6064038e6155aa90919063ffffffff16565b6155e590919063ffffffff16565b96506040805190810160405280601f81526020017f72657761726473526563656976656441734d6f64657261746f72546f74616c008152506040518082805190602001908083835b602083101515613fb25780518252602082019150602081019050602083039250613f8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a87614106600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f58b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156140bc57600080fd5b505af11580156140d0573d6000803e3d6000fd5b505050506040513d60208110156140e657600080fd5b81019080805190602001909291905050508b6148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561416757600080fd5b505af115801561417b573d6000803e3d6000fd5b505050506141bd6040805190810160405280601181526020017f54776f4b65794576656e74536f75726365000000000000000000000000000000815250613dca565b73ffffffffffffffffffffffffffffffffffffffff16630ab6839a8b896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561425f57600080fd5b505af1158015614273573d6000803e3d6000fd5b505050506142b56040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b94506142f56040805190810160405280601981526020017f54776f4b657944656570467265657a65546f6b656e506f6f6c00000000000000815250613dca565b935061430a878c614bf790919063ffffffff16565b925061434c6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b8373ffffffffffffffffffffffffffffffffffffffff16639da1d2c1848c6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156143ef57600080fd5b505af1158015614403573d6000803e3d6000fd5b505050506040805190810160405280601c81526020017f6d6f64657261746f724561726e696e677350657243616d706169676e000000008152508a6040518083805190602001908083835b602083101515614473578051825260208201915060208101905060208303925061444e565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561457d57600080fd5b505af1158015614591573d6000803e3d6000fd5b505050506040513d60208110156145a757600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a8361460c8a856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561466d57600080fd5b505af1158015614681573d6000803e3d6000fd5b50505050869850505050505050505092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518082805190602001908083835b60208310151561470c57805182526020820191506020810190506020830392506146e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561479357600080fd5b505af11580156147a7573d6000803e3d6000fd5b505050506040513d60208110156147bd57600080fd5b81019080805190602001909291905050509050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040518082805190602001908083835b6020831015156148495780518252602082019150602081019050602083039250614824565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156148d857600080fd5b505af11580156148ec573d6000803e3d6000fd5b505050505050565b6000818301905082811015151561490a57600080fd5b80905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601681526020017f66656573436f6c6c656374656446726f6d4b79626572000000000000000000008152506040518082805190602001908083835b6020831015156149be5780518252602082019150602081019050602083039250614999565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614a4557600080fd5b505af1158015614a59573d6000803e3d6000fd5b505050506040513d6020811015614a6f57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280602081526020017f616d6f756e7457697468647261776e46726f6d4b7962657246656573506f6f6c8152506040518082805190602001908083835b602083101515614b305780518252602082019150602081019050602083039250614b0b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614bb757600080fd5b505af1158015614bcb573d6000803e3d6000fd5b505050506040513d6020811015614be157600080fd5b8101908080519060200190929190505050905090565b6000828211151515614c0857600080fd5b818303905092915050565b614c1c83613c90565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614cbe57600080fd5b505af1158015614cd2573d6000803e3d6000fd5b505050506040513d6020811015614ce857600080fd5b810190808051906020019092919050505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602581526020017f6665657346726f6d4665654d616e61676572436f6c6c6563746564496e43757281526020017f72656e6379000000000000000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515614dd25780518252602082019150602081019050602083039250614dad565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083101515614e255780518252602082019150602081019050602083039250614e00565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614ead57600080fd5b505af1158015614ec1573d6000803e3d6000fd5b505050506040513d6020811015614ed757600080fd5b81019080805190602001909291905050509050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602b81526020017f616d6f756e7457697468647261776e46726f6d4665654d616e61676572506f6f81526020017f6c496e43757272656e6379000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515614fc25780518252602082019150602081019050602083039250614f9d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831015156150155780518252602082019150602081019050602083039250614ff0565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561509d57600080fd5b505af11580156150b1573d6000803e3d6000fd5b505050506040513d60208110156150c757600080fd5b81019080805190602001909291905050509050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602881526020017f616d6f756e7457697468647261776e46726f6d4d6f64657261746f724561726e81526020017f696e6773506f6f6c0000000000000000000000000000000000000000000000008152506040518082805190602001908083835b6020831015156151b1578051825260208201915060208101905060208303925061518c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561523857600080fd5b505af115801561524c573d6000803e3d6000fd5b505050506040513d602081101561526257600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602281526020017f646169436f6c6c656374656446726f6d55706772616461626c6545786368616e81526020017f67650000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b60208310151561534a5780518252602082019150602081019050602083039250615325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156153d157600080fd5b505af11580156153e5573d6000803e3d6000fd5b505050506040513d60208110156153fb57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280603581526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644461694681526020017f726f6d55706772616461626c6545786368616e676500000000000000000000008152506040518082805190602001908083835b6020831015156154e357805182526020820191506020810190506020830392506154be565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561556a57600080fd5b505af115801561557e573d6000803e3d6000fd5b505050506040513d602081101561559457600080fd5b8101908080519060200190929190505050905090565b6000808314156155bd57600090506155df565b81830290508183828115156155ce57fe5b041415156155db57600080fd5b8090505b92915050565b600081838115156155f257fe5b049050929150505600a165627a7a7230582066acba4aa8959070dc1c29c4a65f9a6c7b5c80c42b0b36cbca35d186cb97f6980029

Deployed Bytecode

0x608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630729d5e1146101985780630c644a1b146101af578063105005a1146101fc578063168480101461025357806322fdcc101461028e578063264198ad146102c957806327fe7641146102e057806343d884321461030b578063490e543e146103365780634c1c1a04146103615780635795aa561461039c5780635c60da1b146103c75780635fb6b16a1461041e578063627c98051461044b5780636975caee146104b85780636c4876921461050f57806375f64ebd1461053c5780637d434a89146105895780638830afa01461061c578063892d083b1461067357806391c7645a1461069e5780639ff07564146106eb5780639ffe94d914610751578063a3b688f2146107b6578063ba754f3914610803578063bfe41ddb14610893578063c4d66de8146108ce578063cbdde3d714610904578063f0cd4dce14610951578063f41ca86a1461097c578063f561cd83146109c9578063f87f9167146109f6575b005b3480156101a457600080fd5b506101ad610a23565b005b3480156101bb57600080fd5b506101fa60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5b565b005b34801561020857600080fd5b50610211610c0e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025f57600080fd5b5061028c600480360381019080803590602001908201803590602001919091929391929390505050610c34565b005b34801561029a57600080fd5b506102c7600480360381019080803590602001908201803590602001919091929391929390505050610d96565b005b3480156102d557600080fd5b506102de610ef8565b005b3480156102ec57600080fd5b506102f5611030565b6040518082815260200191505060405180910390f35b34801561031757600080fd5b5061032061109c565b6040518082815260200191505060405180910390f35b34801561034257600080fd5b5061034b611235565b6040518082815260200191505060405180910390f35b34801561036d57600080fd5b5061039a6004803603810190808035906020019082018035906020019190919293919293905050506113a7565b005b3480156103a857600080fd5b506103b1611509565b6040518082815260200191505060405180910390f35b3480156103d357600080fd5b506103dc61154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561042a57600080fd5b5061044960048036038101908080359060200190929190505050611578565b005b34801561045757600080fd5b506104b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061173b565b005b3480156104c457600080fd5b506104f9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118e5565b6040518082815260200191505060405180910390f35b34801561051b57600080fd5b5061053a60048036038101908080359060200190929190505050611a9c565b005b34801561054857600080fd5b50610587600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd8565b005b34801561059557600080fd5b5061061a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190505050611f53565b005b34801561062857600080fd5b5061063161230c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067f57600080fd5b50610688612332565b6040518082815260200191505060405180910390f35b3480156106aa57600080fd5b506106e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124cb565b005b61074f600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929080359060200190929190505050612773565b005b34801561075d57600080fd5b5061079c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612aaa565b604051808215151515815260200191505060405180910390f35b3480156107c257600080fd5b50610801600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c51565b005b34801561080f57600080fd5b50610818612d4f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085857808201518184015260208101905061083d565b50505050905090810190601f1680156108855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561089f57600080fd5b506108cc600480360381019080803590602001908201803590602001919091929391929390505050612f84565b005b610902600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130e6565b005b34801561091057600080fd5b5061094f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613144565b005b34801561095d57600080fd5b506109666133e6565b6040518082815260200191505060405180910390f35b34801561098857600080fd5b506109c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061342b565b005b3480156109d557600080fd5b506109f4600480360381019080803590602001909291905050506136cd565b005b348015610a0257600080fd5b50610a2160048036038101908080359060200190929190505050613a9f565b005b6000610a636040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9c57600080fd5b610ada6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b90508073ffffffffffffffffffffffffffffffffffffffff1663015024606040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b5050505050565b6000610bc2606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bfe57600080fd5b610c088383613f04565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610c746040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cad57600080fd5b610ceb6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff1663a7510dd784846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b158015610d7957600080fd5b505af1158015610d8d573d6000803e3d6000fd5b50505050505050565b6000610dd66040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e0f57600080fd5b610e4d6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff166327d8fa0984846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b158015610edb57600080fd5b505af1158015610eef573d6000803e3d6000fd5b50505050505050565b6000610f386040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f7157600080fd5b610faf6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b90508073ffffffffffffffffffffffffffffffffffffffff166331c420d46040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b5050505050565b6000611097606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f7400000000000000000000000000000000000000000000000000000000000000815250614696565b905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602f81526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644469737481526020017f7269627574696f6e5265776172647300000000000000000000000000000000008152506040518082805190602001908083835b60208310151561116e5780518252602082019150602081019050602083039250611149565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156111f557600080fd5b505af1158015611209573d6000803e3d6000fd5b505050506040513d602081101561121f57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601f81526020017f72657761726473526563656976656441734d6f64657261746f72546f74616c008152506040518082805190602001908083835b6020831015156112e057805182526020820191506020810190506020830392506112bb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561136757600080fd5b505af115801561137b573d6000803e3d6000fd5b505050506040513d602081101561139157600080fd5b8101908080519060200190929190505050905090565b60006113e76040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561142057600080fd5b61145e6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff16631d4bf2c984846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b50505050505050565b60006115496040805190810160405280601781526020017f74776f4b65794e6574776f726b54617850657263656e74000000000000000000815250614696565b905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806115b96040805190810160405280601781526020017f54776f4b657943616d706169676e56616c696461746f72000000000000000000815250613dca565b9050600115158173ffffffffffffffffffffffffffffffffffffffff166371c6a34f336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b505050506040513d602081101561168457600080fd5b810190808051906020019092919050505015151415156116a357600080fd5b6116ad8333613f04565b91503373ffffffffffffffffffffffffffffffffffffffff16639dd222b4836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561171e57600080fd5b505af1158015611732573d6000803e3d6000fd5b50505050505050565b60001515600260149054906101000a900460ff16151514151561175d57600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611846606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f740000000000000000000000000000000000000000000000000000000000000081525060026147d5565b6118866040805190810160405280601781526020017f74776f4b65794e6574776f726b54617850657263656e7400000000000000000081525060196147d5565b6118c56040805190810160405280601281526020017f72657761726452656c6561736541667465720000000000000000000000000000815250826147d5565b6001600260146101000a81548160ff021916908315150217905550505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601c81526020017f6d6f64657261746f724561726e696e677350657243616d706169676e00000000815250846040518083805190602001908083835b602083101515611991578051825260208201915060208101905060208303925061196c565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015611a5a57600080fd5b505af1158015611a6e573d6000803e3d6000fd5b505050506040513d6020811015611a8457600080fd5b81019080805190602001909291905050509050919050565b600080611b04606060405190810160405280602481526020017f54776f4b657942756467657443616d706169676e735061796d656e747348616e81526020017f646c657200000000000000000000000000000000000000000000000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b4057600080fd5b611b48612332565b9150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602481526020017f66656573436f6c6c656374656446726f6d446973747269627574696f6e52657781526020017f61726473000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515611c1a5780518252602082019150602081019050602083039250611bf5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611c5a86866148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015611cbb57600080fd5b505af1158015611ccf573d6000803e3d6000fd5b50505050505050565b600080611d196040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d5257600080fd5b611d5a614913565b9150611d64614a85565b90506000831415611d8957611d828183614bf790919063ffffffff16565b9250611dab565b611d9c8183614bf790919063ffffffff16565b8311151515611daa57600080fd5b5b611deb6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a6040805190810160405280602081526020017f616d6f756e7457697468647261776e46726f6d4b7962657246656573506f6f6c8152506040518082805190602001908083835b602083101515611e945780518252602082019150602081019050602083039250611e6f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611ed486856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b5050505050505050565b600080611f946040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fcd57600080fd5b611fd684614cff565b9150611fe184614eef565b9050600083141561200657611fff8183614bf790919063ffffffff16565b9250612028565b8261201a8284614bf790919063ffffffff16565b1015151561202757600080fd5b5b60405180807f45544800000000000000000000000000000000000000000000000000000000008152506003019050604051809103902060001916846040518082805190602001908083835b6020831015156120985780518252602082019150602081019050602083039250612073565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141561211b578473ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015612115573d6000803e3d6000fd5b50612127565b612126848685614c13565b5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602b81526020017f616d6f756e7457697468647261776e46726f6d4665654d616e61676572506f6f81526020017f6c496e43757272656e6379000000000000000000000000000000000000000000815250866040518083805190602001908083835b6020831015156121f857805182526020820191506020810190506020830392506121d3565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310151561224b5780518252602082019150602081019050602083039250612226565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051809103902061228c86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156122ed57600080fd5b505af1158015612301573d6000803e3d6000fd5b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602481526020017f66656573436f6c6c656374656446726f6d446973747269627574696f6e52657781526020017f61726473000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b60208310151561240457805182526020820191506020810190506020830392506123df565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506040513d60208110156124b557600080fd5b8101908080519060200190929190505050905090565b600080600061250e6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561254757600080fd5b61254f611235565b92506125596150df565b9150600084141561257e576125778284614bf790919063ffffffff16565b93506125a0565b6125918284614bf790919063ffffffff16565b841115151561259f57600080fd5b5b6125e06040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508686614c13565b606060405190810160405280602881526020017f616d6f756e7457697468647261776e46726f6d4d6f64657261746f724561726e81526020017f696e6773506f6f6c0000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515612672578051825260208201915060208101905060208303925061264d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a826126f387866148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561275457600080fd5b505af1158015612768573d6000803e3d6000fd5b505050505050505050565b6000806127b46040805190810160405280601081526020017f54776f4b65794665654d616e6167657200000000000000000000000000000000815250613dca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ed57600080fd5b606060405190810160405280602581526020017f6665657346726f6d4665654d616e61676572436f6c6c6563746564496e43757281526020017f72656e6379000000000000000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515612880578051825260208201915060208101905060208303925061285b565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831015156128d357805182526020820191506020810190506020830392506128ae565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83612a2b86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b5050505050505050565b6000806000612aed6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b2657600080fd5b612b646040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b91508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612c0957600080fd5b505af1158015612c1d573d6000803e3d6000fd5b505050506040513d6020811015612c3357600080fd5b81019080805190602001909291905050509050809250505092915050565b612c8f6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cc857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d0457600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612d4a573d6000803e3d6000fd5b505050565b6060612d59611235565b612d976040805190810160405280600381526020017f4441490000000000000000000000000000000000000000000000000000000000815250614cff565b612dd56040805190810160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250614cff565b612e136040805190810160405280600481526020017f324b455900000000000000000000000000000000000000000000000000000000815250614cff565b612e1b614913565b612e23615278565b612e2b612332565b612e336150df565b612e3b614a85565b612e43615411565b612e816040805190810160405280600381526020017f4441490000000000000000000000000000000000000000000000000000000000815250614eef565b612ebf6040805190810160405280600381526020017f4554480000000000000000000000000000000000000000000000000000000000815250614eef565b612efd6040805190810160405280600481526020017f324b455900000000000000000000000000000000000000000000000000000000815250614eef565b612f0561109c565b604051602001808f81526020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e505050505050505050505050505050604051602081830303815290604052905090565b6000612fc46040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ffd57600080fd5b61303b6040805190810160405280601981526020017f54776f4b65794d61696e7461696e657273526567697374727900000000000000815250613dca565b90508073ffffffffffffffffffffffffffffffffffffffff1663705a483b84846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825284848281815260200192506020028082843782019150509350505050600060405180830381600087803b1580156130c957600080fd5b505af11580156130dd573d6000803e3d6000fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314157600080fd5b50565b6000806131856040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156131be57600080fd5b6131c6615278565b91506131d0615411565b905060008314156131f5576131ee8183614bf790919063ffffffff16565b9250613217565b8161320984836148f490919063ffffffff16565b1115151561321657600080fd5b5b6132576040805190810160405280600381526020017f44414900000000000000000000000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280603581526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644461694681526020017f726f6d55706772616461626c6545786368616e676500000000000000000000008152506040518082805190602001908083835b6020831015156133275780518252602082019150602081019050602083039250613302565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902061336786856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156133c857600080fd5b505af11580156133dc573d6000803e3d6000fd5b5050505050505050565b60006134266040805190810160405280601281526020017f72657761726452656c6561736541667465720000000000000000000000000000815250614696565b905090565b60008061346c6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134a557600080fd5b6134ad612332565b91506134b761109c565b905060008314156134dc576134d58183614bf790919063ffffffff16565b92506134fe565b816134f084836148f490919063ffffffff16565b111515156134fd57600080fd5b5b61353e6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602f81526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644469737481526020017f7269627574696f6e5265776172647300000000000000000000000000000000008152506040518082805190602001908083835b60208310151561360e57805182526020820191506020810190506020830392506135e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902061364e86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156136af57600080fd5b505af11580156136c3573d6000803e3d6000fd5b5050505050505050565b6000806000806137116040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561374a57600080fd5b6137886040805190810160405280601881526020017f54776f4b657955706772616461626c6545786368616e67650000000000000000815250613dca565b93508373ffffffffffffffffffffffffffffffffffffffff1663edacdbee866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156137f957600080fd5b505af115801561380d573d6000803e3d6000fd5b505050506040513d602081101561382357600080fd5b81019080805190602001909291905050509250606060405190810160405280602281526020017f646169436f6c6c656374656446726f6d55706772616461626c6545786368616e81526020017f67650000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b6020831015156138c857805182526020820191506020810190506020830392506138a3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050506040513d60208110156139ba57600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83613a1f86856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015613a8057600080fd5b505af1158015613a94573d6000803e3d6000fd5b505050505050505050565b613add6040805190810160405280600e81526020017f54776f4b6579436f6e6772657373000000000000000000000000000000000000815250613c90565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b1657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a606060405190810160405280602181526020017f74776f4b6579496e7465677261746f7244656661756c7446656550657263656e81526020017f74000000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b602083101515613be65780518252602082019150602081019050602083039250613bc1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b158015613c7557600080fd5b505af1158015613c89573d6000803e3d6000fd5b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f716c79a836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3c578082015181840152602081019050613d21565b50505050905090810190601f168015613d695780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613d8857600080fd5b505af1158015613d9c573d6000803e3d6000fd5b505050506040513d6020811015613db257600080fd5b81019080805190602001909291905050509050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db7a6d90836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e76578082015181840152602081019050613e5b565b50505050905090810190601f168015613ea35780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015613ec257600080fd5b505af1158015613ed6573d6000803e3d6000fd5b505050506040513d6020811015613eec57600080fd5b81019080805190602001909291905050509050919050565b6000806000806000806000806000613f1a611509565b9750613f456064613f378a6064038e6155aa90919063ffffffff16565b6155e590919063ffffffff16565b96506040805190810160405280601f81526020017f72657761726473526563656976656441734d6f64657261746f72546f74616c008152506040518082805190602001908083835b602083101515613fb25780518252602082019150602081019050602083039250613f8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a87614106600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f58b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156140bc57600080fd5b505af11580156140d0573d6000803e3d6000fd5b505050506040513d60208110156140e657600080fd5b81019080805190602001909291905050508b6148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561416757600080fd5b505af115801561417b573d6000803e3d6000fd5b505050506141bd6040805190810160405280601181526020017f54776f4b65794576656e74536f75726365000000000000000000000000000000815250613dca565b73ffffffffffffffffffffffffffffffffffffffff16630ab6839a8b896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561425f57600080fd5b505af1158015614273573d6000803e3d6000fd5b505050506142b56040805190810160405280600d81526020017f54776f4b657945636f6e6f6d7900000000000000000000000000000000000000815250613c90565b94506142f56040805190810160405280601981526020017f54776f4b657944656570467265657a65546f6b656e506f6f6c00000000000000815250613dca565b935061430a878c614bf790919063ffffffff16565b925061434c6040805190810160405280600d81526020017f54776f4b657945636f6e6f6d79000000000000000000000000000000000000008152508585614c13565b8373ffffffffffffffffffffffffffffffffffffffff16639da1d2c1848c6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156143ef57600080fd5b505af1158015614403573d6000803e3d6000fd5b505050506040805190810160405280601c81526020017f6d6f64657261746f724561726e696e677350657243616d706169676e000000008152508a6040518083805190602001908083835b602083101515614473578051825260208201915060208101905060208303925061444e565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390209150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561457d57600080fd5b505af1158015614591573d6000803e3d6000fd5b505050506040513d60208110156145a757600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a8361460c8a856148f490919063ffffffff16565b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b15801561466d57600080fd5b505af1158015614681573d6000803e3d6000fd5b50505050869850505050505050505092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518082805190602001908083835b60208310151561470c57805182526020820191506020810190506020830392506146e7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561479357600080fd5b505af11580156147a7573d6000803e3d6000fd5b505050506040513d60208110156147bd57600080fd5b81019080805190602001909291905050509050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040518082805190602001908083835b6020831015156148495780518252602082019150602081019050602083039250614824565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050600060405180830381600087803b1580156148d857600080fd5b505af11580156148ec573d6000803e3d6000fd5b505050505050565b6000818301905082811015151561490a57600080fd5b80905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280601681526020017f66656573436f6c6c656374656446726f6d4b79626572000000000000000000008152506040518082805190602001908083835b6020831015156149be5780518252602082019150602081019050602083039250614999565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614a4557600080fd5b505af1158015614a59573d6000803e3d6000fd5b505050506040513d6020811015614a6f57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f56040805190810160405280602081526020017f616d6f756e7457697468647261776e46726f6d4b7962657246656573506f6f6c8152506040518082805190602001908083835b602083101515614b305780518252602082019150602081019050602083039250614b0b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614bb757600080fd5b505af1158015614bcb573d6000803e3d6000fd5b505050506040513d6020811015614be157600080fd5b8101908080519060200190929190505050905090565b6000828211151515614c0857600080fd5b818303905092915050565b614c1c83613c90565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614cbe57600080fd5b505af1158015614cd2573d6000803e3d6000fd5b505050506040513d6020811015614ce857600080fd5b810190808051906020019092919050505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602581526020017f6665657346726f6d4665654d616e61676572436f6c6c6563746564496e43757281526020017f72656e6379000000000000000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515614dd25780518252602082019150602081019050602083039250614dad565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083101515614e255780518252602082019150602081019050602083039250614e00565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b158015614ead57600080fd5b505af1158015614ec1573d6000803e3d6000fd5b505050506040513d6020811015614ed757600080fd5b81019080805190602001909291905050509050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602b81526020017f616d6f756e7457697468647261776e46726f6d4665654d616e61676572506f6f81526020017f6c496e43757272656e6379000000000000000000000000000000000000000000815250846040518083805190602001908083835b602083101515614fc25780518252602082019150602081019050602083039250614f9d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831015156150155780518252602082019150602081019050602083039250614ff0565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561509d57600080fd5b505af11580156150b1573d6000803e3d6000fd5b505050506040513d60208110156150c757600080fd5b81019080805190602001909291905050509050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602881526020017f616d6f756e7457697468647261776e46726f6d4d6f64657261746f724561726e81526020017f696e6773506f6f6c0000000000000000000000000000000000000000000000008152506040518082805190602001908083835b6020831015156151b1578051825260208201915060208101905060208303925061518c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561523857600080fd5b505af115801561524c573d6000803e3d6000fd5b505050506040513d602081101561526257600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280602281526020017f646169436f6c6c656374656446726f6d55706772616461626c6545786368616e81526020017f67650000000000000000000000000000000000000000000000000000000000008152506040518082805190602001908083835b60208310151561534a5780518252602082019150602081019050602083039250615325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1580156153d157600080fd5b505af11580156153e5573d6000803e3d6000fd5b505050506040513d60208110156153fb57600080fd5b8101908080519060200190929190505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5606060405190810160405280603581526020017f616d6f756e7457697468647261776e46726f6d436f6c6c65637465644461694681526020017f726f6d55706772616461626c6545786368616e676500000000000000000000008152506040518082805190602001908083835b6020831015156154e357805182526020820191506020810190506020830392506154be565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15801561556a57600080fd5b505af115801561557e573d6000803e3d6000fd5b505050506040513d602081101561559457600080fd5b8101908080519060200190929190505050905090565b6000808314156155bd57600090506155df565b81830290508183828115156155ce57fe5b041415156155db57600080fd5b8090505b92915050565b600081838115156155f257fe5b049050929150505600a165627a7a7230582066acba4aa8959070dc1c29c4a65f9a6c7b5c80c42b0b36cbca35d186cb97f6980029

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.