Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- FarmToken
- Optimization enabled
- false
- Compiler version
- v0.8.18+commit.87f61d96
- EVM Version
- default
- Verified at
- 2024-03-21T11:09:55.479808Z
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IPRC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IPRC20Permit {
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
library Counters {
struct Counter {
uint256 _value;
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
}
library ECDSA {
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return recover(hash, v, r, s);
}
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
abstract contract EIP712 {
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
uint256 private immutable _CACHED_CHAIN_ID;
bytes32 private immutable _HASHED_NAME;
bytes32 private immutable _HASHED_VERSION;
bytes32 private immutable _TYPE_HASH;
constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_TYPE_HASH = typeHash;
}
function _domainSeparatorV4() internal view returns (bytes32) {
if (block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR;
} else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
}
}
function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
return keccak256(
abi.encode(
typeHash,
name,
version,
block.chainid,
address(this)
)
);
}
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
}
}
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
library SafePRC20 {
using Address for address;
function safeTransfer(IPRC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IPRC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IPRC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafePRC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IPRC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IPRC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafePRC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function _callOptionalReturn(IPRC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafePRC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafePRC20: PRC20 operation did not succeed");
}
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
contract PRC20 is Context, IPRC20 {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function decimals() public view virtual returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "PRC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "PRC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "PRC20: transfer from the zero address");
require(recipient != address(0), "PRC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "PRC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "PRC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "PRC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "PRC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "PRC20: approve from the zero address");
require(spender != address(0), "PRC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
abstract contract PRC20Burnable is Context, PRC20 {
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "PRC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount);
_burn(account, amount);
}
}
abstract contract PRC20Permit is PRC20, IPRC20Permit, EIP712 {
using Counters for Counters.Counter;
mapping (address => Counters.Counter) private _nonces;
bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
constructor(string memory name) EIP712(name, "1") {
}
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
require(block.timestamp <= deadline, "PRC20Permit: expired deadline");
bytes32 structHash = keccak256(
abi.encode(
_PERMIT_TYPEHASH,
owner,
spender,
value,
_useNonce(owner),
deadline
)
);
bytes32 hash = _hashTypedDataV4(structHash);
address signer = ECDSA.recover(hash, v, r, s);
require(signer == owner, "PRC20Permit: invalid signature");
_approve(owner, spender, value);
}
function nonces(address owner) public view virtual override returns (uint256) {
return _nonces[owner].current();
}
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4();
}
function _useNonce(address owner) internal virtual returns (uint256 current) {
Counters.Counter storage nonce = _nonces[owner];
current = nonce.current();
nonce.increment();
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
contract FarmToken is PRC20Permit, Ownable, PRC20Burnable {
constructor () PRC20("Function Island Farm", "FARM") PRC20Permit("Function Island Farm") {
}
function mint(address _to, uint256 _amount) public onlyOwner() {
_mint(_to, _amount);
}
}
contract MasterChef is AccessControl {
using SafeMath for uint256;
using SafePRC20 for IPRC20;
FarmToken public rewards;
address public constant team = 0xA1e0cC3153f05C24cB42B72068F407E0CAf879dA;
address public constant treasury = 0x58AB8Fe4e78Da632FFca31D120AD766ae981A4D7;
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
bytes32 public constant CHEF_ROLE = keccak256("CHEF_ROLE");
uint256 public constant rewardsPerBlock = 1e14; // 0.0001 rewards tokens per block
uint256 public totalAllocPoint;
uint256 public startBlock;
PoolInfo[] public poolInfo;
// Info of each user.
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
// Info of each pool.
struct PoolInfo {
IPRC20 lpToken;
uint256 allocPoint;
uint256 lastRewardBlock;
uint256 accYieldPerShare;
uint16 depositFeeBP;
}
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
constructor(
FarmToken _rewards,
uint256 _startBlock
) {
rewards = _rewards;
startBlock = _startBlock;
totalAllocPoint = 0;
_setRoleAdmin(CHEF_ROLE, ADMIN_ROLE);
_grantRole(ADMIN_ROLE, msg.sender);
_grantRole(CHEF_ROLE, msg.sender);
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Add a new lp to the pool. Can only be called by the owner.
// XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
function add(uint256 _allocPoint, IPRC20 _lpToken, uint16 _depositFeeBP, bool _withUpdate) public onlyRole(CHEF_ROLE) {
require(_depositFeeBP <= 10000, "add: invalid deposit fee basis points");
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
accYieldPerShare: 0,
depositFeeBP: _depositFeeBP
}));
}
// Update the given pool's token allocation point and deposit fee. Can only be called by the owner.
function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate) public onlyRole(CHEF_ROLE) {
require(_depositFeeBP <= 10000, "set: invalid deposit fee basis points");
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
poolInfo[_pid].depositFeeBP = _depositFeeBP;
}
// Return reward multiplier over the given _from to _to block.
function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) {
return _to.sub(_from);
}
// View function to see pending rewards on frontend.
function pendingRewards(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accYieldPerShare = pool.accYieldPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 reward = multiplier.mul(rewardsPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
accYieldPerShare = accYieldPerShare.add(reward.mul(1e12).div(lpSupply));
}
return user.amount.mul(accYieldPerShare).div(1e12).sub(user.rewardDebt);
}
// Update reward variables for all pools. Be careful of gas spending!
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0 || pool.allocPoint == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 reward = multiplier.mul(rewardsPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
rewards.mint(team, reward.div(200));
rewards.mint(address(this), reward);
pool.accYieldPerShare = pool.accYieldPerShare.add(reward.mul(1e12).div(lpSupply));
pool.lastRewardBlock = block.number;
}
// Deposit LP tokens to MasterChef for token allocation.
function deposit(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
safeTokenTransfer(msg.sender, pending);
}
}
if(_amount > 0) {
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
if(pool.depositFeeBP > 0){
uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
pool.lpToken.safeTransfer(treasury, depositFee);
user.amount = user.amount.add(_amount).sub(depositFee);
}else{
user.amount = user.amount.add(_amount);
}
}
user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
emit Deposit(msg.sender, _pid, _amount);
}
// Withdraw LP tokens from MasterChef.
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
safeTokenTransfer(msg.sender, pending);
}
if(_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.lpToken.safeTransfer(address(msg.sender), _amount);
}
user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
emit Withdraw(msg.sender, _pid, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
pool.lpToken.safeTransfer(address(msg.sender), amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
// Safe rewards transfer function, just in case if rounding error causes pool to not have enough tokens.
function safeTokenTransfer(address _to, uint256 _amount) internal {
uint256 farmBal = rewards.balanceOf(address(this));
if (_amount > farmBal) {
rewards.transfer(_to, farmBal);
} else {
rewards.transfer(_to, _amount);
}
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permit","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120908152503480156200003a57600080fd5b506040518060400160405280601481526020017f46756e6374696f6e2049736c616e64204661726d000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280601481526020017f46756e6374696f6e2049736c616e64204661726d0000000000000000000000008152506040518060400160405280600481526020017f4641524d0000000000000000000000000000000000000000000000000000000081525081600390816200012591906200052d565b5080600490816200013791906200052d565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001a28184846200026f60201b60201c565b608081815250508061010081815250505050505050506000620001ca620002ab60201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620006e2565b600083838346306040516020016200028c95949392919062000685565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033557607f821691505b6020821081036200034b576200034a620002ed565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000376565b620003c1868362000376565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200040e620004086200040284620003d9565b620003e3565b620003d9565b9050919050565b6000819050919050565b6200042a83620003ed565b62000442620004398262000415565b84845462000383565b825550505050565b600090565b620004596200044a565b620004668184846200041f565b505050565b5b818110156200048e57620004826000826200044f565b6001810190506200046c565b5050565b601f821115620004dd57620004a78162000351565b620004b28462000366565b81016020851015620004c2578190505b620004da620004d18562000366565b8301826200046b565b50505b505050565b600082821c905092915050565b60006200050260001984600802620004e2565b1980831691505092915050565b60006200051d8383620004ef565b9150826002028217905092915050565b6200053882620002b3565b67ffffffffffffffff811115620005545762000553620002be565b5b6200056082546200031c565b6200056d82828562000492565b600060209050601f831160018114620005a5576000841562000590578287015190505b6200059c85826200050f565b8655506200060c565b601f198416620005b58662000351565b60005b82811015620005df57848901518255600182019150602085019450602081019050620005b8565b86831015620005ff5784890151620005fb601f891682620004ef565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620006298162000614565b82525050565b6200063a81620003d9565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200066d8262000640565b9050919050565b6200067f8162000660565b82525050565b600060a0820190506200069c60008301886200061e565b620006ab60208301876200061e565b620006ba60408301866200061e565b620006c960608301856200062f565b620006d8608083018462000674565b9695505050505050565b60805160a05160c05160e0516101005161012051612a43620007326000396000610b86015260006113570152600061139901526000611378015260006113050152600061132c0152612a436000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611a11565b60405180910390f35b61016960048036038101906101649190611acc565b61048d565b6040516101769190611b27565b60405180910390f35b6101876104ab565b6040516101949190611b51565b60405180910390f35b6101b760048036038101906101b29190611b6c565b6104b5565b6040516101c49190611b27565b60405180910390f35b6101d56105b6565b6040516101e29190611bdb565b60405180910390f35b6101f36105bf565b6040516102009190611c0f565b60405180910390f35b610223600480360381019061021e9190611acc565b6105ce565b6040516102309190611b27565b60405180910390f35b610253600480360381019061024e9190611acc565b61067a565b005b61026f600480360381019061026a9190611c2a565b610704565b005b61028b60048036038101906102869190611c57565b610718565b6040516102989190611b51565b60405180910390f35b6102a9610760565b005b6102c560048036038101906102c09190611acc565b61089d565b005b6102e160048036038101906102dc9190611c57565b610921565b6040516102ee9190611b51565b60405180910390f35b6102ff610971565b60405161030c9190611c93565b60405180910390f35b61031d61099b565b60405161032a9190611a11565b60405180910390f35b61034d60048036038101906103489190611acc565b610a2d565b60405161035a9190611b27565b60405180910390f35b61037d60048036038101906103789190611acc565b610b21565b60405161038a9190611b27565b60405180910390f35b6103ad60048036038101906103a89190611d06565b610b3f565b005b6103c960048036038101906103c49190611da8565b610c81565b6040516103d69190611b51565b60405180910390f35b6103f960048036038101906103f49190611c57565b610d08565b005b60606003805461040a90611e17565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611e17565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60006104a161049a610eb3565b8484610ebb565b6001905092915050565b6000600254905090565b60006104c2848484611084565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061050d610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561058d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058490611eba565b60405180910390fd5b6105aa85610599610eb3565b85846105a59190611f09565b610ebb565b60019150509392505050565b60006012905090565b60006105c9611301565b905090565b60006106706105db610eb3565b8484600160006105e9610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461066b9190611f3d565b610ebb565b6001905092915050565b610682610eb3565b73ffffffffffffffffffffffffffffffffffffffff166106a0610971565b73ffffffffffffffffffffffffffffffffffffffff16146106f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ed90611fbd565b60405180910390fd5b61070082826113c3565b5050565b61071561070f610eb3565b82611516565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610768610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610786610971565b73ffffffffffffffffffffffffffffffffffffffff16146107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006108b0836108ab610eb3565b610c81565b9050818110156108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec9061204f565b60405180910390fd5b61091283610901610eb3565b848461090d9190611f09565b610ebb565b61091c8383611516565b505050565b600061096a600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116e9565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109aa90611e17565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690611e17565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b60008060016000610a3c610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af0906120e1565b60405180910390fd5b610b16610b04610eb3565b858584610b119190611f09565b610ebb565b600191505092915050565b6000610b35610b2e610eb3565b8484611084565b6001905092915050565b83421115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b799061214d565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610bb18c6116f7565b89604051602001610bc79695949392919061216d565b6040516020818303038152906040528051906020012090506000610bea82611755565b90506000610bfa8287878761176f565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061221a565b60405180910390fd5b610c758a8a8a610ebb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d10610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610d2e610971565b73ffffffffffffffffffffffffffffffffffffffff1614610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906122ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061233e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906123d0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110779190611b51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612462565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906124f4565b60405180910390fd5b61116d8383836118f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90612586565b60405180910390fd5b81816111ff9190611f09565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128f9190611f3d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f39190611b51565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004603611352577f000000000000000000000000000000000000000000000000000000000000000090506113c0565b6113bd7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006118fe565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906125f2565b60405180910390fd5b61143e600083836118f9565b80600260008282546114509190611f3d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a59190611f3d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161150a9190611b51565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90612684565b60405180910390fd5b611591826000836118f9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612716565b60405180910390fd5b81816116239190611f09565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116779190611f09565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116dc9190611b51565b60405180910390a3505050565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611744816116e9565b915061174f81611938565b50919050565b6000611768611762611301565b8361194e565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906127a8565b60405180910390fd5b601b8460ff1614806117ec5750601c8460ff16145b61182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061283a565b60405180910390fd5b600060018686868660405160008152602001604052604051611850949392919061285a565b6020604051602081039080840390855afa158015611872573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4906128eb565b60405180910390fd5b80915050949350505050565b505050565b6000838383463060405160200161191995949392919061290b565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016119639291906129d6565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006119e382611981565b6119ed818561198c565b93506119fd81856020860161199d565b611a06816119c7565b840191505092915050565b60006020820190508181036000830152611a2b81846119d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a6382611a38565b9050919050565b611a7381611a58565b8114611a7e57600080fd5b50565b600081359050611a9081611a6a565b92915050565b6000819050919050565b611aa981611a96565b8114611ab457600080fd5b50565b600081359050611ac681611aa0565b92915050565b60008060408385031215611ae357611ae2611a33565b5b6000611af185828601611a81565b9250506020611b0285828601611ab7565b9150509250929050565b60008115159050919050565b611b2181611b0c565b82525050565b6000602082019050611b3c6000830184611b18565b92915050565b611b4b81611a96565b82525050565b6000602082019050611b666000830184611b42565b92915050565b600080600060608486031215611b8557611b84611a33565b5b6000611b9386828701611a81565b9350506020611ba486828701611a81565b9250506040611bb586828701611ab7565b9150509250925092565b600060ff82169050919050565b611bd581611bbf565b82525050565b6000602082019050611bf06000830184611bcc565b92915050565b6000819050919050565b611c0981611bf6565b82525050565b6000602082019050611c246000830184611c00565b92915050565b600060208284031215611c4057611c3f611a33565b5b6000611c4e84828501611ab7565b91505092915050565b600060208284031215611c6d57611c6c611a33565b5b6000611c7b84828501611a81565b91505092915050565b611c8d81611a58565b82525050565b6000602082019050611ca86000830184611c84565b92915050565b611cb781611bbf565b8114611cc257600080fd5b50565b600081359050611cd481611cae565b92915050565b611ce381611bf6565b8114611cee57600080fd5b50565b600081359050611d0081611cda565b92915050565b600080600080600080600060e0888a031215611d2557611d24611a33565b5b6000611d338a828b01611a81565b9750506020611d448a828b01611a81565b9650506040611d558a828b01611ab7565b9550506060611d668a828b01611ab7565b9450506080611d778a828b01611cc5565b93505060a0611d888a828b01611cf1565b92505060c0611d998a828b01611cf1565b91505092959891949750929550565b60008060408385031215611dbf57611dbe611a33565b5b6000611dcd85828601611a81565b9250506020611dde85828601611a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e2f57607f821691505b602082108103611e4257611e41611de8565b5b50919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611ea460288361198c565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1482611a96565b9150611f1f83611a96565b9250828203905081811115611f3757611f36611eda565b5b92915050565b6000611f4882611a96565b9150611f5383611a96565b9250828201905080821115611f6b57611f6a611eda565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa760208361198c565b9150611fb282611f71565b602082019050919050565b60006020820190508181036000830152611fd681611f9a565b9050919050565b7f50524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061203960248361198c565b915061204482611fdd565b604082019050919050565b600060208201905081810360008301526120688161202c565b9050919050565b7f50524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006120cb60258361198c565b91506120d68261206f565b604082019050919050565b600060208201905081810360008301526120fa816120be565b9050919050565b7f50524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612137601d8361198c565b915061214282612101565b602082019050919050565b600060208201905081810360008301526121668161212a565b9050919050565b600060c0820190506121826000830189611c00565b61218f6020830188611c84565b61219c6040830187611c84565b6121a96060830186611b42565b6121b66080830185611b42565b6121c360a0830184611b42565b979650505050505050565b7f50524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612204601e8361198c565b915061220f826121ce565b602082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061229660268361198c565b91506122a18261223a565b604082019050919050565b600060208201905081810360008301526122c581612289565b9050919050565b7f50524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061232860248361198c565b9150612333826122cc565b604082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f50524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123ba60228361198c565b91506123c58261235e565b604082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b7f50524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061244c60258361198c565b9150612457826123f0565b604082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f50524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006124de60238361198c565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061257060268361198c565b915061257b82612514565b604082019050919050565b6000602082019050818103600083015261259f81612563565b9050919050565b7f50524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006125dc601f8361198c565b91506125e7826125a6565b602082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f50524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061266e60218361198c565b915061267982612612565b604082019050919050565b6000602082019050818103600083015261269d81612661565b9050919050565b7f50524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061270060228361198c565b915061270b826126a4565b604082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061279260228361198c565b915061279d82612736565b604082019050919050565b600060208201905081810360008301526127c181612785565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061282460228361198c565b915061282f826127c8565b604082019050919050565b6000602082019050818103600083015261285381612817565b9050919050565b600060808201905061286f6000830187611c00565b61287c6020830186611bcc565b6128896040830185611c00565b6128966060830184611c00565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128d560188361198c565b91506128e08261289f565b602082019050919050565b60006020820190508181036000830152612904816128c8565b9050919050565b600060a0820190506129206000830188611c00565b61292d6020830187611c00565b61293a6040830186611c00565b6129476060830185611b42565b6129546080830184611c84565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061299f60028361295e565b91506129aa82612969565b600282019050919050565b6000819050919050565b6129d06129cb82611bf6565b6129b5565b82525050565b60006129e182612992565b91506129ed82856129bf565b6020820191506129fd82846129bf565b602082019150819050939250505056fea26469706673582212209b7fe5b4b5accea910c117f4554e36638f0793ac093ac8276a63cfd898658a0064736f6c63430008120033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611a11565b60405180910390f35b61016960048036038101906101649190611acc565b61048d565b6040516101769190611b27565b60405180910390f35b6101876104ab565b6040516101949190611b51565b60405180910390f35b6101b760048036038101906101b29190611b6c565b6104b5565b6040516101c49190611b27565b60405180910390f35b6101d56105b6565b6040516101e29190611bdb565b60405180910390f35b6101f36105bf565b6040516102009190611c0f565b60405180910390f35b610223600480360381019061021e9190611acc565b6105ce565b6040516102309190611b27565b60405180910390f35b610253600480360381019061024e9190611acc565b61067a565b005b61026f600480360381019061026a9190611c2a565b610704565b005b61028b60048036038101906102869190611c57565b610718565b6040516102989190611b51565b60405180910390f35b6102a9610760565b005b6102c560048036038101906102c09190611acc565b61089d565b005b6102e160048036038101906102dc9190611c57565b610921565b6040516102ee9190611b51565b60405180910390f35b6102ff610971565b60405161030c9190611c93565b60405180910390f35b61031d61099b565b60405161032a9190611a11565b60405180910390f35b61034d60048036038101906103489190611acc565b610a2d565b60405161035a9190611b27565b60405180910390f35b61037d60048036038101906103789190611acc565b610b21565b60405161038a9190611b27565b60405180910390f35b6103ad60048036038101906103a89190611d06565b610b3f565b005b6103c960048036038101906103c49190611da8565b610c81565b6040516103d69190611b51565b60405180910390f35b6103f960048036038101906103f49190611c57565b610d08565b005b60606003805461040a90611e17565b80601f016020809104026020016040519081016040528092919081815260200182805461043690611e17565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60006104a161049a610eb3565b8484610ebb565b6001905092915050565b6000600254905090565b60006104c2848484611084565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061050d610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561058d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058490611eba565b60405180910390fd5b6105aa85610599610eb3565b85846105a59190611f09565b610ebb565b60019150509392505050565b60006012905090565b60006105c9611301565b905090565b60006106706105db610eb3565b8484600160006105e9610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461066b9190611f3d565b610ebb565b6001905092915050565b610682610eb3565b73ffffffffffffffffffffffffffffffffffffffff166106a0610971565b73ffffffffffffffffffffffffffffffffffffffff16146106f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ed90611fbd565b60405180910390fd5b61070082826113c3565b5050565b61071561070f610eb3565b82611516565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610768610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610786610971565b73ffffffffffffffffffffffffffffffffffffffff16146107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006108b0836108ab610eb3565b610c81565b9050818110156108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec9061204f565b60405180910390fd5b61091283610901610eb3565b848461090d9190611f09565b610ebb565b61091c8383611516565b505050565b600061096a600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116e9565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109aa90611e17565b80601f01602080910402602001604051908101604052809291908181526020018280546109d690611e17565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b60008060016000610a3c610eb3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af0906120e1565b60405180910390fd5b610b16610b04610eb3565b858584610b119190611f09565b610ebb565b600191505092915050565b6000610b35610b2e610eb3565b8484611084565b6001905092915050565b83421115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b799061214d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610bb18c6116f7565b89604051602001610bc79695949392919061216d565b6040516020818303038152906040528051906020012090506000610bea82611755565b90506000610bfa8287878761176f565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c619061221a565b60405180910390fd5b610c758a8a8a610ebb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d10610eb3565b73ffffffffffffffffffffffffffffffffffffffff16610d2e610971565b73ffffffffffffffffffffffffffffffffffffffff1614610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90611fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906122ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061233e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906123d0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110779190611b51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90612462565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906124f4565b60405180910390fd5b61116d8383836118f9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90612586565b60405180910390fd5b81816111ff9190611f09565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128f9190611f3d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f39190611b51565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000001714603611352577f506a5bf1b63ab6ce03d2379017f6b085ce4a5c76d9c190bd7535253188643d2390506113c0565b6113bd7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fc3ba6702b9fe8546f63ee47722fe817d63fe862807f39dcd4c5389496aef69477fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66118fe565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906125f2565b60405180910390fd5b61143e600083836118f9565b80600260008282546114509190611f3d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a59190611f3d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161150a9190611b51565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90612684565b60405180910390fd5b611591826000836118f9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612716565b60405180910390fd5b81816116239190611f09565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546116779190611f09565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116dc9190611b51565b60405180910390a3505050565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611744816116e9565b915061174f81611938565b50919050565b6000611768611762611301565b8361194e565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce906127a8565b60405180910390fd5b601b8460ff1614806117ec5750601c8460ff16145b61182b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118229061283a565b60405180910390fd5b600060018686868660405160008152602001604052604051611850949392919061285a565b6020604051602081039080840390855afa158015611872573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e4906128eb565b60405180910390fd5b80915050949350505050565b505050565b6000838383463060405160200161191995949392919061290b565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016119639291906129d6565b60405160208183030381529060405280519060200120905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006119e382611981565b6119ed818561198c565b93506119fd81856020860161199d565b611a06816119c7565b840191505092915050565b60006020820190508181036000830152611a2b81846119d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a6382611a38565b9050919050565b611a7381611a58565b8114611a7e57600080fd5b50565b600081359050611a9081611a6a565b92915050565b6000819050919050565b611aa981611a96565b8114611ab457600080fd5b50565b600081359050611ac681611aa0565b92915050565b60008060408385031215611ae357611ae2611a33565b5b6000611af185828601611a81565b9250506020611b0285828601611ab7565b9150509250929050565b60008115159050919050565b611b2181611b0c565b82525050565b6000602082019050611b3c6000830184611b18565b92915050565b611b4b81611a96565b82525050565b6000602082019050611b666000830184611b42565b92915050565b600080600060608486031215611b8557611b84611a33565b5b6000611b9386828701611a81565b9350506020611ba486828701611a81565b9250506040611bb586828701611ab7565b9150509250925092565b600060ff82169050919050565b611bd581611bbf565b82525050565b6000602082019050611bf06000830184611bcc565b92915050565b6000819050919050565b611c0981611bf6565b82525050565b6000602082019050611c246000830184611c00565b92915050565b600060208284031215611c4057611c3f611a33565b5b6000611c4e84828501611ab7565b91505092915050565b600060208284031215611c6d57611c6c611a33565b5b6000611c7b84828501611a81565b91505092915050565b611c8d81611a58565b82525050565b6000602082019050611ca86000830184611c84565b92915050565b611cb781611bbf565b8114611cc257600080fd5b50565b600081359050611cd481611cae565b92915050565b611ce381611bf6565b8114611cee57600080fd5b50565b600081359050611d0081611cda565b92915050565b600080600080600080600060e0888a031215611d2557611d24611a33565b5b6000611d338a828b01611a81565b9750506020611d448a828b01611a81565b9650506040611d558a828b01611ab7565b9550506060611d668a828b01611ab7565b9450506080611d778a828b01611cc5565b93505060a0611d888a828b01611cf1565b92505060c0611d998a828b01611cf1565b91505092959891949750929550565b60008060408385031215611dbf57611dbe611a33565b5b6000611dcd85828601611a81565b9250506020611dde85828601611a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e2f57607f821691505b602082108103611e4257611e41611de8565b5b50919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611ea460288361198c565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1482611a96565b9150611f1f83611a96565b9250828203905081811115611f3757611f36611eda565b5b92915050565b6000611f4882611a96565b9150611f5383611a96565b9250828201905080821115611f6b57611f6a611eda565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa760208361198c565b9150611fb282611f71565b602082019050919050565b60006020820190508181036000830152611fd681611f9a565b9050919050565b7f50524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061203960248361198c565b915061204482611fdd565b604082019050919050565b600060208201905081810360008301526120688161202c565b9050919050565b7f50524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006120cb60258361198c565b91506120d68261206f565b604082019050919050565b600060208201905081810360008301526120fa816120be565b9050919050565b7f50524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612137601d8361198c565b915061214282612101565b602082019050919050565b600060208201905081810360008301526121668161212a565b9050919050565b600060c0820190506121826000830189611c00565b61218f6020830188611c84565b61219c6040830187611c84565b6121a96060830186611b42565b6121b66080830185611b42565b6121c360a0830184611b42565b979650505050505050565b7f50524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612204601e8361198c565b915061220f826121ce565b602082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061229660268361198c565b91506122a18261223a565b604082019050919050565b600060208201905081810360008301526122c581612289565b9050919050565b7f50524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061232860248361198c565b9150612333826122cc565b604082019050919050565b600060208201905081810360008301526123578161231b565b9050919050565b7f50524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123ba60228361198c565b91506123c58261235e565b604082019050919050565b600060208201905081810360008301526123e9816123ad565b9050919050565b7f50524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061244c60258361198c565b9150612457826123f0565b604082019050919050565b6000602082019050818103600083015261247b8161243f565b9050919050565b7f50524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006124de60238361198c565b91506124e982612482565b604082019050919050565b6000602082019050818103600083015261250d816124d1565b9050919050565b7f50524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061257060268361198c565b915061257b82612514565b604082019050919050565b6000602082019050818103600083015261259f81612563565b9050919050565b7f50524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006125dc601f8361198c565b91506125e7826125a6565b602082019050919050565b6000602082019050818103600083015261260b816125cf565b9050919050565b7f50524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061266e60218361198c565b915061267982612612565b604082019050919050565b6000602082019050818103600083015261269d81612661565b9050919050565b7f50524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061270060228361198c565b915061270b826126a4565b604082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061279260228361198c565b915061279d82612736565b604082019050919050565b600060208201905081810360008301526127c181612785565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061282460228361198c565b915061282f826127c8565b604082019050919050565b6000602082019050818103600083015261285381612817565b9050919050565b600060808201905061286f6000830187611c00565b61287c6020830186611bcc565b6128896040830185611c00565b6128966060830184611c00565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128d560188361198c565b91506128e08261289f565b602082019050919050565b60006020820190508181036000830152612904816128c8565b9050919050565b600060a0820190506129206000830188611c00565b61292d6020830187611c00565b61293a6040830186611c00565b6129476060830185611b42565b6129546080830184611c84565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061299f60028361295e565b91506129aa82612969565b600282019050919050565b6000819050919050565b6129d06129cb82611bf6565b6129b5565b82525050565b60006129e182612992565b91506129ed82856129bf565b6020820191506129fd82846129bf565b602082019150819050939250505056fea26469706673582212209b7fe5b4b5accea910c117f4554e36638f0793ac093ac8276a63cfd898658a0064736f6c63430008120033