Contract Address Details

0x375ADBa519376Bda93ebCC8a1Abbd47736E91C00

Contract Name
BrightIDSnapshot
Creator
0xb9d52b–ab98c9 at 0x406a20–243cc6
Balance
0 Ether
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
27482153
Contract name:
BrightIDSnapshot




Optimization enabled
false
Compiler version
v0.8.0+commit.c7dfd78e




EVM Version
default




Verified at
2022-01-18 08:59:54.060933Z

Constructor Arguments

000000000000000000000000fa87bb8f09370c422a7608f84b504cc541bb7490736e617073686f74000000000000000000000000000000000000000000000000

Arg [0] (address) : 0xfa87bb8f09370c422a7608f84b504cc541bb7490
Arg [1] (bytes32) : 736e617073686f74000000000000000000000000000000000000000000000000

              

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IBrightIDSnapshot {
event Verified(address indexed addr);
function isVerifiedUser(address _user) external view returns (bool);
function history(address addr) external view returns (address);
}
//-------------------Contracts-------------------------------
contract BrightIDSnapshot is Ownable, IBrightIDSnapshot {
//-------------------Storage-----------------------------
IERC20 public verifierToken; // address of verification Token
bytes32 public app; // Registered BrightID app name
uint32 constant public REGISTRATION_PERIOD = 2592000; // One month
struct Verification {
uint256 time;
bool isVerified;
}
//-------------------Events-----------------------------
event VerifierTokenSet(IERC20 verifierToken);
event AppSet(bytes32 _app);
event Sponsor(address indexed addr);
//-------------------Mappings---------------------------
mapping(address => Verification) public verifications;
mapping(address => address) override public history;
//-------------------Constructor-------------------------
/**
* @param _verifierToken verifier token
* @param _app BrightID app used for verifying users
*/
constructor(IERC20 _verifierToken, bytes32 _app) {
verifierToken = _verifierToken;
app = _app;
}
// emits a sponsor event for brightID nodes
function sponsor(address addr) public {
emit Sponsor(addr);
}
/**
* @notice Set the app
* @param _app BrightID app used for verifying users
*/
function setApp(bytes32 _app) public onlyOwner {
app = _app;
emit AppSet(_app);
}
/**
* @notice Set verifier token
* @param _verifierToken verifier token
*/
function setVerifierToken(IERC20 _verifierToken) public onlyOwner {
verifierToken = _verifierToken;
emit VerifierTokenSet(_verifierToken);
}
/**
* @notice Register a user by BrightID verification
* @param addrs The history of addresses used by this user in the app
* @param timestamp The BrightID node's verification timestamp
* @param v Component of signature
* @param r Component of signature
* @param s Component of signature
*/
function verify(
address[] memory addrs,
uint timestamp,
uint8 v,
bytes32 r,
bytes32 s
) public {
require(verifications[addrs[0]].time < timestamp, "Newer verification registered before.");
require (timestamp > block.timestamp - REGISTRATION_PERIOD, "Verification too old. Try linking again.");
bytes32 message = keccak256(abi.encodePacked(app, addrs, timestamp));
address signer = ecrecover(message, v, r, s);
require(verifierToken.balanceOf(signer) > 0, "not authorized");
verifications[addrs[0]].time = timestamp;
verifications[addrs[0]].isVerified = true;
for(uint i = 1; i < addrs.length; i++) {
require(verifications[addrs[i]].time < block.timestamp - REGISTRATION_PERIOD * 2, "Address changed too recently. Wait for next registration period.");
verifications[addrs[i]].time = timestamp;
verifications[addrs[i]].isVerified = false;
history[addrs[i - 1]] = addrs[i];
}
emit Verified(addrs[0]);
}
/**
* @notice Check an address is verified or not
* @param _user The context id used for verifying users
*/
function isVerifiedUser(address _user) override external view returns (bool) {
return verifications[_user].isVerified;
}
}

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_verifierToken","internalType":"contract IERC20"},{"type":"bytes32","name":"_app","internalType":"bytes32"}]},{"type":"event","name":"AppSet","inputs":[{"type":"bytes32","name":"_app","internalType":"bytes32","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":"Sponsor","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Verified","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"VerifierTokenSet","inputs":[{"type":"address","name":"verifierToken","internalType":"contract IERC20","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"REGISTRATION_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"app","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"history","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isVerifiedUser","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApp","inputs":[{"type":"bytes32","name":"_app","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setVerifierToken","inputs":[{"type":"address","name":"_verifierToken","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sponsor","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"time","internalType":"uint256"},{"type":"bool","name":"isVerified","internalType":"bool"}],"name":"verifications","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"verifierToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"verify","inputs":[{"type":"address[]","name":"addrs","internalType":"address[]"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063867092b61161008c578063b76564bd11610066578063b76564bd146101ff578063e0f540971461021d578063f2fde38b1461023b578063ffde18d714610257576100cf565b8063867092b6146101935780638da5cb5b146101b1578063931c7c68146101cf576100cf565b80630213c0c5146100d4578063080c98da146100f05780633da1c0c314610121578063715018a614610151578063766c4f371461015b57806380d746b214610177575b600080fd5b6100ee60048036038101906100e99190611080565b610273565b005b61010a60048036038101906101059190611057565b6109e4565b604051610118929190611668565b60405180910390f35b61013b60048036038101906101369190611057565b610a15565b6040516101489190611512565b60405180910390f35b610159610a6e565b005b61017560048036038101906101709190611057565b610af6565b005b610191600480360381019061018c9190611138565b610b3c565b005b61019b610c33565b6040516101a8919061158d565b60405180910390f35b6101b9610c59565b6040516101c691906114f7565b60405180910390f35b6101e960048036038101906101e49190611057565b610c82565b6040516101f691906114f7565b60405180910390f35b610207610cb5565b604051610214919061152d565b60405180910390f35b610225610cbb565b6040516102329190611691565b60405180910390f35b61025560048036038101906102509190611057565b610cc2565b005b610271600480360381019061026c919061110f565b610dba565b005b8360036000876000815181106102b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410610338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032f906115c8565b60405180910390fd5b62278d0063ffffffff164261034d919061178b565b841161038e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038590611648565b60405180910390fd5b600060025486866040516020016103a7939291906114be565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516103e49493929190611548565b6020604051602081039080840390855afa158015610406573d6000803e3d6000fd5b5050506020604051035190506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161046f91906114f7565b60206040518083038186803b15801561048757600080fd5b505afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf9190611161565b116104ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f690611608565b60405180910390fd5b85600360008960008151811061053e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600160036000896000815181106105c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506000600190505b875181101561095657600262278d00610643919061174d565b63ffffffff1642610654919061178b565b600360008a8481518110610691577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906115e8565b60405180910390fd5b86600360008a8481518110610755577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600360008a84815181106107dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550878181518110610872577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600460008a60018561088c919061178b565b815181106108c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061094e90611864565b91505061062a565b5086600081518110610991577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6a6455914f452787eb3985452aceedc1000fb545e394eb3b370e3d08958e0a5b60405160405180910390a250505050505050565b60036020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b610a76610e77565b73ffffffffffffffffffffffffffffffffffffffff16610a94610c59565b73ffffffffffffffffffffffffffffffffffffffff1614610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190611628565b60405180910390fd5b610af46000610e7f565b565b8073ffffffffffffffffffffffffffffffffffffffff167f45731ed8c44f9ae4a6da66b49b81184a6565962041a2485f62942faa4da6df6060405160405180910390a250565b610b44610e77565b73ffffffffffffffffffffffffffffffffffffffff16610b62610c59565b73ffffffffffffffffffffffffffffffffffffffff1614610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90611628565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6ebcfc706686427d67aa7da746fbe1ac9454e8908eda7b346b4062fc1ab6759281604051610c28919061158d565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b62278d0081565b610cca610e77565b73ffffffffffffffffffffffffffffffffffffffff16610ce8610c59565b73ffffffffffffffffffffffffffffffffffffffff1614610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590611628565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906115a8565b60405180910390fd5b610db781610e7f565b50565b610dc2610e77565b73ffffffffffffffffffffffffffffffffffffffff16610de0610c59565b73ffffffffffffffffffffffffffffffffffffffff1614610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d90611628565b60405180910390fd5b806002819055507f6d7672b0bf8bc013123bcae6e8cbe39fb5fe29585efab460c4ce79b67d767bd781604051610e6c919061152d565b60405180910390a150565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610f56610f51846116dd565b6116ac565b90508083825260208201905082856020860282011115610f7557600080fd5b60005b85811015610fa55781610f8b8882610faf565b845260208401935060208301925050600181019050610f78565b5050509392505050565b600081359050610fbe8161191f565b92915050565b600082601f830112610fd557600080fd5b8135610fe5848260208601610f43565b91505092915050565b600081359050610ffd81611936565b92915050565b6000813590506110128161194d565b92915050565b60008135905061102781611964565b92915050565b60008151905061103c81611964565b92915050565b6000813590506110518161197b565b92915050565b60006020828403121561106957600080fd5b600061107784828501610faf565b91505092915050565b600080600080600060a0868803121561109857600080fd5b600086013567ffffffffffffffff8111156110b257600080fd5b6110be88828901610fc4565b95505060206110cf88828901611018565b94505060406110e088828901611042565b93505060606110f188828901610fee565b925050608061110288828901610fee565b9150509295509295909350565b60006020828403121561112157600080fd5b600061112f84828501610fee565b91505092915050565b60006020828403121561114a57600080fd5b600061115884828501611003565b91505092915050565b60006020828403121561117357600080fd5b60006111818482850161102d565b91505092915050565b600061119683836111b1565b60208301905092915050565b6111ab816117bf565b82525050565b6111ba816117bf565b82525050565b60006111cb82611719565b6111d58185611731565b93506111e083611709565b8060005b838110156112115781516111f8888261118a565b975061120383611724565b9250506001810190506111e4565b5085935050505092915050565b611227816117d1565b82525050565b611236816117dd565b82525050565b61124d611248826117dd565b6118ad565b82525050565b61125c81611840565b82525050565b600061126f60268361173c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006112d560258361173c565b91507f4e6577657220766572696669636174696f6e207265676973746572656420626560008301527f666f72652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061133b60408361173c565b91507f41646472657373206368616e67656420746f6f20726563656e746c792e20576160008301527f697420666f72206e65787420726567697374726174696f6e20706572696f642e6020830152604082019050919050565b60006113a1600e8361173c565b91507f6e6f7420617574686f72697a65640000000000000000000000000000000000006000830152602082019050919050565b60006113e160208361173c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061142160288361173c565b91507f566572696669636174696f6e20746f6f206f6c642e20547279206c696e6b696e60008301527f6720616761696e2e0000000000000000000000000000000000000000000000006020830152604082019050919050565b61148381611819565b82525050565b61149a61149582611819565b6118b7565b82525050565b6114a981611823565b82525050565b6114b881611833565b82525050565b60006114ca828661123c565b6020820191506114da82856111c0565b91506114e68284611489565b602082019150819050949350505050565b600060208201905061150c60008301846111a2565b92915050565b6000602082019050611527600083018461121e565b92915050565b6000602082019050611542600083018461122d565b92915050565b600060808201905061155d600083018761122d565b61156a60208301866114af565b611577604083018561122d565b611584606083018461122d565b95945050505050565b60006020820190506115a26000830184611253565b92915050565b600060208201905081810360008301526115c181611262565b9050919050565b600060208201905081810360008301526115e1816112c8565b9050919050565b600060208201905081810360008301526116018161132e565b9050919050565b6000602082019050818103600083015261162181611394565b9050919050565b60006020820190508181036000830152611641816113d4565b9050919050565b6000602082019050818103600083015261166181611414565b9050919050565b600060408201905061167d600083018561147a565b61168a602083018461121e565b9392505050565b60006020820190506116a660008301846114a0565b92915050565b6000604051905081810181811067ffffffffffffffff821117156116d3576116d26118f0565b5b8060405250919050565b600067ffffffffffffffff8211156116f8576116f76118f0565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600061175882611823565b915061176383611823565b92508163ffffffff04831182151516156117805761177f6118c1565b5b828202905092915050565b600061179682611819565b91506117a183611819565b9250828210156117b4576117b36118c1565b5b828203905092915050565b60006117ca826117f9565b9050919050565b60008115159050919050565b6000819050919050565b60006117f2826117bf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b600061184b82611852565b9050919050565b600061185d826117f9565b9050919050565b600061186f82611819565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156118a2576118a16118c1565b5b600182019050919050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611928816117bf565b811461193357600080fd5b50565b61193f816117dd565b811461194a57600080fd5b50565b611956816117e7565b811461196157600080fd5b50565b61196d81611819565b811461197857600080fd5b50565b61198481611833565b811461198f57600080fd5b5056fea2646970667358221220872c58e2bfa2d0bcfdbc4e899f8db7152c513af37f43f7899b9cbeb9c63c49f064736f6c63430008000033