Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- ifoodToken
- Optimization enabled
- false
- Compiler version
- v0.4.18+commit.9cf6e910
- Verified at
- 2026-02-06T01:23:25.032743Z
ifoodToken.sol
pragma solidity ^0.4.18;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
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 c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 {
uint256 public totalSupply;
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract ifoodToken is ERC20 {
using SafeMath for uint256;
// the controller of minting
address public ifoodDev = 0x4E471f031D03E5856125993dc3D59520229141Ce;
// the controller of approving of minting and withdraw tokens
address public ifoodCommunity = 0x0d72e931932356FcCf8CFF3f83390e24BE72771d;
struct TokensWithLock {
uint256 value;
uint256 blockNumber;
}
// Balances for each account
mapping(address => uint256) balances;
// Tokens with time lock
// Only when the tokens' blockNumber is less than current block number,
// can the tokens be minted to the owner
mapping(address => TokensWithLock) lockTokens;
// Owner of account approves the transfer of an amount to another account
mapping(address => mapping (address => uint256)) allowed;
// Token Info
string public name = "Ifoods Token";
string public symbol = "IFOOD";
uint8 public decimals = 18;
// Token Cap
uint256 public totalSupplyCap = 10**10 * 10**uint256(decimals);
// True if mintingFinished
bool public mintingFinished = false;
// The block number when deploy
uint256 public deployBlockNumber = getCurrentBlockNumber();
// The min threshold of lock time
uint256 public constant TIMETHRESHOLD = 7200;
// The lock time of minted tokens
uint256 public durationOfLock = 7200;
// True if transfers are allowed
bool public transferable = false;
// True if the transferable can be change
bool public canSetTransferable = true;
modifier canMint() {
require(!mintingFinished);
_;
}
modifier only(address _address) {
require(msg.sender == _address);
_;
}
modifier nonZeroAddress(address _address) {
require(_address != address(0));
_;
}
modifier canTransfer() {
require(transferable == true);
_;
}
event SetDurationOfLock(address indexed _caller);
event ApproveMintTokens(address indexed _owner, uint256 _amount);
event WithdrawMintTokens(address indexed _owner, uint256 _amount);
event MintTokens(address indexed _owner, uint256 _amount);
event BurnTokens(address indexed _owner, uint256 _amount);
event MintFinished(address indexed _caller);
event SetTransferable(address indexed _address, bool _transferable);
event SetifoodDevAddress(address indexed _old, address indexed _new);
event SetifoodCommunityAddress(address indexed _old, address indexed _new);
event DisableSetTransferable(address indexed _address, bool _canSetTransferable);
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value) canTransfer public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value) canTransfer public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
Transfer(_from, _to, _value);
return true;
}
// Allow `_spender` to withdraw from your account, multiple times.
function approve(address _spender, uint _value) public returns (bool success) {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender, 0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) {
revert();
}
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Enables token holders to transfer their tokens freely if true
* @param _transferable True if transfers are allowed
*/
function setTransferable(bool _transferable) only(ifoodDev) public {
require(canSetTransferable == true);
transferable = _transferable;
SetTransferable(msg.sender, _transferable);
}
/**
* @dev disable the canSetTransferable
*/
function disableSetTransferable() only(ifoodDev) public {
transferable = true;
canSetTransferable = false;
DisableSetTransferable(msg.sender, false);
}
/**
* @dev Set the ifoodDev
* @param _ifoodDev The new ifood dev address
*/
function setifoodDevAddress(address _ifoodDev) only(ifoodDev) nonZeroAddress(ifoodDev) public {
ifoodDev = _ifoodDev;
SetifoodDevAddress(msg.sender, _ifoodDev);
}
/**
* @dev Set the ifoodCommunity
* @param _ifoodCommunity The new ifood community address
*/
function setifoodCommunityAddress(address _ifoodCommunity) only(ifoodCommunity) nonZeroAddress(_ifoodCommunity) public {
ifoodCommunity = _ifoodCommunity;
SetifoodCommunityAddress(msg.sender, _ifoodCommunity);
}
/**
* @dev Set the duration of lock of tokens approved of minting
* @param _durationOfLock the new duration of lock
*/
function setDurationOfLock(uint256 _durationOfLock) canMint only(ifoodCommunity) public {
require(_durationOfLock >= TIMETHRESHOLD);
durationOfLock = _durationOfLock;
SetDurationOfLock(msg.sender);
}
/**
* @dev Get the quantity of locked tokens
* @param _owner The address of locked tokens
* @return the quantity and the lock time of locked tokens
*/
function getLockTokens(address _owner) nonZeroAddress(_owner) view public returns (uint256 value, uint256 blockNumber) {
return (lockTokens[_owner].value, lockTokens[_owner].blockNumber);
}
/**
* @dev Approve of minting `_amount` tokens that are assigned to `_owner`
* @param _owner The address that will be assigned the new tokens
* @param _amount The quantity of tokens approved of mintting
* @return True if the tokens are approved of mintting correctly
*/
function approveMintTokens(address _owner, uint256 _amount) nonZeroAddress(_owner) canMint only(ifoodCommunity) public returns (bool) {
require(_amount > 0);
uint256 previousLockTokens = lockTokens[_owner].value;
require(previousLockTokens + _amount >= previousLockTokens);
uint256 curTotalSupply = totalSupply;
require(curTotalSupply + _amount >= curTotalSupply); // Check for overflow
require(curTotalSupply + _amount <= totalSupplyCap); // Check for overflow of total supply cap
uint256 previousBalanceTo = balanceOf(_owner);
require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow
lockTokens[_owner].value = previousLockTokens.add(_amount);
uint256 curBlockNumber = getCurrentBlockNumber();
lockTokens[_owner].blockNumber = curBlockNumber.add(durationOfLock);
ApproveMintTokens(_owner, _amount);
return true;
}
/**
* @dev Withdraw approval of minting `_amount` tokens that are assigned to `_owner`
* @param _owner The address that will be withdrawn the tokens
* @param _amount The quantity of tokens withdrawn approval of mintting
* @return True if the tokens are withdrawn correctly
*/
function withdrawMintTokens(address _owner, uint256 _amount) nonZeroAddress(_owner) canMint only(ifoodCommunity) public returns (bool) {
require(_amount > 0);
uint256 previousLockTokens = lockTokens[_owner].value;
require(previousLockTokens - _amount >= 0);
lockTokens[_owner].value = previousLockTokens.sub(_amount);
if (previousLockTokens - _amount == 0) {
lockTokens[_owner].blockNumber = 0;
}
WithdrawMintTokens(_owner, _amount);
return true;
}
/**
* @dev Mints `_amount` tokens that are assigned to `_owner`
* @param _owner The address that will be assigned the new tokens
* @return True if the tokens are minted correctly
*/
function mintTokens(address _owner) canMint only(ifoodDev) nonZeroAddress(_owner) public returns (bool) {
require(lockTokens[_owner].blockNumber <= getCurrentBlockNumber());
uint256 _amount = lockTokens[_owner].value;
uint256 curTotalSupply = totalSupply;
require(curTotalSupply + _amount >= curTotalSupply); // Check for overflow
require(curTotalSupply + _amount <= totalSupplyCap); // Check for overflow of total supply cap
uint256 previousBalanceTo = balanceOf(_owner);
require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow
totalSupply = curTotalSupply.add(_amount);
balances[_owner] = previousBalanceTo.add(_amount);
lockTokens[_owner].value = 0;
lockTokens[_owner].blockNumber = 0;
MintTokens(_owner, _amount);
Transfer(0, _owner, _amount);
return true;
}
/**
* @dev Transfer tokens to multiple addresses
* @param _addresses The addresses that will receieve tokens
* @param _amounts The quantity of tokens that will be transferred
* @return True if the tokens are transferred correctly
*/
function transferForMultiAddresses(address[] _addresses, uint256[] _amounts) canTransfer public returns (bool) {
for (uint256 i = 0; i < _addresses.length; i++) {
require(_addresses[i] != address(0));
require(_amounts[i] <= balances[msg.sender]);
require(_amounts[i] > 0);
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_amounts[i]);
balances[_addresses[i]] = balances[_addresses[i]].add(_amounts[i]);
Transfer(msg.sender, _addresses[i], _amounts[i]);
}
return true;
}
/**
* @dev Function to stop minting new tokens.
* @return True if the operation was successful.
*/
function finishMinting() only(ifoodDev) canMint public returns (bool) {
mintingFinished = true;
MintFinished(msg.sender);
return true;
}
function getCurrentBlockNumber() private view returns (uint256) {
return block.number;
}
function () public payable {
revert();
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"libraries":{},"compilationTarget":{"ifoodToken.sol":"ifoodToken"}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setDurationOfLock","inputs":[{"type":"uint256","name":"_durationOfLock"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"mintingFinished","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""}],"name":"name","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success"}],"name":"approve","inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"disableSetTransferable","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transferForMultiAddresses","inputs":[{"type":"address[]","name":"_addresses"},{"type":"uint256[]","name":"_amounts"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"deployBlockNumber","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TIMETHRESHOLD","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transferFrom","inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"approveMintTokens","inputs":[{"type":"address","name":"_owner"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setifoodDevAddress","inputs":[{"type":"address","name":"_ifoodDev"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":""}],"name":"decimals","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"durationOfLock","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"ifoodDev","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"balance"}],"name":"balanceOf","inputs":[{"type":"address","name":"_owner"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"finishMinting","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transferable","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""}],"name":"symbol","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"value"},{"type":"uint256","name":"blockNumber"}],"name":"getLockTokens","inputs":[{"type":"address","name":"_owner"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setTransferable","inputs":[{"type":"bool","name":"_transferable"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"transfer","inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"withdrawMintTokens","inputs":[{"type":"address","name":"_owner"},{"type":"uint256","name":"_amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalSupplyCap","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"mintTokens","inputs":[{"type":"address","name":"_owner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"canSetTransferable","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"allowance","inputs":[{"type":"address","name":"_owner"},{"type":"address","name":"_spender"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"ifoodCommunity","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setifoodCommunityAddress","inputs":[{"type":"address","name":"_ifoodCommunity"}],"constant":false},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"SetDurationOfLock","inputs":[{"type":"address","name":"_caller","indexed":true}],"anonymous":false},{"type":"event","name":"ApproveMintTokens","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawMintTokens","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false},{"type":"event","name":"MintTokens","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false},{"type":"event","name":"BurnTokens","inputs":[{"type":"address","name":"_owner","indexed":true},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false},{"type":"event","name":"MintFinished","inputs":[{"type":"address","name":"_caller","indexed":true}],"anonymous":false},{"type":"event","name":"SetTransferable","inputs":[{"type":"address","name":"_address","indexed":true},{"type":"bool","name":"_transferable","indexed":false}],"anonymous":false},{"type":"event","name":"SetifoodDevAddress","inputs":[{"type":"address","name":"_old","indexed":true},{"type":"address","name":"_new","indexed":true}],"anonymous":false},{"type":"event","name":"SetifoodCommunityAddress","inputs":[{"type":"address","name":"_old","indexed":true},{"type":"address","name":"_new","indexed":true}],"anonymous":false},{"type":"event","name":"DisableSetTransferable","inputs":[{"type":"address","name":"_address","indexed":true},{"type":"bool","name":"_canSetTransferable","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false}]
Contract Creation Code
0x6060604052734e471f031d03e5856125993dc3d59520229141ce600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730d72e931932356fccf8cff3f83390e24be72771d600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040805190810160405280600c81526020017f49666f6f647320546f6b656e000000000000000000000000000000000000000081525060069080519060200190620000fb92919062000218565b506040805190810160405280600581526020017f49464f4f44000000000000000000000000000000000000000000000000000000815250600790805190602001906200014992919062000218565b506012600860006101000a81548160ff021916908360ff160217905550600860009054906101000a900460ff1660ff16600a0a6402540be400026009556000600a60006101000a81548160ff021916908315150217905550620001bf620002106401000000000262002688176401000000009004565b600b55611c20600c556000600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff02191690831515021790555034156200020a57600080fd5b620002c7565b600043905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b91906200029f565b5090565b620002c491905b80821115620002c0576000816000905550600101620002a6565b5090565b90565b6126bc80620002d76000396000f300606060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063027ec8481461017a57806305d2035b1461019d57806306fdde03146101ca578063095ea7b31461025857806312dc34a0146102b257806318160ddd146102c7578063204009d2146102f0578063206288d3146103a2578063234e5f16146103cb57806323b872dd146103f4578063269f46631461046d5780632aa4c051146104c7578063313ce567146105005780634da1397c1461052f57806356f1dd6b1461055857806370a08231146105ad5780637d64bcb4146105fa57806392ff0d311461062757806395d89b41146106545780639b98a94b146106e25780639cd2370714610736578063a9059cbb1461075b578063b5bb5ee4146107b5578063bb102aea1461080f578063bcfaa79d14610838578063dca6058c14610889578063dd62ed3e146108b6578063e2c8609214610922578063fe8d640c14610977575b600080fd5b341561018557600080fd5b61019b60048080359060200190919050506109b0565b005b34156101a857600080fd5b6101b0610a88565b604051808215151515815260200191505060405180910390f35b34156101d557600080fd5b6101dd610a9b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021d578082015181840152602081019050610202565b50505050905090810190601f16801561024a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561026357600080fd5b610298600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b39565b604051808215151515815260200191505060405180910390f35b34156102bd57600080fd5b6102c5610cc2565b005b34156102d257600080fd5b6102da610dab565b6040518082815260200191505060405180910390f35b34156102fb57600080fd5b61038860048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610db1565b604051808215151515815260200191505060405180910390f35b34156103ad57600080fd5b6103b56110f3565b6040518082815260200191505060405180910390f35b34156103d657600080fd5b6103de6110f9565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610453600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ff565b604051808215151515815260200191505060405180910390f35b341561047857600080fd5b6104ad600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506114e1565b604051808215151515815260200191505060405180910390f35b34156104d257600080fd5b6104fe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611765565b005b341561050b57600080fd5b6105136118c1565b604051808260ff1660ff16815260200191505060405180910390f35b341561053a57600080fd5b6105426118d4565b6040518082815260200191505060405180910390f35b341561056357600080fd5b61056b6118da565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b857600080fd5b6105e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611900565b6040518082815260200191505060405180910390f35b341561060557600080fd5b61060d611949565b604051808215151515815260200191505060405180910390f35b341561063257600080fd5b61063a611a2a565b604051808215151515815260200191505060405180910390f35b341561065f57600080fd5b610667611a3d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106a757808201518184015260208101905061068c565b50505050905090810190601f1680156106d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156106ed57600080fd5b610719600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611adb565b604051808381526020018281526020019250505060405180910390f35b341561074157600080fd5b61075960048080351515906020019091905050611bab565b005b341561076657600080fd5b61079b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611c9a565b604051808215151515815260200191505060405180910390f35b34156107c057600080fd5b6107f5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ee1565b604051808215151515815260200191505060405180910390f35b341561081a57600080fd5b610822612108565b6040518082815260200191505060405180910390f35b341561084357600080fd5b61086f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061210e565b604051808215151515815260200191505060405180910390f35b341561089457600080fd5b61089c612457565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b61090c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061246a565b6040518082815260200191505060405180910390f35b341561092d57600080fd5b6109356124f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561098257600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612517565b005b600a60009054906101000a900460ff161515156109cc57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a2957600080fd5b611c208210151515610a3a57600080fd5b81600c819055503373ffffffffffffffffffffffffffffffffffffffff167f0396975844671389fa17a3a7695b8bd9f31c23d3d058f0706b1b75319dfd744260405160405180910390a25050565b600a60009054906101000a900460ff1681565b60068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b505050505081565b6000808214158015610bc857506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bd257600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d1f57600080fd5b6001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fa587cd36fc5173263bcfc28c8fa5b785fb89e0c74ac952d6a3554aa83b5012146000604051808215151515815260200191505060405180910390a250565b60005481565b60008060011515600d60009054906101000a900460ff161515141515610dd657600080fd5b600090505b83518110156110e857600073ffffffffffffffffffffffffffffffffffffffff168482815181101515610e0a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614151515610e3757600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548382815181101515610e8557fe5b9060200190602002015111151515610e9c57600080fd5b60008382815181101515610eac57fe5b90602001906020020151111515610ec257600080fd5b610f2b8382815181101515610ed357fe5b90602001906020020151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fee8382815181101515610f7f57fe5b90602001906020020151600360008785815181101515610f9b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b60036000868481518110151561100057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550838181518110151561105657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85848151811015156110bc57fe5b906020019060200201516040518082815260200191505060405180910390a38080600101915050610ddb565b600191505092915050565b600b5481565b611c2081565b600060011515600d60009054906101000a900460ff16151514151561112357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561115f57600080fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156111ad57600080fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561123857600080fd5b61128a82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061131f82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f182600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600080600080600086600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561152657600080fd5b600a60009054906101000a900460ff1615151561154257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561159f57600080fd5b6000881115156115ae57600080fd5b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549550858887011015151561160457600080fd5b6000549450848886011015151561161a57600080fd5b6009548886011115151561162d57600080fd5b61163689611900565b9350838885011015151561164957600080fd5b61165c888761266a90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506116aa612688565b92506116c1600c548461266a90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508873ffffffffffffffffffffffffffffffffffffffff167ff409fb63c43f80749c0457905d6ca20dea860144ecf394abef251fbc6dd4eb51896040518082815260200191505060405180910390a26001965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117c257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561182157600080fd5b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167febd1bd8795461b00d2a963bc34c633a0d7b6c340f8ee42978fdb76526c9b63b360405160405180910390a3505050565b600860009054906101000a900460ff1681565b600c5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119a857600080fd5b600a60009054906101000a900460ff161515156119c457600080fd5b6001600a60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f39b5ca6d4234a87b875f701a848e24d718e9f824d12099eec3c01762383b04ee60405160405180910390a2600191505090565b600d60009054906101000a900460ff1681565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ad35780601f10611aa857610100808354040283529160200191611ad3565b820191906000526020600020905b815481529060010190602001808311611ab657829003601f168201915b505050505081565b60008082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b1b57600080fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549250925050915091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0857600080fd5b60011515600d60019054906101000a900460ff161515141515611c2a57600080fd5b81600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f166d463a272e44b1c12f674f66ba19df53561af84c4a617a0011e78db3d5c22183604051808215151515815260200191505060405180910390a25050565b600060011515600d60009054906101000a900460ff161515141515611cbe57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611cfa57600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515611d4857600080fd5b611d9a82600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e2f82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611f2157600080fd5b600a60009054906101000a900460ff16151515611f3d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f9a57600080fd5b600085111515611fa957600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154925060008584031015151561200057600080fd5b612013858461265190919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600085840314156120ad576000600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b8573ffffffffffffffffffffffffffffffffffffffff167fb6eefe5d57aeb45d2fb03cb184c9808f5694f3201515c33e5c40ab637af4352c866040518082815260200191505060405180910390a26001935050505092915050565b60095481565b600080600080600a60009054906101000a900460ff1615151561213057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561218d57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121ca57600080fd5b6121d2612688565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115151561222257600080fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015494506000549350838585011015151561227d57600080fd5b6009548585011115151561229057600080fd5b61229987611900565b925082858401101515156122ac57600080fd5b6122bf858561266a90919063ffffffff16565b6000819055506122d8858461266a90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508673ffffffffffffffffffffffffffffffffffffffff167f7b47457f3af09e5f794b020fd74160963a808f5985883496a096d403d380c343866040518082815260200191505060405180910390a28673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600195505050505050919050565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257457600080fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125b157600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd19ae8d678e9eae98753582dadce83a764fa65e219308d166336736cc938ddf460405160405180910390a3505050565b600082821115151561265f57fe5b818303905092915050565b600080828401905083811015151561267e57fe5b8091505092915050565b6000439050905600a165627a7a7230582080e0b1a15be92368579c6772ff209c469f9dcda457bbc3839ab174eb9019bdbf0029
Deployed ByteCode
0x606060405260043610610175576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063027ec8481461017a57806305d2035b1461019d57806306fdde03146101ca578063095ea7b31461025857806312dc34a0146102b257806318160ddd146102c7578063204009d2146102f0578063206288d3146103a2578063234e5f16146103cb57806323b872dd146103f4578063269f46631461046d5780632aa4c051146104c7578063313ce567146105005780634da1397c1461052f57806356f1dd6b1461055857806370a08231146105ad5780637d64bcb4146105fa57806392ff0d311461062757806395d89b41146106545780639b98a94b146106e25780639cd2370714610736578063a9059cbb1461075b578063b5bb5ee4146107b5578063bb102aea1461080f578063bcfaa79d14610838578063dca6058c14610889578063dd62ed3e146108b6578063e2c8609214610922578063fe8d640c14610977575b600080fd5b341561018557600080fd5b61019b60048080359060200190919050506109b0565b005b34156101a857600080fd5b6101b0610a88565b604051808215151515815260200191505060405180910390f35b34156101d557600080fd5b6101dd610a9b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561021d578082015181840152602081019050610202565b50505050905090810190601f16801561024a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561026357600080fd5b610298600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b39565b604051808215151515815260200191505060405180910390f35b34156102bd57600080fd5b6102c5610cc2565b005b34156102d257600080fd5b6102da610dab565b6040518082815260200191505060405180910390f35b34156102fb57600080fd5b61038860048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610db1565b604051808215151515815260200191505060405180910390f35b34156103ad57600080fd5b6103b56110f3565b6040518082815260200191505060405180910390f35b34156103d657600080fd5b6103de6110f9565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610453600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ff565b604051808215151515815260200191505060405180910390f35b341561047857600080fd5b6104ad600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506114e1565b604051808215151515815260200191505060405180910390f35b34156104d257600080fd5b6104fe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611765565b005b341561050b57600080fd5b6105136118c1565b604051808260ff1660ff16815260200191505060405180910390f35b341561053a57600080fd5b6105426118d4565b6040518082815260200191505060405180910390f35b341561056357600080fd5b61056b6118da565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b857600080fd5b6105e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611900565b6040518082815260200191505060405180910390f35b341561060557600080fd5b61060d611949565b604051808215151515815260200191505060405180910390f35b341561063257600080fd5b61063a611a2a565b604051808215151515815260200191505060405180910390f35b341561065f57600080fd5b610667611a3d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106a757808201518184015260208101905061068c565b50505050905090810190601f1680156106d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156106ed57600080fd5b610719600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611adb565b604051808381526020018281526020019250505060405180910390f35b341561074157600080fd5b61075960048080351515906020019091905050611bab565b005b341561076657600080fd5b61079b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611c9a565b604051808215151515815260200191505060405180910390f35b34156107c057600080fd5b6107f5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ee1565b604051808215151515815260200191505060405180910390f35b341561081a57600080fd5b610822612108565b6040518082815260200191505060405180910390f35b341561084357600080fd5b61086f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061210e565b604051808215151515815260200191505060405180910390f35b341561089457600080fd5b61089c612457565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b61090c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061246a565b6040518082815260200191505060405180910390f35b341561092d57600080fd5b6109356124f1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561098257600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612517565b005b600a60009054906101000a900460ff161515156109cc57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a2957600080fd5b611c208210151515610a3a57600080fd5b81600c819055503373ffffffffffffffffffffffffffffffffffffffff167f0396975844671389fa17a3a7695b8bd9f31c23d3d058f0706b1b75319dfd744260405160405180910390a25050565b600a60009054906101000a900460ff1681565b60068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b505050505081565b6000808214158015610bc857506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bd257600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d1f57600080fd5b6001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fa587cd36fc5173263bcfc28c8fa5b785fb89e0c74ac952d6a3554aa83b5012146000604051808215151515815260200191505060405180910390a250565b60005481565b60008060011515600d60009054906101000a900460ff161515141515610dd657600080fd5b600090505b83518110156110e857600073ffffffffffffffffffffffffffffffffffffffff168482815181101515610e0a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614151515610e3757600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548382815181101515610e8557fe5b9060200190602002015111151515610e9c57600080fd5b60008382815181101515610eac57fe5b90602001906020020151111515610ec257600080fd5b610f2b8382815181101515610ed357fe5b90602001906020020151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610fee8382815181101515610f7f57fe5b90602001906020020151600360008785815181101515610f9b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b60036000868481518110151561100057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550838181518110151561105657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85848151811015156110bc57fe5b906020019060200201516040518082815260200191505060405180910390a38080600101915050610ddb565b600191505092915050565b600b5481565b611c2081565b600060011515600d60009054906101000a900460ff16151514151561112357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561115f57600080fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156111ad57600080fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561123857600080fd5b61128a82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061131f82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f182600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600080600080600086600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561152657600080fd5b600a60009054906101000a900460ff1615151561154257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561159f57600080fd5b6000881115156115ae57600080fd5b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549550858887011015151561160457600080fd5b6000549450848886011015151561161a57600080fd5b6009548886011115151561162d57600080fd5b61163689611900565b9350838885011015151561164957600080fd5b61165c888761266a90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506116aa612688565b92506116c1600c548461266a90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508873ffffffffffffffffffffffffffffffffffffffff167ff409fb63c43f80749c0457905d6ca20dea860144ecf394abef251fbc6dd4eb51896040518082815260200191505060405180910390a26001965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117c257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561182157600080fd5b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167febd1bd8795461b00d2a963bc34c633a0d7b6c340f8ee42978fdb76526c9b63b360405160405180910390a3505050565b600860009054906101000a900460ff1681565b600c5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119a857600080fd5b600a60009054906101000a900460ff161515156119c457600080fd5b6001600a60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f39b5ca6d4234a87b875f701a848e24d718e9f824d12099eec3c01762383b04ee60405160405180910390a2600191505090565b600d60009054906101000a900460ff1681565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ad35780601f10611aa857610100808354040283529160200191611ad3565b820191906000526020600020905b815481529060010190602001808311611ab657829003601f168201915b505050505081565b60008082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b1b57600080fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549250925050915091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0857600080fd5b60011515600d60019054906101000a900460ff161515141515611c2a57600080fd5b81600d60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f166d463a272e44b1c12f674f66ba19df53561af84c4a617a0011e78db3d5c22183604051808215151515815260200191505060405180910390a25050565b600060011515600d60009054906101000a900460ff161515141515611cbe57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611cfa57600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515611d4857600080fd5b611d9a82600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461265190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e2f82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461266a90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611f2157600080fd5b600a60009054906101000a900460ff16151515611f3d57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f9a57600080fd5b600085111515611fa957600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154925060008584031015151561200057600080fd5b612013858461265190919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600085840314156120ad576000600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b8573ffffffffffffffffffffffffffffffffffffffff167fb6eefe5d57aeb45d2fb03cb184c9808f5694f3201515c33e5c40ab637af4352c866040518082815260200191505060405180910390a26001935050505092915050565b60095481565b600080600080600a60009054906101000a900460ff1615151561213057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561218d57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121ca57600080fd5b6121d2612688565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115151561222257600080fd5b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015494506000549350838585011015151561227d57600080fd5b6009548585011115151561229057600080fd5b61229987611900565b925082858401101515156122ac57600080fd5b6122bf858561266a90919063ffffffff16565b6000819055506122d8858461266a90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508673ffffffffffffffffffffffffffffffffffffffff167f7b47457f3af09e5f794b020fd74160963a808f5985883496a096d403d380c343866040518082815260200191505060405180910390a28673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600195505050505050919050565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257457600080fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125b157600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd19ae8d678e9eae98753582dadce83a764fa65e219308d166336736cc938ddf460405160405180910390a3505050565b600082821115151561265f57fe5b818303905092915050565b600080828401905083811015151561267e57fe5b8091505092915050565b6000439050905600a165627a7a7230582080e0b1a15be92368579c6772ff209c469f9dcda457bbc3839ab174eb9019bdbf0029