Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PassportLogic
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-07-05 */ // File: contracts/lifecycle/PausableProxy.sol pragma solidity ^0.4.24; /** * @title PausableProxy * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract PausableProxy { /** * @dev Storage slot with the paused state of the contract. * This is the keccak-256 hash of "org.monetha.proxy.paused", and is * validated in the constructor. */ bytes32 private constant PAUSED_OWNER_SLOT = 0x9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a; /** * @dev The ClaimableProxy constructor validates PENDING_OWNER_SLOT constant. */ constructor() public { assert(PAUSED_OWNER_SLOT == keccak256("org.monetha.proxy.paused")); } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_getPaused(), "contract should not be paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_getPaused(), "contract should be paused"); _; } /** * @return True when the contract is paused. */ function _getPaused() internal view returns (bool paused) { bytes32 slot = PAUSED_OWNER_SLOT; assembly { paused := sload(slot) } } /** * @dev Sets the paused state. * @param _paused New paused state. */ function _setPaused(bool _paused) internal { bytes32 slot = PAUSED_OWNER_SLOT; assembly { sstore(slot, _paused) } } } // File: contracts/ownership/OwnableProxy.sol pragma solidity ^0.4.24; /** * @title OwnableProxy */ contract OwnableProxy is PausableProxy { event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Storage slot with the owner of the contract. * This is the keccak-256 hash of "org.monetha.proxy.owner", and is * validated in the constructor. */ bytes32 private constant OWNER_SLOT = 0x3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d22; /** * @dev The OwnableProxy constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { assert(OWNER_SLOT == keccak256("org.monetha.proxy.owner")); _setOwner(msg.sender); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == _getOwner()); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner whenNotPaused { emit OwnershipRenounced(_getOwner()); _setOwner(address(0)); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner whenNotPaused { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(_getOwner(), _newOwner); _setOwner(_newOwner); } /** * @return The owner address. */ function owner() public view returns (address) { return _getOwner(); } /** * @return The owner address. */ function _getOwner() internal view returns (address own) { bytes32 slot = OWNER_SLOT; assembly { own := sload(slot) } } /** * @dev Sets the address of the proxy owner. * @param _newOwner Address of the new proxy owner. */ function _setOwner(address _newOwner) internal { bytes32 slot = OWNER_SLOT; assembly { sstore(slot, _newOwner) } } } // File: contracts/ownership/ClaimableProxy.sol pragma solidity ^0.4.24; /** * @title ClaimableProxy * @dev Extension for the OwnableProxy contract, where the ownership needs to be claimed. * This allows the new owner to accept the transfer. */ contract ClaimableProxy is OwnableProxy { /** * @dev Storage slot with the pending owner of the contract. * This is the keccak-256 hash of "org.monetha.proxy.pendingOwner", and is * validated in the constructor. */ bytes32 private constant PENDING_OWNER_SLOT = 0xcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb52; /** * @dev The ClaimableProxy constructor validates PENDING_OWNER_SLOT constant. */ constructor() public { assert(PENDING_OWNER_SLOT == keccak256("org.monetha.proxy.pendingOwner")); } function pendingOwner() public view returns (address) { return _getPendingOwner(); } /** * @dev Modifier throws if called by any account other than the pendingOwner. */ modifier onlyPendingOwner() { require(msg.sender == _getPendingOwner()); _; } /** * @dev Allows the current owner to set the pendingOwner address. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner whenNotPaused { _setPendingOwner(newOwner); } /** * @dev Allows the pendingOwner address to finalize the transfer. */ function claimOwnership() public onlyPendingOwner whenNotPaused { emit OwnershipTransferred(_getOwner(), _getPendingOwner()); _setOwner(_getPendingOwner()); _setPendingOwner(address(0)); } /** * @return The pending owner address. */ function _getPendingOwner() internal view returns (address penOwn) { bytes32 slot = PENDING_OWNER_SLOT; assembly { penOwn := sload(slot) } } /** * @dev Sets the address of the pending owner. * @param _newPendingOwner Address of the new pending owner. */ function _setPendingOwner(address _newPendingOwner) internal { bytes32 slot = PENDING_OWNER_SLOT; assembly { sstore(slot, _newPendingOwner) } } } // File: contracts/IPassportLogic.sol pragma solidity ^0.4.24; interface IPassportLogic { /** * @dev Returns the owner address of contract. */ function owner() external view returns (address); /**** Storage Set Methods ***********/ /// @param _key The key for the record /// @param _value The value for the record function setAddress(bytes32 _key, address _value) external; /// @param _key The key for the record /// @param _value The value for the record function setUint(bytes32 _key, uint _value) external; /// @param _key The key for the record /// @param _value The value for the record function setInt(bytes32 _key, int _value) external; /// @param _key The key for the record /// @param _value The value for the record function setBool(bytes32 _key, bool _value) external; /// @param _key The key for the record /// @param _value The value for the record function setString(bytes32 _key, string _value) external; /// @param _key The key for the record /// @param _value The value for the record function setBytes(bytes32 _key, bytes _value) external; /// @param _key The key for the record function setTxDataBlockNumber(bytes32 _key, bytes _data) external; /// @param _key The key for the record /// @param _value The value for the record function setIPFSHash(bytes32 _key, string _value) external; /**** Storage Delete Methods ***********/ /// @param _key The key for the record function deleteAddress(bytes32 _key) external; /// @param _key The key for the record function deleteUint(bytes32 _key) external; /// @param _key The key for the record function deleteInt(bytes32 _key) external; /// @param _key The key for the record function deleteBool(bytes32 _key) external; /// @param _key The key for the record function deleteString(bytes32 _key) external; /// @param _key The key for the record function deleteBytes(bytes32 _key) external; /// @param _key The key for the record function deleteTxDataBlockNumber(bytes32 _key) external; /// @param _key The key for the record function deleteIPFSHash(bytes32 _key) external; /**** Storage Get Methods ***********/ /// @param _factProvider The fact provider /// @param _key The key for the record function getAddress(address _factProvider, bytes32 _key) external view returns (bool success, address value); /// @param _factProvider The fact provider /// @param _key The key for the record function getUint(address _factProvider, bytes32 _key) external view returns (bool success, uint value); /// @param _factProvider The fact provider /// @param _key The key for the record function getInt(address _factProvider, bytes32 _key) external view returns (bool success, int value); /// @param _factProvider The fact provider /// @param _key The key for the record function getBool(address _factProvider, bytes32 _key) external view returns (bool success, bool value); /// @param _factProvider The fact provider /// @param _key The key for the record function getString(address _factProvider, bytes32 _key) external view returns (bool success, string value); /// @param _factProvider The fact provider /// @param _key The key for the record function getBytes(address _factProvider, bytes32 _key) external view returns (bool success, bytes value); /// @param _factProvider The fact provider /// @param _key The key for the record function getTxDataBlockNumber(address _factProvider, bytes32 _key) external view returns (bool success, uint blockNumber); /// @param _factProvider The fact provider /// @param _key The key for the record function getIPFSHash(address _factProvider, bytes32 _key) external view returns (bool success, string value); } // File: contracts/storage/Storage.sol pragma solidity ^0.4.24; // Storage contracts holds all state. // Do not change the order of the fields, аdd new fields to the end of the contract! contract Storage is ClaimableProxy { /*************************************************************************** *** STORAGE VARIABLES. DO NOT REORDER!!! ADD NEW VARIABLE TO THE END!!! *** ***************************************************************************/ struct AddressValue { bool initialized; address value; } mapping(address => mapping(bytes32 => AddressValue)) internal addressStorage; struct UintValue { bool initialized; uint value; } mapping(address => mapping(bytes32 => UintValue)) internal uintStorage; struct IntValue { bool initialized; int value; } mapping(address => mapping(bytes32 => IntValue)) internal intStorage; struct BoolValue { bool initialized; bool value; } mapping(address => mapping(bytes32 => BoolValue)) internal boolStorage; struct StringValue { bool initialized; string value; } mapping(address => mapping(bytes32 => StringValue)) internal stringStorage; struct BytesValue { bool initialized; bytes value; } mapping(address => mapping(bytes32 => BytesValue)) internal bytesStorage; struct BlockNumberValue { bool initialized; uint blockNumber; } mapping(address => mapping(bytes32 => BlockNumberValue)) internal txBytesStorage; bool private onlyFactProviderFromWhitelistAllowed; mapping(address => bool) private factProviderWhitelist; struct IPFSHashValue { bool initialized; string value; } mapping(address => mapping(bytes32 => IPFSHashValue)) internal ipfsHashStorage; struct PrivateData { string dataIPFSHash; // The IPFS hash of encrypted private data bytes32 dataKeyHash; // The hash of symmetric key that was used to encrypt the data } struct PrivateDataValue { bool initialized; PrivateData value; } mapping(address => mapping(bytes32 => PrivateDataValue)) internal privateDataStorage; enum PrivateDataExchangeState {Closed, Proposed, Accepted} struct PrivateDataExchange { address dataRequester; // The address of the data requester uint256 dataRequesterValue; // The amount staked by the data requester address passportOwner; // The address of the passport owner at the time of the data exchange proposition uint256 passportOwnerValue; // Tha amount staked by the passport owner address factProvider; // The private data provider bytes32 key; // the key for the private data record string dataIPFSHash; // The IPFS hash of encrypted private data bytes32 dataKeyHash; // The hash of data symmetric key that was used to encrypt the data bytes encryptedExchangeKey; // The encrypted exchange session key (only passport owner can decrypt it) bytes32 exchangeKeyHash; // The hash of exchange session key bytes32 encryptedDataKey; // The data symmetric key XORed with the exchange key PrivateDataExchangeState state; // The state of private data exchange uint256 stateExpired; // The state expiration timestamp } uint public openPrivateDataExchangesCount; // the count of open private data exchanges TODO: use it in contract destruction/ownership transfer logic PrivateDataExchange[] public privateDataExchanges; /*************************************************************************** *** END OF SECTION OF STORAGE VARIABLES *** ***************************************************************************/ event WhitelistOnlyPermissionSet(bool indexed onlyWhitelist); event WhitelistFactProviderAdded(address indexed factProvider); event WhitelistFactProviderRemoved(address indexed factProvider); /** * Restrict methods in such way, that they can be invoked only by allowed fact provider. */ modifier allowedFactProvider() { require(isAllowedFactProvider(msg.sender)); _; } /** * Returns true when the given address is an allowed fact provider. */ function isAllowedFactProvider(address _address) public view returns (bool) { return !onlyFactProviderFromWhitelistAllowed || factProviderWhitelist[_address] || _address == _getOwner(); } /** * Returns true when a whitelist of fact providers is enabled. */ function isWhitelistOnlyPermissionSet() external view returns (bool) { return onlyFactProviderFromWhitelistAllowed; } /** * Enables or disables the use of a whitelist of fact providers. */ function setWhitelistOnlyPermission(bool _onlyWhitelist) onlyOwner external { onlyFactProviderFromWhitelistAllowed = _onlyWhitelist; emit WhitelistOnlyPermissionSet(_onlyWhitelist); } /** * Returns true if fact provider is added to the whitelist. */ function isFactProviderInWhitelist(address _address) external view returns (bool) { return factProviderWhitelist[_address]; } /** * Allows owner to add fact provider to whitelist. */ function addFactProviderToWhitelist(address _address) onlyOwner external { factProviderWhitelist[_address] = true; emit WhitelistFactProviderAdded(_address); } /** * Allows owner to remove fact provider from whitelist. */ function removeFactProviderFromWhitelist(address _address) onlyOwner external { delete factProviderWhitelist[_address]; emit WhitelistFactProviderRemoved(_address); } } // File: contracts/storage/AddressStorageLogic.sol pragma solidity ^0.4.24; contract AddressStorageLogic is Storage { event AddressUpdated(address indexed factProvider, bytes32 indexed key); event AddressDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setAddress(bytes32 _key, address _value) external { _setAddress(_key, _value); } /// @param _key The key for the record function deleteAddress(bytes32 _key) external { _deleteAddress(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getAddress(address _factProvider, bytes32 _key) external view returns (bool success, address value) { return _getAddress(_factProvider, _key); } function _setAddress(bytes32 _key, address _value) allowedFactProvider internal { addressStorage[msg.sender][_key] = AddressValue({ initialized : true, value : _value }); emit AddressUpdated(msg.sender, _key); } function _deleteAddress(bytes32 _key) allowedFactProvider internal { delete addressStorage[msg.sender][_key]; emit AddressDeleted(msg.sender, _key); } function _getAddress(address _factProvider, bytes32 _key) internal view returns (bool success, address value) { AddressValue storage initValue = addressStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/UintStorageLogic.sol pragma solidity ^0.4.24; contract UintStorageLogic is Storage { event UintUpdated(address indexed factProvider, bytes32 indexed key); event UintDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setUint(bytes32 _key, uint _value) external { _setUint(_key, _value); } /// @param _key The key for the record function deleteUint(bytes32 _key) external { _deleteUint(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getUint(address _factProvider, bytes32 _key) external view returns (bool success, uint value) { return _getUint(_factProvider, _key); } function _setUint(bytes32 _key, uint _value) allowedFactProvider internal { uintStorage[msg.sender][_key] = UintValue({ initialized : true, value : _value }); emit UintUpdated(msg.sender, _key); } function _deleteUint(bytes32 _key) allowedFactProvider internal { delete uintStorage[msg.sender][_key]; emit UintDeleted(msg.sender, _key); } function _getUint(address _factProvider, bytes32 _key) internal view returns (bool success, uint value) { UintValue storage initValue = uintStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/IntStorageLogic.sol pragma solidity ^0.4.24; contract IntStorageLogic is Storage { event IntUpdated(address indexed factProvider, bytes32 indexed key); event IntDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setInt(bytes32 _key, int _value) external { _setInt(_key, _value); } /// @param _key The key for the record function deleteInt(bytes32 _key) external { _deleteInt(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getInt(address _factProvider, bytes32 _key) external view returns (bool success, int value) { return _getInt(_factProvider, _key); } function _setInt(bytes32 _key, int _value) allowedFactProvider internal { intStorage[msg.sender][_key] = IntValue({ initialized : true, value : _value }); emit IntUpdated(msg.sender, _key); } function _deleteInt(bytes32 _key) allowedFactProvider internal { delete intStorage[msg.sender][_key]; emit IntDeleted(msg.sender, _key); } function _getInt(address _factProvider, bytes32 _key) internal view returns (bool success, int value) { IntValue storage initValue = intStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/BoolStorageLogic.sol pragma solidity ^0.4.24; contract BoolStorageLogic is Storage { event BoolUpdated(address indexed factProvider, bytes32 indexed key); event BoolDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setBool(bytes32 _key, bool _value) external { _setBool(_key, _value); } /// @param _key The key for the record function deleteBool(bytes32 _key) external { _deleteBool(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getBool(address _factProvider, bytes32 _key) external view returns (bool success, bool value) { return _getBool(_factProvider, _key); } function _setBool(bytes32 _key, bool _value) allowedFactProvider internal { boolStorage[msg.sender][_key] = BoolValue({ initialized : true, value : _value }); emit BoolUpdated(msg.sender, _key); } function _deleteBool(bytes32 _key) allowedFactProvider internal { delete boolStorage[msg.sender][_key]; emit BoolDeleted(msg.sender, _key); } function _getBool(address _factProvider, bytes32 _key) internal view returns (bool success, bool value) { BoolValue storage initValue = boolStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/StringStorageLogic.sol pragma solidity ^0.4.24; contract StringStorageLogic is Storage { event StringUpdated(address indexed factProvider, bytes32 indexed key); event StringDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setString(bytes32 _key, string _value) external { _setString(_key, _value); } /// @param _key The key for the record function deleteString(bytes32 _key) external { _deleteString(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getString(address _factProvider, bytes32 _key) external view returns (bool success, string value) { return _getString(_factProvider, _key); } function _setString(bytes32 _key, string _value) allowedFactProvider internal { stringStorage[msg.sender][_key] = StringValue({ initialized : true, value : _value }); emit StringUpdated(msg.sender, _key); } function _deleteString(bytes32 _key) allowedFactProvider internal { delete stringStorage[msg.sender][_key]; emit StringDeleted(msg.sender, _key); } function _getString(address _factProvider, bytes32 _key) internal view returns (bool success, string value) { StringValue storage initValue = stringStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/BytesStorageLogic.sol pragma solidity ^0.4.24; contract BytesStorageLogic is Storage { event BytesUpdated(address indexed factProvider, bytes32 indexed key); event BytesDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setBytes(bytes32 _key, bytes _value) external { _setBytes(_key, _value); } /// @param _key The key for the record function deleteBytes(bytes32 _key) external { _deleteBytes(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getBytes(address _factProvider, bytes32 _key) external view returns (bool success, bytes value) { return _getBytes(_factProvider, _key); } function _setBytes(bytes32 _key, bytes _value) allowedFactProvider internal { bytesStorage[msg.sender][_key] = BytesValue({ initialized : true, value : _value }); emit BytesUpdated(msg.sender, _key); } function _deleteBytes(bytes32 _key) allowedFactProvider internal { delete bytesStorage[msg.sender][_key]; emit BytesDeleted(msg.sender, _key); } function _getBytes(address _factProvider, bytes32 _key) internal view returns (bool success, bytes value) { BytesValue storage initValue = bytesStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: contracts/storage/TxDataStorageLogic.sol pragma solidity ^0.4.24; /** * @title TxDataStorage * @dev This contract saves only the block number for the input data. The input data is not stored into * Ethereum storage, but it can be decoded from the transaction input data later. */ contract TxDataStorageLogic is Storage { event TxDataUpdated(address indexed factProvider, bytes32 indexed key); event TxDataDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _data The data for the record. Ignore "unused function parameter" warning, it's not commented out so that /// it would remain in the ABI file. function setTxDataBlockNumber(bytes32 _key, bytes _data) allowedFactProvider external { _data; txBytesStorage[msg.sender][_key] = BlockNumberValue({ initialized : true, blockNumber : block.number }); emit TxDataUpdated(msg.sender, _key); } /// @param _key The key for the record function deleteTxDataBlockNumber(bytes32 _key) allowedFactProvider external { delete txBytesStorage[msg.sender][_key]; emit TxDataDeleted(msg.sender, _key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getTxDataBlockNumber(address _factProvider, bytes32 _key) external view returns (bool success, uint blockNumber) { return _getTxDataBlockNumber(_factProvider, _key); } function _getTxDataBlockNumber(address _factProvider, bytes32 _key) private view returns (bool success, uint blockNumber) { BlockNumberValue storage initValue = txBytesStorage[_factProvider][_key]; return (initValue.initialized, initValue.blockNumber); } } // File: contracts/storage/IPFSStorageLogic.sol pragma solidity ^0.4.24; contract IPFSStorageLogic is Storage { event IPFSHashUpdated(address indexed factProvider, bytes32 indexed key); event IPFSHashDeleted(address indexed factProvider, bytes32 indexed key); /// @param _key The key for the record /// @param _value The value for the record function setIPFSHash(bytes32 _key, string _value) external { _setIPFSHash(_key, _value); } /// @param _key The key for the record function deleteIPFSHash(bytes32 _key) external { _deleteIPFSHash(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getIPFSHash(address _factProvider, bytes32 _key) external view returns (bool success, string value) { return _getIPFSHash(_factProvider, _key); } function _setIPFSHash(bytes32 _key, string _value) allowedFactProvider internal { ipfsHashStorage[msg.sender][_key] = IPFSHashValue({ initialized : true, value : _value }); emit IPFSHashUpdated(msg.sender, _key); } function _deleteIPFSHash(bytes32 _key) allowedFactProvider internal { delete ipfsHashStorage[msg.sender][_key]; emit IPFSHashDeleted(msg.sender, _key); } function _getIPFSHash(address _factProvider, bytes32 _key) internal view returns (bool success, string value) { IPFSHashValue storage initValue = ipfsHashStorage[_factProvider][_key]; return (initValue.initialized, initValue.value); } } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: contracts/storage/PrivateDataStorageLogic.sol pragma solidity ^0.4.24; contract PrivateDataStorageLogic is Storage { using SafeMath for uint256; event PrivateDataHashesUpdated(address indexed factProvider, bytes32 indexed key); event PrivateDataHashesDeleted(address indexed factProvider, bytes32 indexed key); event PrivateDataExchangeProposed(uint256 indexed exchangeIdx, address indexed dataRequester, address indexed passportOwner); event PrivateDataExchangeAccepted(uint256 indexed exchangeIdx, address indexed dataRequester, address indexed passportOwner); event PrivateDataExchangeClosed(uint256 indexed exchangeIdx); event PrivateDataExchangeDisputed(uint256 indexed exchangeIdx, bool indexed successful, address indexed cheater); uint256 constant public privateDataExchangeProposeTimeout = 1 days; uint256 constant public privateDataExchangeAcceptTimeout = 1 days; /// @param _key The key for the record /// @param _dataIPFSHash The IPFS hash of encrypted private data /// @param _dataKeyHash The hash of symmetric key that was used to encrypt the data function setPrivateDataHashes(bytes32 _key, string _dataIPFSHash, bytes32 _dataKeyHash) external { _setPrivateDataHashes(_key, _dataIPFSHash, _dataKeyHash); } /// @param _key The key for the record function deletePrivateDataHashes(bytes32 _key) external { _deletePrivateDataHashes(_key); } /// @param _factProvider The fact provider /// @param _key The key for the record function getPrivateDataHashes(address _factProvider, bytes32 _key) external view returns (bool success, string dataIPFSHash, bytes32 dataKeyHash) { return _getPrivateDataHashes(_factProvider, _key); } /** * @dev returns the number of private data exchanges created. */ function getPrivateDataExchangesCount() public constant returns (uint256 count) { return privateDataExchanges.length; } /// @param _factProvider The fact provider /// @param _key The key for the record /// @param _encryptedExchangeKey The encrypted exchange session key (only passport owner can decrypt it) /// @param _exchangeKeyHash The hash of exchange session key function proposePrivateDataExchange( address _factProvider, bytes32 _key, bytes _encryptedExchangeKey, bytes32 _exchangeKeyHash ) external payable { (bool success, string memory dataIPFSHash, bytes32 dataKeyHash) = _getPrivateDataHashes(_factProvider, _key); require(success, "private data must exist"); address passportOwner = _getOwner(); bytes32 encryptedDataKey; PrivateDataExchange memory exchange = PrivateDataExchange({ dataRequester : msg.sender, dataRequesterValue : msg.value, passportOwner : passportOwner, passportOwnerValue : 0, factProvider : _factProvider, key : _key, dataIPFSHash : dataIPFSHash, dataKeyHash : dataKeyHash, encryptedExchangeKey : _encryptedExchangeKey, exchangeKeyHash : _exchangeKeyHash, encryptedDataKey : encryptedDataKey, state : PrivateDataExchangeState.Proposed, stateExpired : _nowSeconds() + privateDataExchangeProposeTimeout }); privateDataExchanges.push(exchange); _incOpenPrivateDataExchangesCount(); uint256 exchangeIdx = privateDataExchanges.length - 1; emit PrivateDataExchangeProposed(exchangeIdx, msg.sender, passportOwner); } /// @param _exchangeIdx The private data exchange index /// @param _encryptedDataKey The data symmetric key XORed with the exchange key function acceptPrivateDataExchange(uint256 _exchangeIdx, bytes32 _encryptedDataKey) external payable { require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index"); PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx]; require(msg.sender == exchange.passportOwner, "only passport owner allowed"); require(PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state"); require(msg.value >= exchange.dataRequesterValue, "need to stake at least data requester amount"); require(_nowSeconds() < exchange.stateExpired, "exchange state expired"); exchange.passportOwnerValue = msg.value; exchange.encryptedDataKey = _encryptedDataKey; exchange.state = PrivateDataExchangeState.Accepted; exchange.stateExpired = _nowSeconds() + privateDataExchangeAcceptTimeout; emit PrivateDataExchangeAccepted(_exchangeIdx, exchange.dataRequester, msg.sender); } /// @param _exchangeIdx The private data exchange index function finishPrivateDataExchange(uint256 _exchangeIdx) external { require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index"); PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx]; require(PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state"); require(_nowSeconds() > exchange.stateExpired || msg.sender == exchange.dataRequester, "exchange must be either expired or be finished by the data requester"); exchange.state = PrivateDataExchangeState.Closed; // transfer all exchange staked money to passport owner uint256 val = exchange.dataRequesterValue.add(exchange.passportOwnerValue); require(exchange.passportOwner.send(val)); _decOpenPrivateDataExchangesCount(); emit PrivateDataExchangeClosed(_exchangeIdx); } /// @param _exchangeIdx The private data exchange index function timeoutPrivateDataExchange(uint256 _exchangeIdx) external { require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index"); PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx]; require(PrivateDataExchangeState.Proposed == exchange.state, "exchange must be in proposed state"); require(msg.sender == exchange.dataRequester, "only data requester allowed"); require(_nowSeconds() > exchange.stateExpired, "exchange must be expired"); exchange.state = PrivateDataExchangeState.Closed; // return staked amount to data requester require(exchange.dataRequester.send(exchange.dataRequesterValue)); _decOpenPrivateDataExchangesCount(); emit PrivateDataExchangeClosed(_exchangeIdx); } /// @param _exchangeIdx The private data exchange index /// @param _exchangeKey The unencrypted exchange session key function disputePrivateDataExchange(uint256 _exchangeIdx, bytes32 _exchangeKey) external { require(_exchangeIdx < privateDataExchanges.length, "invalid exchange index"); PrivateDataExchange storage exchange = privateDataExchanges[_exchangeIdx]; require(PrivateDataExchangeState.Accepted == exchange.state, "exchange must be in accepted state"); require(msg.sender == exchange.dataRequester, "only data requester allowed"); require(_nowSeconds() < exchange.stateExpired, "exchange must not be expired"); require(keccak256(abi.encodePacked(_exchangeKey)) == exchange.exchangeKeyHash, "exchange key hash must match"); bytes32 dataKey = _exchangeKey ^ exchange.encryptedDataKey; // data symmetric key is XORed with exchange key bool validDataKey = keccak256(abi.encodePacked(dataKey)) == exchange.dataKeyHash; exchange.state = PrivateDataExchangeState.Closed; uint256 val = exchange.dataRequesterValue.add(exchange.passportOwnerValue); address cheater; if (validDataKey) {// the data key was valid -> data requester cheated require(exchange.passportOwner.send(val)); cheater = exchange.dataRequester; } else {// the data key is invalid -> passport owner cheated require(exchange.dataRequester.send(val)); cheater = exchange.passportOwner; } _decOpenPrivateDataExchangesCount(); emit PrivateDataExchangeClosed(_exchangeIdx); emit PrivateDataExchangeDisputed(_exchangeIdx, !validDataKey, cheater); } function _incOpenPrivateDataExchangesCount() internal { if (++openPrivateDataExchangesCount == 1) { // don't allow passport owner to transfer ownership and destroy passport when there are open exchanges _setPaused(true); } } function _decOpenPrivateDataExchangesCount() internal { if (--openPrivateDataExchangesCount == 0) { // allow passport owner to transfer ownership and destroy passport when all exchanges are closed _setPaused(false); } } function _setPrivateDataHashes(bytes32 _key, string _dataIPFSHash, bytes32 _dataKeyHash) allowedFactProvider internal { privateDataStorage[msg.sender][_key] = PrivateDataValue({ initialized : true, value : PrivateData({ dataIPFSHash : _dataIPFSHash, dataKeyHash : _dataKeyHash }) }); emit PrivateDataHashesUpdated(msg.sender, _key); } function _deletePrivateDataHashes(bytes32 _key) allowedFactProvider internal { delete privateDataStorage[msg.sender][_key]; emit PrivateDataHashesDeleted(msg.sender, _key); } function _getPrivateDataHashes(address _factProvider, bytes32 _key) internal view returns (bool success, string dataIPFSHash, bytes32 dataKeyHash) { PrivateDataValue storage initValue = privateDataStorage[_factProvider][_key]; return (initValue.initialized, initValue.value.dataIPFSHash, initValue.value.dataKeyHash); } function _nowSeconds() private view returns(uint256) { uint256 t = now; // In Quorum blockchain timestamp is in nanoseconds, not seconds: // https://github.com/jpmorganchase/quorum/issues/713 // https://github.com/jpmorganchase/quorum/issues/190 if (t > 150000000000000000) { t /= 1000000000; } return t; } } // File: contracts/PassportLogic.sol pragma solidity ^0.4.24; contract PassportLogic is IPassportLogic , ClaimableProxy , AddressStorageLogic , UintStorageLogic , IntStorageLogic , BoolStorageLogic , StringStorageLogic , BytesStorageLogic , TxDataStorageLogic , IPFSStorageLogic , PrivateDataStorageLogic {}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"}],"name":"finishPrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"}],"name":"timeoutPrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"privateDataExchangeAcceptTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getTxDataBlockNumber","outputs":[{"name":"success","type":"bool"},{"name":"blockNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isAllowedFactProvider","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getIPFSHash","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteIPFSHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_onlyWhitelist","type":"bool"}],"name":"setWhitelistOnlyPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteBool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getPrivateDataHashes","outputs":[{"name":"success","type":"bool"},{"name":"dataIPFSHash","type":"string"},{"name":"dataKeyHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes"}],"name":"setBytes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_data","type":"bytes"}],"name":"setTxDataBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteBytes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isWhitelistOnlyPermissionSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deletePrivateDataHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getBytes","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"string"}],"name":"setIPFSHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeFactProviderFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"string"}],"name":"setString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"privateDataExchanges","outputs":[{"name":"dataRequester","type":"address"},{"name":"dataRequesterValue","type":"uint256"},{"name":"passportOwner","type":"address"},{"name":"passportOwnerValue","type":"uint256"},{"name":"factProvider","type":"address"},{"name":"key","type":"bytes32"},{"name":"dataIPFSHash","type":"string"},{"name":"dataKeyHash","type":"bytes32"},{"name":"encryptedExchangeKey","type":"bytes"},{"name":"exchangeKeyHash","type":"bytes32"},{"name":"encryptedDataKey","type":"bytes32"},{"name":"state","type":"uint8"},{"name":"stateExpired","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getUint","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getAddress","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrivateDataExchangesCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"},{"name":"_encryptedDataKey","type":"bytes32"}],"name":"acceptPrivateDataExchange","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isFactProviderInWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getInt","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getBool","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteTxDataBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"privateDataExchangeProposeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"bool"}],"name":"setBool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addFactProviderToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"address"}],"name":"setAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"openPrivateDataExchangesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"},{"name":"_encryptedExchangeKey","type":"bytes"},{"name":"_exchangeKeyHash","type":"bytes32"}],"name":"proposePrivateDataExchange","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_factProvider","type":"address"},{"name":"_key","type":"bytes32"}],"name":"getString","outputs":[{"name":"success","type":"bool"},{"name":"value","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_dataIPFSHash","type":"string"},{"name":"_dataKeyHash","type":"bytes32"}],"name":"setPrivateDataHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"bytes32"}],"name":"deleteString","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeIdx","type":"uint256"},{"name":"_exchangeKey","type":"bytes32"}],"name":"disputePrivateDataExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"PrivateDataHashesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"PrivateDataHashesDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"dataRequester","type":"address"},{"indexed":true,"name":"passportOwner","type":"address"}],"name":"PrivateDataExchangeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"dataRequester","type":"address"},{"indexed":true,"name":"passportOwner","type":"address"}],"name":"PrivateDataExchangeAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"}],"name":"PrivateDataExchangeClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"exchangeIdx","type":"uint256"},{"indexed":true,"name":"successful","type":"bool"},{"indexed":true,"name":"cheater","type":"address"}],"name":"PrivateDataExchangeDisputed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IPFSHashUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IPFSHashDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"TxDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"TxDataDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BytesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BytesDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"StringUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"StringDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"BoolDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IntUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"IntDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"UintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"UintDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"},{"indexed":true,"name":"key","type":"bytes32"}],"name":"AddressDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"onlyWhitelist","type":"bool"}],"name":"WhitelistOnlyPermissionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"}],"name":"WhitelistFactProviderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"factProvider","type":"address"}],"name":"WhitelistFactProviderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060408190527f6f72672e6d6f6e657468612e70726f78792e6f776e6572000000000000000000905261003b3364010000000061009a810204565b604080517f6f72672e6d6f6e657468612e70726f78792e70656e64696e674f776e657200008152905190819003601e0190207fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb521461009557fe5b6100be565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b6130e480620000ce6000396000f3006080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306427a88811461024a57806308c50498146102645780630a2565251461027c5780630e14a376146102a3578063174a6277146102bb57806320888158146102fa57806322b96b631461032f578063257781e7146103d65780632b42a89a146103ee5780632c62ff2d146104085780632db27bd2146104205780632e28d084146104cb5780633e49bed0146104ef5780634e71e0c81461050a5780635b2a372d1461051f578063616b59f61461054357806361a2d0761461055b57806363019d1d146105705780636556f767146105885780636bfc8bb5146105ac5780636d4e7802146105d05780636e899550146105f15780636f618f9a14610615578063715018a6146107bc57806371658552146107d15780637ac4ed64146107f55780637dd291e41461083c57806386ca9a7c146108515780638ae44a081461085f5780638c160095146108805780638da5cb5b1461089857806395ee8bae146108c95780639d74b37d146108ed578063a2b6cbe11461092c578063ab338e361461027c578063abfdcced14610944578063ac0aeb1a14610961578063ca446dd914610982578063caa95f1b146109a6578063cea332cc146109bb578063e2a4853a146109e2578063e2b202bf146109fd578063e30c397814610a15578063e318de7314610a2a578063e75a836a14610a4e578063f2fde38b14610a75578063f6bb3cc414610a96578063fc2d058414610aae575b600080fd5b34801561025657600080fd5b50610262600435610ac9565b005b34801561027057600080fd5b50610262600435610d01565b34801561028857600080fd5b50610291610f21565b60408051918252519081900360200190f35b3480156102af57600080fd5b50610262600435610f28565b3480156102c757600080fd5b506102df600160a060020a0360043516602435610f34565b60408051921515835260208301919091528051918290030190f35b34801561030657600080fd5b5061031b600160a060020a0360043516610f4c565b604080519115158252519081900360200190f35b34801561033b57600080fd5b50610353600160a060020a0360043516602435610fa2565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039a578181015183820152602001610382565b50505050905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156103e257600080fd5b50610262600435610fb0565b3480156103fa57600080fd5b506102626004351515610fb9565b34801561041457600080fd5b50610262600435611012565b34801561042c57600080fd5b50610444600160a060020a036004351660243561101b565b604080518415158152908101829052606060208083018281528551928401929092528451608084019186019080838360005b8381101561048e578181015183820152602001610476565b50505050905090810190601f1680156104bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156104d757600080fd5b50610262600480359060248035908101910135611038565b3480156104fb57600080fd5b50610262600435602435611077565b34801561051657600080fd5b50610262611085565b34801561052b57600080fd5b50610262600480359060248035908101910135611168565b34801561054f57600080fd5b506102626004356111ed565b34801561056757600080fd5b5061031b6111f6565b34801561057c57600080fd5b50610262600435611200565b34801561059457600080fd5b50610353600160a060020a0360043516602435611209565b3480156105b857600080fd5b50610262600480359060248035908101910135611217565b3480156105dc57600080fd5b50610262600160a060020a0360043516611251565b3480156105fd57600080fd5b506102626004803590602480359081019101356112b6565b34801561062157600080fd5b5061062d6004356112f0565b604051808e600160a060020a0316600160a060020a031681526020018d81526020018c600160a060020a0316600160a060020a031681526020018b81526020018a600160a060020a0316600160a060020a03168152602001896000191660001916815260200180602001886000191660001916815260200180602001876000191660001916815260200186600019166000191681526020018560028111156106d157fe5b60ff16815260200184815260200183810383528a818151815260200191508051906020019080838360005b838110156107145781810151838201526020016106fc565b50505050905090810190601f1680156107415780820380516001836020036101000a031916815260200191505b5083810382528851815288516020918201918a019080838360005b8381101561077457818101518382015260200161075c565b50505050905090810190601f1680156107a15780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b3480156107c857600080fd5b50610262611490565b3480156107dd57600080fd5b506102df600160a060020a0360043516602435611550565b34801561080157600080fd5b50610819600160a060020a036004351660243561155d565b604080519215158352600160a060020a0390911660208301528051918290030190f35b34801561084857600080fd5b5061029161156a565b610262600435602435611570565b34801561086b57600080fd5b5061031b600160a060020a0360043516611807565b34801561088c57600080fd5b50610262600435611825565b3480156108a457600080fd5b506108ad61182e565b60408051600160a060020a039092168252519081900360200190f35b3480156108d557600080fd5b506102df600160a060020a036004351660243561183d565b3480156108f957600080fd5b50610911600160a060020a036004351660243561184a565b60408051921515835290151560208301528051918290030190f35b34801561093857600080fd5b50610262600435611857565b34801561095057600080fd5b5061026260043560243515156118be565b34801561096d57600080fd5b50610262600160a060020a03600435166118c8565b34801561098e57600080fd5b50610262600435600160a060020a0360243516611930565b3480156109b257600080fd5b5061029161193a565b61026260048035600160a060020a0316906024803591604435918201910135606435611940565b3480156109ee57600080fd5b50610262600435602435611cd2565b348015610a0957600080fd5b50610262600435611cdc565b348015610a2157600080fd5b506108ad611ce5565b348015610a3657600080fd5b50610353600160a060020a0360043516602435611cef565b348015610a5a57600080fd5b50610262600480359060248035908101910135604435611cfd565b348015610a8157600080fd5b50610262600160a060020a0360043516611d3f565b348015610aa257600080fd5b50610262600435611dc1565b348015610aba57600080fd5b50610262600435602435611dca565b600c5460009081908310610b15576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805484908110610b2357fe5b60009182526020909120600d90910201600b81015490925060ff166002811115610b4957fe5b600214610bae576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b81600c0154610bbb612205565b1180610bd057508154600160a060020a031633145b1515610c73576040805160e560020a62461bcd028152602060048201526044602482018190527f65786368616e6765206d75737420626520656974686572206578706972656420908201527f6f722062652066696e697368656420627920746865206461746120726571756560648201527f7374657200000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b8201805460ff1916905560038201546001830154610c9291612228565b6002830154604051919250600160a060020a03169082156108fc029083906000818181858888f193505050501515610cc957600080fd5b610cd1612235565b60405183907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2505050565b600c546000908210610d4b576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805483908110610d5957fe5b60009182526020909120600d90910201600b81015490915060ff166002811115610d7f57fe5b600114610de4576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8054600160a060020a03163314610e45576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b80600c0154610e52612205565b11610ea7576040805160e560020a62461bcd02815260206004820152601860248201527f65786368616e6765206d75737420626520657870697265640000000000000000604482015290519081900360640190fd5b600b8101805460ff1916905580546001820154604051600160a060020a03909216916108fc82150291906000818181858888f193505050501515610eea57600080fd5b610ef2612235565b60405182907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a25050565b6201518081565b610f3181612251565b50565b600080610f4184846122c4565b915091509250929050565b60075460009060ff161580610f795750600160a060020a03821660009081526008602052604090205460ff165b80610f9c5750610f876122f8565b600160a060020a031682600160a060020a0316145b92915050565b60006060610f41848461231d565b610f31816123e7565b610fc16122f8565b600160a060020a03163314610fd557600080fd5b6007805460ff19168215159081179091556040517f6e1eb3fa845047cf9d5fd1deb1b7770b4e26163dd4d88cefb14fe7964a70059590600090a250565b610f318161245d565b60006060600061102b85856124bf565b9250925092509250925092565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061258f945050505050565b505050565b6110818282612629565b5050565b61108d6126ad565b600160a060020a031633146110a157600080fd5b6110a96126d2565b156110fe576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6111066126ad565b600160a060020a03166111176122f8565b600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361115c6111576126ad565b6126f7565b611166600061271b565b565b61117133610f4c565b151561117c57600080fd5b6040805180820182526001808252436020808401918252336000818152600683528681208a82529092528582209451855460ff191690151517855591519390920192909255915185927fcbde9cd310365ff3de3ad9cb44ed688d8880c7b1d15df733a73880fb84d032de91a3505050565b610f318161273f565b60075460ff165b90565b610f31816127b5565b60006060610f418484612837565b6110728383838080601f016020809104026020016040519081016040528093929190818152602001838380828437506128c3945050505050565b6112596122f8565b600160a060020a0316331461126d57600080fd5b600160a060020a038116600081815260086020526040808220805460ff19169055517f5bf47f016603dfff957e6086bd9a350212686e8f1d9208b3db47c5a3107c78789190a250565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061295d945050505050565b600c8054829081106112fe57fe5b6000918252602091829020600d90910201805460018083015460028085015460038601546004870154600588015460068901805460408051601f6000199b841615610100029b909b01909216979097049889018c90048c0281018c01909652878652600160a060020a039889169b509599938816989297919091169590949193928301828280156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815295969395939450908301828280156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050506009840154600a850154600b860154600c909601549495919490935060ff90911691508d565b6114986122f8565b600160a060020a031633146114ac57600080fd5b6114b46126d2565b15611509576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6115116122f8565b600160a060020a03167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a261116660006126f7565b600080610f4184846129f7565b600080610f418484612a2a565b600c5490565b600c5460009083106115ba576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c8054849081106115c857fe5b60009182526020909120600d909102016002810154909150600160a060020a0316331461163f576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070617373706f7274206f776e657220616c6c6f7765640000000000604482015290519081900360640190fd5b600b81015460ff16600281111561165257fe5b6001146116b7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b6001810154341015611739576040805160e560020a62461bcd02815260206004820152602c60248201527f6e65656420746f207374616b65206174206c656173742064617461207265717560448201527f657374657220616d6f756e740000000000000000000000000000000000000000606482015290519081900360840190fd5b80600c0154611746612205565b1061179b576040805160e560020a62461bcd02815260206004820152601660248201527f65786368616e6765207374617465206578706972656400000000000000000000604482015290519081900360640190fd5b346003820155600a8101829055600b8101805460ff19166002179055620151806117c3612205565b01600c82015580546040513391600160a060020a03169085907f843dda373d0d243dce80a6cd203b9cbba8576d036c7eb937f9de36ebe6e8b02390600090a4505050565b600160a060020a031660009081526008602052604090205460ff1690565b610f3181612a5d565b60006118386122f8565b905090565b600080610f418484612ac4565b600080610f418484612af8565b61186033610f4c565b151561186b57600080fd5b336000818152600660209081526040808320858452909152808220805460ff19168155600101829055518392917f9b9532c8ba5879554dee7c3e9374bd26dbfb2f79cf7f247bcf90648fc81fc16491a350565b6110818282612b2d565b6118d06122f8565b600160a060020a031633146118e457600080fd5b600160a060020a038116600081815260086020526040808220805460ff19166001179055517fff8ac5f0e9cdc8f7ffbbc29ab1301ee649cf01cf7a6a9265a2d90587612c41759190a250565b6110818282612bc0565b600b5481565b600060606000806000611951612f59565b600061195d8c8c6124bf565b9650965096508615156119ba576040805160e560020a62461bcd02815260206004820152601760248201527f707269766174652064617461206d757374206578697374000000000000000000604482015290519081900360640190fd5b6119c26122f8565b93506101a06040519081016040528033600160a060020a0316815260200134815260200185600160a060020a03168152602001600081526020018d600160a060020a031681526020018c600019168152602001878152602001866000191681526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437505050928452505050602081018a9052604081018590526060016001815260200162015180611a7c612205565b019052600c8054600181018083556000929092528251600d9091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c781018054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff199182161782556020808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c885015560408701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c98501805491871691841691909117905560608701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8ca85015560808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cb850180549190961692169190911790935560a08501517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cc83015560c08501518051959750939487949193611c0a937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cd01920190612fc4565b5060e082015160078201556101008201518051611c31916008840191602090910190612fc4565b506101208201516009820155610140820151600a820155610160820151600b8201805460ff19166001836002811115611c6657fe5b021790555061018082015181600c0155505050611c81612c6e565b50600c5460405160001990910190600160a060020a03851690339083907fabe53237e9ea366da7fa5507ac62db22bd446d6b66bcff4a6d6c1b11e9af198390600090a4505050505050505050505050565b6110818282612c8b565b610f3181612d0e565b60006118386126ad565b60006060610f418484612d75565b611d398484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750889450612e019350505050565b50505050565b611d476122f8565b600160a060020a03163314611d5b57600080fd5b611d636126d2565b15611db8576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b610f318161271b565b610f3181612ebf565b6000806000806000600c8054905087101515611e1e576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805488908110611e2c57fe5b60009182526020909120600d90910201600b81015490955060ff166002811115611e5257fe5b600214611eb7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8454600160a060020a03163314611f18576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b84600c0154611f25612205565b10611f7a576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206d757374206e6f74206265206578706972656400000000604482015290519081900360640190fd5b60098501546040805160208082018a905282518083038201815291830192839052815191929182918401908083835b60208310611fc85780518252601f199092019160209182019101611fa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515612050576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206b65792068617368206d757374206d6174636800000000604482015290519081900360640190fd5b600a85015460078601546040805192891860208085018290528251808603820181529483019283905284519198509293928291908401908083835b602083106120aa5780518252601f19909201916020918201910161208b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600b8a01805460ff1916905560038a015460018b01549590911497506120fe94935091506122289050565b9150821561214d576002850154604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561213c57600080fd5b508354600160a060020a0316612190565b8454604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561218057600080fd5b506002840154600160a060020a03165b612198612235565b60405187907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2604051600160a060020a0382169084159089907f540941e0fc2370abde0bfa6ddbb49188469597e518416fa24327f39469c9b2ec90600090a450505050505050565b600042670214e8348c4f000081111561222057633b9aca0090045b8091505b5090565b81810182811015610f9c57fe5b600b805460001901908190551515611166576111666000612f35565b61225a33610f4c565b151561226557600080fd5b33600081815260208181526040808320858452909152808220805474ffffffffffffffffffffffffffffffffffffffffff19169055518392917fed9474c4702ee9da4d0d2085840fafed5912b8e13daf1d6ea341ebe98803aec291a350565b600160a060020a0391909116600090815260066020908152604080832093835292905220805460019091015460ff90911691565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d225490565b600160a060020a038216600090815260096020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b820191906000526020600020905b8154815290600101906020018083116123b757829003601f168201915b5050505050905092509250509250929050565b6123f033610f4c565b15156123fb57600080fd5b3360009081526009602090815260408083208484529091528120805460ff191681559061242b600183018261303e565b5050604051819033907f140278d2322b9671bf293aea878e7717c46d5b7cd955e3e426ee67e01b90165490600090a350565b61246633610f4c565b151561247157600080fd5b336000818152600360209081526040808320858452909152808220805461ffff19169055518392917f191bd7fc1f22ce6b74b7d7e42126f0ed225b109728607c99971de9e78b0db6eb91a350565b600160a060020a0382166000908152600a6020908152604080832084845282528083208054600280830154600180850180548751601f93821615610100026000190190911694909404918201889004880284018801909652808352606096889660ff909516949391849183018282801561257a5780601f1061254f5761010080835404028352916020019161257a565b820191906000526020600020905b81548152906001019060200180831161255d57829003601f168201915b50505050509150935093509350509250925092565b61259833610f4c565b15156125a357600080fd5b60408051808201825260018082526020808301858152336000908152600583528581208882528352949094208351815460ff1916901515178155935180519394936125f5938501929190910190612fc4565b505060405183915033907fee56af66250a5cbba377132a356dc403d520776e30969594927024c44af8440b90600090a35050565b61263233610f4c565b151561263d57600080fd5b60408051808201825260018082526020808301858152336000818152600284528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fdb4ad6a3ed2bdacbae02da45a5bb54192cdb7d72648674d13e08d2fc4c45ac6691a35050565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb525490565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a5490565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb5255565b61274833610f4c565b151561275357600080fd5b3360009081526005602090815260408083208484529091528120805460ff1916815590612783600183018261303e565b5050604051819033907f0eaf95ab41777ff88e28181b1c43418524616bcef6d37c3b216015b5548cb10890600090a350565b6127be33610f4c565b15156127c957600080fd5b336000908152600a602090815260408083208484529091528120805460ff191681559060018201816127fb828261303e565b5060006001919091018190556040518493503392507f9cad6db22e9f7e2a3441e18ef08567fa48da09796f593ded4222f0a315f986019190a350565b600160a060020a038216600090815260056020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b6128cc33610f4c565b15156128d757600080fd5b60408051808201825260018082526020808301858152336000908152600983528581208882528352949094208351815460ff191690151517815593518051939493612929938501929190910190612fc4565b505060405183915033907fdb23beee028623a85d5af1d247423ca471d20e499b131cd5e5c76277eaa2ad5b90600090a35050565b61296633610f4c565b151561297157600080fd5b60408051808201825260018082526020808301858152336000908152600483528581208882528352949094208351815460ff1916901515178155935180519394936129c3938501929190910190612fc4565b505060405183915033907f43e6b7e3323b4598401023341c086c07c3ff5577f594b5aab9c065f2c3c9d59090600090a35050565b600160a060020a03919091166000908152600160208181526040808420948452939052919020805491015460ff90911691565b600160a060020a03918216600090815260208181526040808320938352929052205460ff81169261010090910490911690565b612a6633610f4c565b1515612a7157600080fd5b336000818152600260209081526040808320858452909152808220805460ff19168155600101829055518392917f3c3ff48e02e407eb1e78310d11b5e3f9e735263a9cafc2bcf4aa981b8ecb32a591a350565b600160a060020a0391909116600090815260026020908152604080832093835292905220805460019091015460ff90911691565b600160a060020a03919091166000908152600360209081526040808320938352929052205460ff808216926101009092041690565b612b3633610f4c565b1515612b4157600080fd5b6040805180820182526001815282151560208083019182523360008181526003835285812088825290925284822093518454935115156101000261ff001991151560ff1990951694909417169290921790925591518492917f68cc3496efaac4c1f2c0cd52da916138f6c5fc541992f05d97423a89b6914ae591a35050565b612bc933610f4c565b1515612bd457600080fd5b60408051808201825260018152600160a060020a03838116602080840191825233600081815280835286812089825290925285822094518554935160ff199094169015151774ffffffffffffffffffffffffffffffffffffffff001916610100939094169290920292909217909255915184927f8e7e6ab6c4613205e833e1faf5415d78dd10130a8828f729c08036e2a7a6277091a35050565b600b80546001908101918290551415611166576111666001612f35565b612c9433610f4c565b1515612c9f57600080fd5b604080518082018252600180825260208083018581523360008181528484528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fff76cb7634629f8d05011ab2a58380dfc0743157a70ba4173f866e113eca75c091a35050565b612d1733610f4c565b1515612d2257600080fd5b336000818152600160208181526040808420868552909152808320805460ff19168155909101829055518392917fd5f853f7aaba549b5a46be1de24cac4c20e716b4c603d24b2b0b7b5d97ca1c4d91a350565b600160a060020a038216600090815260046020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b612e0a33610f4c565b1515612e1557600080fd5b6040805180820182526001808252825180840184528581526020808201869052808401918252336000908152600a82528581208982528252949094208351815460ff1916901515178155905180518051949592949193850192612e7d92849290910190612fc4565b50602091909101516001909101555050604051839033907f0ed4013fbc8174781b18a7aa1cce7d589bc1fc3509941835787881ed2ab8b48e90600090a3505050565b612ec833610f4c565b1515612ed357600080fd5b3360009081526004602090815260408083208484529091528120805460ff1916815590612f03600183018261303e565b5050604051819033907f491a0e0281af9fc88ff024cffc24db22eddd4f826cb30d84936592967dc9237c90600090a350565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a55565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820181905260e0820183905261010082015261012081018290526101408101829052906101608201908152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061300557805160ff1916838001178555613032565b82800160010185558215613032579182015b82811115613032578251825591602001919060010190613017565b5061222492915061307e565b50805460018160011615610100020316600290046000825580601f106130645750610f31565b601f016020900490600052602060002090810190610f3191905b6111fd91905b8082111561222457600081556001016130845600696e76616c69642065786368616e676520696e64657800000000000000000000a165627a7a7230582041a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a0029
Deployed Bytecode
0x6080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306427a88811461024a57806308c50498146102645780630a2565251461027c5780630e14a376146102a3578063174a6277146102bb57806320888158146102fa57806322b96b631461032f578063257781e7146103d65780632b42a89a146103ee5780632c62ff2d146104085780632db27bd2146104205780632e28d084146104cb5780633e49bed0146104ef5780634e71e0c81461050a5780635b2a372d1461051f578063616b59f61461054357806361a2d0761461055b57806363019d1d146105705780636556f767146105885780636bfc8bb5146105ac5780636d4e7802146105d05780636e899550146105f15780636f618f9a14610615578063715018a6146107bc57806371658552146107d15780637ac4ed64146107f55780637dd291e41461083c57806386ca9a7c146108515780638ae44a081461085f5780638c160095146108805780638da5cb5b1461089857806395ee8bae146108c95780639d74b37d146108ed578063a2b6cbe11461092c578063ab338e361461027c578063abfdcced14610944578063ac0aeb1a14610961578063ca446dd914610982578063caa95f1b146109a6578063cea332cc146109bb578063e2a4853a146109e2578063e2b202bf146109fd578063e30c397814610a15578063e318de7314610a2a578063e75a836a14610a4e578063f2fde38b14610a75578063f6bb3cc414610a96578063fc2d058414610aae575b600080fd5b34801561025657600080fd5b50610262600435610ac9565b005b34801561027057600080fd5b50610262600435610d01565b34801561028857600080fd5b50610291610f21565b60408051918252519081900360200190f35b3480156102af57600080fd5b50610262600435610f28565b3480156102c757600080fd5b506102df600160a060020a0360043516602435610f34565b60408051921515835260208301919091528051918290030190f35b34801561030657600080fd5b5061031b600160a060020a0360043516610f4c565b604080519115158252519081900360200190f35b34801561033b57600080fd5b50610353600160a060020a0360043516602435610fa2565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561039a578181015183820152602001610382565b50505050905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b3480156103e257600080fd5b50610262600435610fb0565b3480156103fa57600080fd5b506102626004351515610fb9565b34801561041457600080fd5b50610262600435611012565b34801561042c57600080fd5b50610444600160a060020a036004351660243561101b565b604080518415158152908101829052606060208083018281528551928401929092528451608084019186019080838360005b8381101561048e578181015183820152602001610476565b50505050905090810190601f1680156104bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156104d757600080fd5b50610262600480359060248035908101910135611038565b3480156104fb57600080fd5b50610262600435602435611077565b34801561051657600080fd5b50610262611085565b34801561052b57600080fd5b50610262600480359060248035908101910135611168565b34801561054f57600080fd5b506102626004356111ed565b34801561056757600080fd5b5061031b6111f6565b34801561057c57600080fd5b50610262600435611200565b34801561059457600080fd5b50610353600160a060020a0360043516602435611209565b3480156105b857600080fd5b50610262600480359060248035908101910135611217565b3480156105dc57600080fd5b50610262600160a060020a0360043516611251565b3480156105fd57600080fd5b506102626004803590602480359081019101356112b6565b34801561062157600080fd5b5061062d6004356112f0565b604051808e600160a060020a0316600160a060020a031681526020018d81526020018c600160a060020a0316600160a060020a031681526020018b81526020018a600160a060020a0316600160a060020a03168152602001896000191660001916815260200180602001886000191660001916815260200180602001876000191660001916815260200186600019166000191681526020018560028111156106d157fe5b60ff16815260200184815260200183810383528a818151815260200191508051906020019080838360005b838110156107145781810151838201526020016106fc565b50505050905090810190601f1680156107415780820380516001836020036101000a031916815260200191505b5083810382528851815288516020918201918a019080838360005b8381101561077457818101518382015260200161075c565b50505050905090810190601f1680156107a15780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b3480156107c857600080fd5b50610262611490565b3480156107dd57600080fd5b506102df600160a060020a0360043516602435611550565b34801561080157600080fd5b50610819600160a060020a036004351660243561155d565b604080519215158352600160a060020a0390911660208301528051918290030190f35b34801561084857600080fd5b5061029161156a565b610262600435602435611570565b34801561086b57600080fd5b5061031b600160a060020a0360043516611807565b34801561088c57600080fd5b50610262600435611825565b3480156108a457600080fd5b506108ad61182e565b60408051600160a060020a039092168252519081900360200190f35b3480156108d557600080fd5b506102df600160a060020a036004351660243561183d565b3480156108f957600080fd5b50610911600160a060020a036004351660243561184a565b60408051921515835290151560208301528051918290030190f35b34801561093857600080fd5b50610262600435611857565b34801561095057600080fd5b5061026260043560243515156118be565b34801561096d57600080fd5b50610262600160a060020a03600435166118c8565b34801561098e57600080fd5b50610262600435600160a060020a0360243516611930565b3480156109b257600080fd5b5061029161193a565b61026260048035600160a060020a0316906024803591604435918201910135606435611940565b3480156109ee57600080fd5b50610262600435602435611cd2565b348015610a0957600080fd5b50610262600435611cdc565b348015610a2157600080fd5b506108ad611ce5565b348015610a3657600080fd5b50610353600160a060020a0360043516602435611cef565b348015610a5a57600080fd5b50610262600480359060248035908101910135604435611cfd565b348015610a8157600080fd5b50610262600160a060020a0360043516611d3f565b348015610aa257600080fd5b50610262600435611dc1565b348015610aba57600080fd5b50610262600435602435611dca565b600c5460009081908310610b15576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805484908110610b2357fe5b60009182526020909120600d90910201600b81015490925060ff166002811115610b4957fe5b600214610bae576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b81600c0154610bbb612205565b1180610bd057508154600160a060020a031633145b1515610c73576040805160e560020a62461bcd028152602060048201526044602482018190527f65786368616e6765206d75737420626520656974686572206578706972656420908201527f6f722062652066696e697368656420627920746865206461746120726571756560648201527f7374657200000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b8201805460ff1916905560038201546001830154610c9291612228565b6002830154604051919250600160a060020a03169082156108fc029083906000818181858888f193505050501515610cc957600080fd5b610cd1612235565b60405183907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2505050565b600c546000908210610d4b576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805483908110610d5957fe5b60009182526020909120600d90910201600b81015490915060ff166002811115610d7f57fe5b600114610de4576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8054600160a060020a03163314610e45576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b80600c0154610e52612205565b11610ea7576040805160e560020a62461bcd02815260206004820152601860248201527f65786368616e6765206d75737420626520657870697265640000000000000000604482015290519081900360640190fd5b600b8101805460ff1916905580546001820154604051600160a060020a03909216916108fc82150291906000818181858888f193505050501515610eea57600080fd5b610ef2612235565b60405182907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a25050565b6201518081565b610f3181612251565b50565b600080610f4184846122c4565b915091509250929050565b60075460009060ff161580610f795750600160a060020a03821660009081526008602052604090205460ff165b80610f9c5750610f876122f8565b600160a060020a031682600160a060020a0316145b92915050565b60006060610f41848461231d565b610f31816123e7565b610fc16122f8565b600160a060020a03163314610fd557600080fd5b6007805460ff19168215159081179091556040517f6e1eb3fa845047cf9d5fd1deb1b7770b4e26163dd4d88cefb14fe7964a70059590600090a250565b610f318161245d565b60006060600061102b85856124bf565b9250925092509250925092565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061258f945050505050565b505050565b6110818282612629565b5050565b61108d6126ad565b600160a060020a031633146110a157600080fd5b6110a96126d2565b156110fe576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6111066126ad565b600160a060020a03166111176122f8565b600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361115c6111576126ad565b6126f7565b611166600061271b565b565b61117133610f4c565b151561117c57600080fd5b6040805180820182526001808252436020808401918252336000818152600683528681208a82529092528582209451855460ff191690151517855591519390920192909255915185927fcbde9cd310365ff3de3ad9cb44ed688d8880c7b1d15df733a73880fb84d032de91a3505050565b610f318161273f565b60075460ff165b90565b610f31816127b5565b60006060610f418484612837565b6110728383838080601f016020809104026020016040519081016040528093929190818152602001838380828437506128c3945050505050565b6112596122f8565b600160a060020a0316331461126d57600080fd5b600160a060020a038116600081815260086020526040808220805460ff19169055517f5bf47f016603dfff957e6086bd9a350212686e8f1d9208b3db47c5a3107c78789190a250565b6110728383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061295d945050505050565b600c8054829081106112fe57fe5b6000918252602091829020600d90910201805460018083015460028085015460038601546004870154600588015460068901805460408051601f6000199b841615610100029b909b01909216979097049889018c90048c0281018c01909652878652600160a060020a039889169b509599938816989297919091169590949193928301828280156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b50505050600783015460088401805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815295969395939450908301828280156114675780601f1061143c57610100808354040283529160200191611467565b820191906000526020600020905b81548152906001019060200180831161144a57829003601f168201915b5050506009840154600a850154600b860154600c909601549495919490935060ff90911691508d565b6114986122f8565b600160a060020a031633146114ac57600080fd5b6114b46126d2565b15611509576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b6115116122f8565b600160a060020a03167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a261116660006126f7565b600080610f4184846129f7565b600080610f418484612a2a565b600c5490565b600c5460009083106115ba576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c8054849081106115c857fe5b60009182526020909120600d909102016002810154909150600160a060020a0316331461163f576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070617373706f7274206f776e657220616c6c6f7765640000000000604482015290519081900360640190fd5b600b81015460ff16600281111561165257fe5b6001146116b7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e2070726f706f73656420737461604482015260f060020a61746502606482015290519081900360840190fd5b6001810154341015611739576040805160e560020a62461bcd02815260206004820152602c60248201527f6e65656420746f207374616b65206174206c656173742064617461207265717560448201527f657374657220616d6f756e740000000000000000000000000000000000000000606482015290519081900360840190fd5b80600c0154611746612205565b1061179b576040805160e560020a62461bcd02815260206004820152601660248201527f65786368616e6765207374617465206578706972656400000000000000000000604482015290519081900360640190fd5b346003820155600a8101829055600b8101805460ff19166002179055620151806117c3612205565b01600c82015580546040513391600160a060020a03169085907f843dda373d0d243dce80a6cd203b9cbba8576d036c7eb937f9de36ebe6e8b02390600090a4505050565b600160a060020a031660009081526008602052604090205460ff1690565b610f3181612a5d565b60006118386122f8565b905090565b600080610f418484612ac4565b600080610f418484612af8565b61186033610f4c565b151561186b57600080fd5b336000818152600660209081526040808320858452909152808220805460ff19168155600101829055518392917f9b9532c8ba5879554dee7c3e9374bd26dbfb2f79cf7f247bcf90648fc81fc16491a350565b6110818282612b2d565b6118d06122f8565b600160a060020a031633146118e457600080fd5b600160a060020a038116600081815260086020526040808220805460ff19166001179055517fff8ac5f0e9cdc8f7ffbbc29ab1301ee649cf01cf7a6a9265a2d90587612c41759190a250565b6110818282612bc0565b600b5481565b600060606000806000611951612f59565b600061195d8c8c6124bf565b9650965096508615156119ba576040805160e560020a62461bcd02815260206004820152601760248201527f707269766174652064617461206d757374206578697374000000000000000000604482015290519081900360640190fd5b6119c26122f8565b93506101a06040519081016040528033600160a060020a0316815260200134815260200185600160a060020a03168152602001600081526020018d600160a060020a031681526020018c600019168152602001878152602001866000191681526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437505050928452505050602081018a9052604081018590526060016001815260200162015180611a7c612205565b019052600c8054600181018083556000929092528251600d9091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c781018054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff199182161782556020808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c885015560408701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c98501805491871691841691909117905560608701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8ca85015560808701517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cb850180549190961692169190911790935560a08501517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cc83015560c08501518051959750939487949193611c0a937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8cd01920190612fc4565b5060e082015160078201556101008201518051611c31916008840191602090910190612fc4565b506101208201516009820155610140820151600a820155610160820151600b8201805460ff19166001836002811115611c6657fe5b021790555061018082015181600c0155505050611c81612c6e565b50600c5460405160001990910190600160a060020a03851690339083907fabe53237e9ea366da7fa5507ac62db22bd446d6b66bcff4a6d6c1b11e9af198390600090a4505050505050505050505050565b6110818282612c8b565b610f3181612d0e565b60006118386126ad565b60006060610f418484612d75565b611d398484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750889450612e019350505050565b50505050565b611d476122f8565b600160a060020a03163314611d5b57600080fd5b611d636126d2565b15611db8576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6e74726163742073686f756c64206e6f7420626520706175736564000000604482015290519081900360640190fd5b610f318161271b565b610f3181612ebf565b6000806000806000600c8054905087101515611e1e576040805160e560020a62461bcd0281526020600482015260166024820152600080516020613099833981519152604482015290519081900360640190fd5b600c805488908110611e2c57fe5b60009182526020909120600d90910201600b81015490955060ff166002811115611e5257fe5b600214611eb7576040805160e560020a62461bcd02815260206004820152602260248201527f65786368616e6765206d75737420626520696e20616363657074656420737461604482015260f060020a61746502606482015290519081900360840190fd5b8454600160a060020a03163314611f18576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920646174612072657175657374657220616c6c6f7765640000000000604482015290519081900360640190fd5b84600c0154611f25612205565b10611f7a576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206d757374206e6f74206265206578706972656400000000604482015290519081900360640190fd5b60098501546040805160208082018a905282518083038201815291830192839052815191929182918401908083835b60208310611fc85780518252601f199092019160209182019101611fa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515612050576040805160e560020a62461bcd02815260206004820152601c60248201527f65786368616e6765206b65792068617368206d757374206d6174636800000000604482015290519081900360640190fd5b600a85015460078601546040805192891860208085018290528251808603820181529483019283905284519198509293928291908401908083835b602083106120aa5780518252601f19909201916020918201910161208b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600b8a01805460ff1916905560038a015460018b01549590911497506120fe94935091506122289050565b9150821561214d576002850154604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561213c57600080fd5b508354600160a060020a0316612190565b8454604051600160a060020a039091169083156108fc029084906000818181858888f19350505050151561218057600080fd5b506002840154600160a060020a03165b612198612235565b60405187907f5d1a7ae2ffda31cae15ed5129d32260ef2a270a21325f536f7954ed297e52c8e90600090a2604051600160a060020a0382169084159089907f540941e0fc2370abde0bfa6ddbb49188469597e518416fa24327f39469c9b2ec90600090a450505050505050565b600042670214e8348c4f000081111561222057633b9aca0090045b8091505b5090565b81810182811015610f9c57fe5b600b805460001901908190551515611166576111666000612f35565b61225a33610f4c565b151561226557600080fd5b33600081815260208181526040808320858452909152808220805474ffffffffffffffffffffffffffffffffffffffffff19169055518392917fed9474c4702ee9da4d0d2085840fafed5912b8e13daf1d6ea341ebe98803aec291a350565b600160a060020a0391909116600090815260066020908152604080832093835292905220805460019091015460ff90911691565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d225490565b600160a060020a038216600090815260096020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b820191906000526020600020905b8154815290600101906020018083116123b757829003601f168201915b5050505050905092509250509250929050565b6123f033610f4c565b15156123fb57600080fd5b3360009081526009602090815260408083208484529091528120805460ff191681559061242b600183018261303e565b5050604051819033907f140278d2322b9671bf293aea878e7717c46d5b7cd955e3e426ee67e01b90165490600090a350565b61246633610f4c565b151561247157600080fd5b336000818152600360209081526040808320858452909152808220805461ffff19169055518392917f191bd7fc1f22ce6b74b7d7e42126f0ed225b109728607c99971de9e78b0db6eb91a350565b600160a060020a0382166000908152600a6020908152604080832084845282528083208054600280830154600180850180548751601f93821615610100026000190190911694909404918201889004880284018801909652808352606096889660ff909516949391849183018282801561257a5780601f1061254f5761010080835404028352916020019161257a565b820191906000526020600020905b81548152906001019060200180831161255d57829003601f168201915b50505050509150935093509350509250925092565b61259833610f4c565b15156125a357600080fd5b60408051808201825260018082526020808301858152336000908152600583528581208882528352949094208351815460ff1916901515178155935180519394936125f5938501929190910190612fc4565b505060405183915033907fee56af66250a5cbba377132a356dc403d520776e30969594927024c44af8440b90600090a35050565b61263233610f4c565b151561263d57600080fd5b60408051808201825260018082526020808301858152336000818152600284528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fdb4ad6a3ed2bdacbae02da45a5bb54192cdb7d72648674d13e08d2fc4c45ac6691a35050565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb525490565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a5490565b7f3ca57e4b51fc2e18497b219410298879868edada7e6fe5132c8feceb0a080d2255565b7fcfd0c6ea5352192d7d4c5d4e7a73c5da12c871730cb60ff57879cbe7b403bb5255565b61274833610f4c565b151561275357600080fd5b3360009081526005602090815260408083208484529091528120805460ff1916815590612783600183018261303e565b5050604051819033907f0eaf95ab41777ff88e28181b1c43418524616bcef6d37c3b216015b5548cb10890600090a350565b6127be33610f4c565b15156127c957600080fd5b336000908152600a602090815260408083208484529091528120805460ff191681559060018201816127fb828261303e565b5060006001919091018190556040518493503392507f9cad6db22e9f7e2a3441e18ef08567fa48da09796f593ded4222f0a315f986019190a350565b600160a060020a038216600090815260056020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b6128cc33610f4c565b15156128d757600080fd5b60408051808201825260018082526020808301858152336000908152600983528581208882528352949094208351815460ff191690151517815593518051939493612929938501929190910190612fc4565b505060405183915033907fdb23beee028623a85d5af1d247423ca471d20e499b131cd5e5c76277eaa2ad5b90600090a35050565b61296633610f4c565b151561297157600080fd5b60408051808201825260018082526020808301858152336000908152600483528581208882528352949094208351815460ff1916901515178155935180519394936129c3938501929190910190612fc4565b505060405183915033907f43e6b7e3323b4598401023341c086c07c3ff5577f594b5aab9c065f2c3c9d59090600090a35050565b600160a060020a03919091166000908152600160208181526040808420948452939052919020805491015460ff90911691565b600160a060020a03918216600090815260208181526040808320938352929052205460ff81169261010090910490911690565b612a6633610f4c565b1515612a7157600080fd5b336000818152600260209081526040808320858452909152808220805460ff19168155600101829055518392917f3c3ff48e02e407eb1e78310d11b5e3f9e735263a9cafc2bcf4aa981b8ecb32a591a350565b600160a060020a0391909116600090815260026020908152604080832093835292905220805460019091015460ff90911691565b600160a060020a03919091166000908152600360209081526040808320938352929052205460ff808216926101009092041690565b612b3633610f4c565b1515612b4157600080fd5b6040805180820182526001815282151560208083019182523360008181526003835285812088825290925284822093518454935115156101000261ff001991151560ff1990951694909417169290921790925591518492917f68cc3496efaac4c1f2c0cd52da916138f6c5fc541992f05d97423a89b6914ae591a35050565b612bc933610f4c565b1515612bd457600080fd5b60408051808201825260018152600160a060020a03838116602080840191825233600081815280835286812089825290925285822094518554935160ff199094169015151774ffffffffffffffffffffffffffffffffffffffff001916610100939094169290920292909217909255915184927f8e7e6ab6c4613205e833e1faf5415d78dd10130a8828f729c08036e2a7a6277091a35050565b600b80546001908101918290551415611166576111666001612f35565b612c9433610f4c565b1515612c9f57600080fd5b604080518082018252600180825260208083018581523360008181528484528681208982529093528583209451855460ff19169015151785559051939092019290925591518492917fff76cb7634629f8d05011ab2a58380dfc0743157a70ba4173f866e113eca75c091a35050565b612d1733610f4c565b1515612d2257600080fd5b336000818152600160208181526040808420868552909152808320805460ff19168155909101829055518392917fd5f853f7aaba549b5a46be1de24cac4c20e716b4c603d24b2b0b7b5d97ca1c4d91a350565b600160a060020a038216600090815260046020908152604080832084845282528083208054600180830180548551601f600294831615610100026000190190921693909304908101879004870283018701909552848252606095939460ff90931693909283918301828280156123d45780601f106123a9576101008083540402835291602001916123d4565b612e0a33610f4c565b1515612e1557600080fd5b6040805180820182526001808252825180840184528581526020808201869052808401918252336000908152600a82528581208982528252949094208351815460ff1916901515178155905180518051949592949193850192612e7d92849290910190612fc4565b50602091909101516001909101555050604051839033907f0ed4013fbc8174781b18a7aa1cce7d589bc1fc3509941835787881ed2ab8b48e90600090a3505050565b612ec833610f4c565b1515612ed357600080fd5b3360009081526004602090815260408083208484529091528120805460ff1916815590612f03600183018261303e565b5050604051819033907f491a0e0281af9fc88ff024cffc24db22eddd4f826cb30d84936592967dc9237c90600090a350565b7f9e7945c55c116aa3404b99fe56db7af9613d3b899554a437c2616a4749a94d8a55565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820181905260e0820183905261010082015261012081018290526101408101829052906101608201908152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061300557805160ff1916838001178555613032565b82800160010185558215613032579182015b82811115613032578251825591602001919060010190613017565b5061222492915061307e565b50805460018160011615610100020316600290046000825580601f106130645750610f31565b601f016020900490600052602060002090810190610f3191905b6111fd91905b8082111561222457600081556001016130845600696e76616c69642065786368616e676520696e64657800000000000000000000a165627a7a7230582041a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a0029
Deployed Bytecode Sourcemap
41921:257:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36313:894;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36313:894:0;;;;;;;37276:823;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37276:823:0;;;;;32263:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32263:65:0;;;;;;;;;;;;;;;;;;;;17547:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17547:85:0;;;;;27791:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27791:190:0;-1:-1:-1;;;;;27791:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15501:201;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15501:201:0;-1:-1:-1;;;;;15501:201:0;;;;;;;;;;;;;;;;;;;;;;;28993:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28993:168:0;-1:-1:-1;;;;;28993:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28993:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28806:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28806:87:0;;;;;16025:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16025:206:0;;;;;;;22218:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22218:79:0;;;;;32969:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32969:214:0;-1:-1:-1;;;;;32969:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32969:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25220:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25220:97:0;;;;;;;;;;;;;;;;20544:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20544:91:0;;;;;;;6087:220;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6087:220:0;;;;27148:310;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27148:310:0;;;;;;;;;;;;;;;;25369:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25369:81:0;;;;;15797:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15797:131:0;;;;32764:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32764:105:0;;;;;25550:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25550:161:0;-1:-1:-1;;;;;25550:161:0;;;;;;;28650:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28650:104:0;;;;;;;;;;;;;;;;16815:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16815:189:0;-1:-1:-1;;;;;16815:189:0;;;;;23628:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23628:100:0;;;;;;;;;;;;;;;;14668:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14668:49:0;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;-1:-1:-1;;;;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3079:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3079:147:0;;;;19325:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19325:158:0;-1:-1:-1;;;;;19325:158:0;;;;;;;17732:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17732:167:0;-1:-1:-1;;;;;17732:167:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17732:167:0;;;;;;;;;;;;;;;;33276:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33276:133:0;;;;35229:1015;;;;;;;;16323:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16323:139:0;-1:-1:-1;;;;;16323:139:0;;;;;20687:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20687:77:0;;;;;3939:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3939:84:0;;;;;;;;-1:-1:-1;;;;;3939:84:0;;;;;;;;;;;;;;20864:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20864:155:0;-1:-1:-1;;;;;20864:155:0;;;;;;;22397:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22397:158:0;-1:-1:-1;;;;;22397:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27510:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27510:181:0;;;;;22072:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22072:94:0;;;;;;;;;16545:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16545:182:0;-1:-1:-1;;;;;16545:182:0;;;;;17392:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17392:103:0;;;-1:-1:-1;;;;;17392:103:0;;;;;14514:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14514:41:0;;;;33685:1390;;;;;-1:-1:-1;;;;;33685:1390:0;;;;;;;;;;;;;;;;;;19000:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19000:94:0;;;;;;;19146:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19146:79:0;;;;;5403:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5403:98:0;;;;23963:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23963:164:0;-1:-1:-1;;;;;23963:164:0;;;;;;;32540:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32540:172:0;;;;;;;;;;;;;;;;;;5869:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5869:121:0;-1:-1:-1;;;;;5869:121:0;;;;;23780:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23780:83:0;;;;;38234:1624;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38234:1624:0;;;;;;;36313:894;36413:20;:27;36478:36;;;;36398:42;;36390:77;;;;;-1:-1:-1;;;;;36390:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36390:77:0;;;;;;;;;;;;;;;36517:20;:34;;36538:12;;36517:34;;;;;;;;;;;;;;;;;;;36607:14;;;;36517:34;;-1:-1:-1;36607:14:0;;36570:51;;;;;;;;:33;:51;36562:98;;;;;-1:-1:-1;;;;;36562:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36562:98:0;;;;;;;;;;;;;;;36695:8;:21;;;36679:13;:11;:13::i;:::-;:37;:77;;;-1:-1:-1;36734:22:0;;-1:-1:-1;;;;;36734:22:0;36720:10;:36;36679:77;36671:158;;;;;;;-1:-1:-1;;;;;36671:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36842:14;;;:48;;-1:-1:-1;;36842:48:0;;;37014:27;;;;36842:48;36982:27;;;:60;;:31;:60::i;:::-;37061:22;;;;:32;;36968:74;;-1:-1:-1;;;;;;37061:22:0;;:32;;;;;36968:74;;37061:22;:32;:22;:32;36968:74;37061:22;:32;;;;;;;37053:41;;;;;;;;37107:35;:33;:35::i;:::-;37160:39;;37186:12;;37160:39;;;;;36313:894;;;:::o;37276:823::-;37377:20;:27;37442:36;;37362:42;;37354:77;;;;;-1:-1:-1;;;;;37354:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37354:77:0;;;;;;;;;;;;;;;37481:20;:34;;37502:12;;37481:34;;;;;;;;;;;;;;;;;;;37571:14;;;;37481:34;;-1:-1:-1;37571:14:0;;37534:51;;;;;;;;:33;:51;37526:98;;;;;-1:-1:-1;;;;;37526:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37526:98:0;;;;;;;;;;;;;;;37657:22;;-1:-1:-1;;;;;37657:22:0;37643:10;:36;37635:76;;;;;-1:-1:-1;;;;;37635:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37746:8;:21;;;37730:13;:11;:13::i;:::-;:37;37722:74;;;;;-1:-1:-1;;;;;37722:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37809:14;;;:48;;-1:-1:-1;;37809:48:0;;;37929:22;;37809:48;37957:27;;;37929:56;;-1:-1:-1;;;;;37929:22:0;;;;:56;;;;;37957:27;37826:31;37929:56;37826:31;37929:56;37957:27;37929:22;:56;;;;;;;37921:65;;;;;;;;37999:35;:33;:35::i;:::-;38052:39;;38078:12;;38052:39;;;;;37276:823;;:::o;32263:65::-;32322:6;32263:65;:::o;17547:85::-;17604:20;17619:4;17604:14;:20::i;:::-;17547:85;:::o;27791:190::-;27881:12;27895:16;27931:42;27953:13;27968:4;27931:21;:42::i;:::-;27924:49;;;;27791:190;;;;;:::o;15501:201::-;15596:36;;15571:4;;15596:36;;15595:37;;:72;;-1:-1:-1;;;;;;15636:31:0;;;;;;:21;:31;;;;;;;;15595:72;:99;;;;15683:11;:9;:11::i;:::-;-1:-1:-1;;;;;15671:23:0;:8;-1:-1:-1;;;;;15671:23:0;;15595:99;15588:106;15501:201;-1:-1:-1;;15501:201:0:o;28993:168::-;29074:12;29088;29120:33;29133:13;29148:4;29120:12;:33::i;28806:87::-;28864:21;28880:4;28864:15;:21::i;16025:206::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;16112:36;:53;;-1:-1:-1;;16112:53:0;;;;;;;;;;16181:42;;;;-1:-1:-1;;16181:42:0;16025:206;:::o;22218:79::-;22272:17;22284:4;22272:11;:17::i;32969:214::-;33059:12;33073:19;33094;33133:42;33155:13;33170:4;33133:21;:42::i;:::-;33126:49;;;;;;32969:214;;;;;:::o;25220:97::-;25286:23;25296:4;25302:6;;25286:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25286:9:0;;-1:-1:-1;;;;;25286:23:0:i;:::-;25220:97;;;:::o;20544:91::-;20606:21;20614:4;20620:6;20606:7;:21::i;:::-;20544:91;;:::o;6087:220::-;5671:18;:16;:18::i;:::-;-1:-1:-1;;;;;5657:32:0;:10;:32;5649:41;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6201:18;:16;:18::i;:::-;-1:-1:-1;;;;;6167:53:0;6188:11;:9;:11::i;:::-;-1:-1:-1;;;;;6167:53:0;;;;;;;;;;;6231:29;6241:18;:16;:18::i;:::-;6231:9;:29::i;:::-;6271:28;6296:1;6271:16;:28::i;:::-;6087:220::o;27148:310::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;27296:107;;;;;;;;27342:4;27296:107;;;27375:12;27296:107;;;;;;;27276:10;-1:-1:-1;27261:26:0;;;:14;:26;;;;;:32;;;;;;;;;:142;;;;-1:-1:-1;;27261:142:0;;;;;;;;;;;;;;;;;27419:31;;27261:32;;27419:31;;;27148:310;;;:::o;25369:81::-;25424:18;25437:4;25424:12;:18::i;15797:131::-;15884:36;;;;15797:131;;:::o;32764:105::-;32831:30;32856:4;32831:24;:30::i;25550:161::-;25628:12;25642:11;25673:30;25683:13;25698:4;25673:9;:30::i;28650:104::-;28720:26;28733:4;28739:6;;28720:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28720:12:0;;-1:-1:-1;;;;;28720:26:0:i;16815:189::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;-1:-1:-1;;;;;16911:31:0;;;;;;:21;:31;;;;;;16904:38;;-1:-1:-1;;16904:38:0;;;16958;;;16911:31;16958:38;16815:189;:::o;23628:100::-;23696:24;23707:4;23713:6;;23696:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23696:10:0;;-1:-1:-1;;;;;23696:24:0:i;14668:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:49:0;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;14668:49:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14668:49:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14668:49:0;;;;;-1:-1:-1;14668:49:0;:::o;3079:147::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:11;:9;:11::i;:::-;-1:-1:-1;;;;;3155:31:0;;;;;;;;;;;3197:21;3215:1;3197:9;:21::i;19325:158::-;19402:12;19416:10;19446:29;19455:13;19470:4;19446:8;:29::i;17732:167::-;17812:12;17826:13;17859:32;17871:13;17886:4;17859:11;:32::i;33276:133::-;33374:20;:27;33276:133;:::o;35229:1015::-;35364:20;:27;35429:36;;35349:42;;35341:77;;;;;-1:-1:-1;;;;;35341:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35341:77:0;;;;;;;;;;;;;;;35468:20;:34;;35489:12;;35468:34;;;;;;;;;;;;;;;;;;;35535:22;;;;35468:34;;-1:-1:-1;;;;;;35535:22:0;35521:10;:36;35513:76;;;;;-1:-1:-1;;;;;35513:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35645:14;;;;;;35608:51;;;;;;;;:33;:51;35600:98;;;;;-1:-1:-1;;;;;35600:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35600:98:0;;;;;;;;;;;;;;;35730:27;;;;35717:9;:40;;35709:97;;;;;-1:-1:-1;;;;;35709:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35841:8;:21;;;35825:13;:11;:13::i;:::-;:37;35817:72;;;;;-1:-1:-1;;;;;35817:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35932:9;35902:27;;;:39;35952:25;;;:45;;;36008:14;;;:50;;-1:-1:-1;;36008:50:0;36025:33;36008:50;;;32322:6;36093:13;:11;:13::i;:::-;:48;36069:21;;;:72;36201:22;;36159:77;;36225:10;;-1:-1:-1;;;;;36201:22:0;;36187:12;;36159:77;;36201:22;;36159:77;35229:1015;;;:::o;16323:139::-;-1:-1:-1;;;;;16423:31:0;16399:4;16423:31;;;:21;:31;;;;;;;;;16323:139::o;20687:77::-;20740:16;20751:4;20740:10;:16::i;3939:84::-;3977:7;4004:11;:9;:11::i;:::-;3997:18;;3939:84;:::o;20864:155::-;20940:12;20954:9;20983:28;20991:13;21006:4;20983:7;:28::i;22397:158::-;22474:12;22488:10;22518:29;22527:13;22542:4;22518:8;:29::i;27510:181::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;27619:10;27604:26;;;;:14;:26;;;;;;;;:32;;;;;;;;;27597:39;;-1:-1:-1;;27597:39:0;;;;;;;;27652:31;27631:4;;27619:10;27652:31;;;27510:181;:::o;22072:94::-;22136:22;22145:4;22151:6;22136:8;:22::i;16545:182::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;-1:-1:-1;;;;;16629:31:0;;;;;;:21;:31;;;;;;:38;;-1:-1:-1;;16629:38:0;16663:4;16629:38;;;16683:36;;;16629:31;16683:36;16545:182;:::o;17392:103::-;17462:25;17474:4;17480:6;17462:11;:25::i;14514:41::-;;;;:::o;33685:1390::-;33885:12;33899:26;33927:19;34059:21;34105:24;34140:35;;:::i;:::-;34931:19;33950:42;33972:13;33987:4;33950:21;:42::i;:::-;33884:108;;;;;;34011:7;34003:43;;;;;;;-1:-1:-1;;;;;34003:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34083:11;:9;:11::i;:::-;34059:35;;34178:646;;;;;;;;;34229:10;-1:-1:-1;;;;;34178:646:0;;;;;34275:9;34178:646;;;;34315:13;-1:-1:-1;;;;;34178:646:0;;;;;34364:1;34178:646;;;;34395:13;-1:-1:-1;;;;;34178:646:0;;;;;34429:4;34178:646;;;;;;;34463:12;34178:646;;;;34504:11;34178:646;;;;;;;34553:21;;34178:646;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34178:646:0;;;-1:-1:-1;;;34178:646:0;;;;;;;;;;;;;;34696:33;34178:646;;;;32250:6;34759:13;:11;:13::i;:::-;:49;34178:646;;34835:20;27:10:-1;;39:1;23:18;;45:23;;;-1:-1;34835:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34835:35:0;;;-1:-1:-1;;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34140:684;;-1:-1:-1;23:18;;34140:684:0;;34835:35;;;;;;;;;;:::i;:::-;-1:-1:-1;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34835:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34883;:33;:35::i;:::-;-1:-1:-1;34953:20:0;:27;35000:67;;-1:-1:-1;;34953:31:0;;;;-1:-1:-1;;;;;35000:67:0;;;35041:10;;34953:31;;35000:67;;;;;33685:1390;;;;;;;;;;;;:::o;19000:94::-;19064:22;19073:4;19079:6;19064:8;:22::i;19146:79::-;19200:17;19212:4;19200:11;:17::i;5403:98::-;5448:7;5475:18;:16;:18::i;23963:164::-;24042:12;24056;24088:31;24099:13;24114:4;24088:10;:31::i;32540:172::-;32648:56;32670:4;32676:13;;32648:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32691:12:0;;-1:-1:-1;32648:21:0;;-1:-1:-1;;;;32648:56:0:i;:::-;32540:172;;;;:::o;5869:121::-;2761:11;:9;:11::i;:::-;-1:-1:-1;;;;;2747:25:0;:10;:25;2739:34;;;;;;911:12;:10;:12::i;:::-;910:13;902:55;;;;;-1:-1:-1;;;;;902:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5956:26;5973:8;5956:16;:26::i;23780:83::-;23836:19;23850:4;23836:13;:19::i;38234:1624::-;38422:36;38914:15;39041:17;39195:11;39282:15;38357:20;:27;;;;38342:12;:42;38334:77;;;;;;;-1:-1:-1;;;;;38334:77:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38334:77:0;;;;;;;;;;;;;;;38461:20;:34;;38482:12;;38461:34;;;;;;;;;;;;;;;;;;;38551:14;;;;38461:34;;-1:-1:-1;38551:14:0;;38514:51;;;;;;;;:33;:51;38506:98;;;;;-1:-1:-1;;;;;38506:98:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38506:98:0;;;;;;;;;;;;;;;38637:22;;-1:-1:-1;;;;;38637:22:0;38623:10;:36;38615:76;;;;;-1:-1:-1;;;;;38615:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38726:8;:21;;;38710:13;:11;:13::i;:::-;:37;38702:78;;;;;-1:-1:-1;;;;;38702:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38844:24;;;;38809:30;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;38809:30:0;;;;;;;38799:41;;38809:30;;;;;38799:41;;;;38809:30;38799:41;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;38799:41:0;;;;;;;;;;;;;;;;:69;;;;38791:110;;;;;;;-1:-1:-1;;;;;38791:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38947:25;;;;39101:20;;;;39071:25;;;38932:40;;;39071:25;;;;;;;;;26:21:-1;;;22:32;;6:49;;39071:25:0;;;;;;;39061:36;;38932:40;;-1:-1:-1;39101:20:0;;39071:25;;;39061:36;;;;;39071:25;39061:36;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;39061:36:0;;;;;;;;;;39134:14;;;:48;;-1:-1:-1;;39134:48:0;;;39241:27;;;;-1:-1:-1;39209:27:0;;;39061:60;;;;;-1:-1:-1;39209:60:0;;:27;-1:-1:-1;39241:27:0;-1:-1:-1;39209:31:0;;-1:-1:-1;39209:60:0:i;:::-;39195:74;;39312:12;39308:357;;;39400:22;;;;:32;;-1:-1:-1;;;;;39400:22:0;;;;:32;;;;;39428:3;;39400:22;:32;:22;:32;39428:3;39400:22;:32;;;;;;;39392:41;;;;;;;;-1:-1:-1;39458:22:0;;-1:-1:-1;;;;;39458:22:0;39308:357;;;39573:22;;:32;;-1:-1:-1;;;;;39573:22:0;;;;:32;;;;;39601:3;;39573:22;:32;:22;:32;39601:3;39573:22;:32;;;;;;;39565:41;;;;;;;;-1:-1:-1;39631:22:0;;;;-1:-1:-1;;;;;39631:22:0;39308:357;39677:35;:33;:35::i;:::-;39730:39;;39756:12;;39730:39;;;;;39785:65;;-1:-1:-1;;;;;39785:65:0;;;39827:13;;;39813:12;;39785:65;;;;;38234:1624;;;;;;;:::o;41433:391::-;41477:7;41509:3;41734:18;41730:22;;41726:70;;;41774:10;41769:15;;41726:70;41815:1;41808:8;;41433:391;;;:::o;31247:132::-;31329:7;;;31350;;;;31343:15;;;40147:268;40218:29;40216:31;;-1:-1:-1;;40216:31:0;;;;;:36;40212:196;;;40379:17;40390:5;40379:10;:17::i;18188:173::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;18288:10;18273:14;:26;;;;;;;;;;;:32;;;;;;;;;18266:39;;-1:-1:-1;;18266:39:0;;;18321:32;18300:4;;18288:10;18321:32;;;18188:173;:::o;27989:277::-;-1:-1:-1;;;;;28159:29:0;;;;28079:12;28159:29;;;:14;:29;;;;;;;;:35;;;;;;;28213:21;;;28236;;;;28213;;;;;27989:277::o;4084:164::-;2274:66;4219:11;;4197:44::o;29637:257::-;-1:-1:-1;;;;;29792:30:0;;29719:12;29792:30;;;:15;:30;;;;;;;;:36;;;;;;;;29847:21;;;29870:15;;;29839:47;;;;;;;;;;29847:21;29839:47;-1:-1:-1;;29839:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;29733:12;;29792:36;;29847:21;;;;;29870:15;;;;29839:47;;29870:15;29839:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29637:257;;;;;;:::o;29453:176::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;29555:10;29539:27;;;;:15;:27;;;;;;;;:33;;;;;;;;29532:40;;-1:-1:-1;;29532:40:0;;;29539:33;29532:40;;;;29539:27;29532:40;:::i;:::-;-1:-1:-1;;29588:33:0;;29616:4;;29604:10;;29588:33;;;;;29453:176;:::o;22829:164::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;22923:10;22911:23;;;;:11;:23;;;;;;;;:29;;;;;;;;;22904:36;;-1:-1:-1;;22904:36:0;;;22956:29;22935:4;;22923:10;22956:29;;;22829:164;:::o;41083:342::-;-1:-1:-1;;;;;41278:33:0;;41174:12;41278:33;;;:18;:33;;;;;;;;:39;;;;;;;;41336:21;;41389:27;;;;;41336:21;41359:15;;;41328:89;;;;;;;;;41336:21;41328:89;-1:-1:-1;;41328:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;41188:19;;41174:12;;41336:21;;;;;41359:15;41328:89;41359:15;;41328:89;;41359:15;41328:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41083:342;;;;;;:::o;25719:263::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;25839:89;;;;;;;;25879:4;25839:89;;;;;;;;;;25819:10;-1:-1:-1;25806:24:0;;;:12;:24;;;;;:30;;;;;;;;;:122;;;;-1:-1:-1;;25806:122:0;;;;;;;;;;;25839:89;;25806:30;:122;;;;;;;;;;;:::i;:::-;-1:-1:-1;;25944:30:0;;25969:4;;-1:-1:-1;25957:10:0;;25944:30;;;;;25719:263;;:::o;21027:253::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;21141:87;;;;;;;;21179:4;21141:87;;;;;;;;;;21121:10;-1:-1:-1;21110:22:0;;;:10;:22;;;;;:28;;;;;;;;;:118;;;;-1:-1:-1;;21110:118:0;;;;;;;;;;;;;;;;;21244:28;;21110;;21121:10;21244:28;;;21027:253;;:::o;6376:185::-;5106:66;6532:11;;6507:47::o;1266:175::-;470:66;1412:11;;1387:47::o;4381:161::-;2274:66;4501:23;4486:49::o;6705:190::-;5106:66;6847:30;6832:56::o;25990:167::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;26086:10;26073:24;;;;:12;:24;;;;;;;;:30;;;;;;;;26066:37;;-1:-1:-1;;26066:37:0;;;26073:30;26066:37;;;;26073:24;26066:37;:::i;:::-;-1:-1:-1;;26119:30:0;;26144:4;;26132:10;;26119:30;;;;;25990:167;:::o;40878:197::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;40992:10;40973:30;;;;:18;:30;;;;;;;;:36;;;;;;;;40966:43;;-1:-1:-1;;40966:43:0;;;40973:36;40966:43;;;40973:30;40966:43;;40973:30;40966:43;:::i;:::-;-1:-1:-1;40966:43:0;;;;;;;;;41025:42;;41062:4;;-1:-1:-1;41050:10:0;;-1:-1:-1;41025:42:0;;40966:43;41025:42;40878:197;:::o;26165:247::-;-1:-1:-1;;;;;26313:27:0;;26244:12;26313:27;;;:12;:27;;;;;;;;:33;;;;;;;;26365:21;;;26388:15;;;26357:47;;;;;;;;;;26365:21;26357:47;-1:-1:-1;;26357:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;26258:11;;26313:33;;26365:21;;;;;26388:15;;;;26357:47;;26388:15;26357:47;;;;;;;;;;;;;;;;;;;;;;;;29169:276;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;29296:92;;;;;;;;29339:4;29296:92;;;;;;;;;;29276:10;-1:-1:-1;29260:27:0;;;:15;:27;;;;;:33;;;;;;;;;:128;;;;-1:-1:-1;;29260:128:0;;;;;;;;;;;29296:92;;29260:33;:128;;;;;;;;;;;:::i;:::-;-1:-1:-1;;29404:33:0;;29432:4;;-1:-1:-1;29420:10:0;;29404:33;;;;;29169:276;;:::o;24135:268::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;24258:90;;;;;;;;24299:4;24258:90;;;;;;;;;;24238:10;-1:-1:-1;24224:25:0;;;:13;:25;;;;;:31;;;;;;;;;:124;;;;-1:-1:-1;;24224:124:0;;;;;;;;;;;24258:90;;24224:31;:124;;;;;;;;;;;:::i;:::-;-1:-1:-1;;24364:31:0;;24390:4;;-1:-1:-1;24378:10:0;;24364:31;;;;;24135:268;;:::o;19929:243::-;-1:-1:-1;;;;;20074:26:0;;;;20007:12;20074:26;;;:11;:26;;;;;;;;:32;;;;;;;;;20125:21;;20148:15;;;20125:21;;;;;19929:243::o;18369:255::-;-1:-1:-1;;;;;18523:29:0;;;18450:12;18523:29;;;;;;;;;;;:35;;;;;;;18577:21;;;;;;18600:15;;;;;;;18369:255::o;21288:161::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;21380:10;21369:22;;;;:10;:22;;;;;;;;:28;;;;;;;;;21362:35;;-1:-1:-1;;21362:35:0;;;;;;;;21413:28;21392:4;;21380:10;21413:28;;;21288:161;:::o;21457:239::-;-1:-1:-1;;;;;21599:25:0;;;;21534:12;21599:25;;;:10;:25;;;;;;;;:31;;;;;;;21649:21;;;21672:15;;;;21649:21;;;;;21457:239::o;23001:243::-;-1:-1:-1;;;;;23146:26:0;;;;23079:12;23146:26;;;:11;:26;;;;;;;;:32;;;;;;;23197:21;;;;;;;23220:15;;;;;23001:243::o;22563:258::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;22680:88;;;;;;;;22719:4;22680:88;;;;;;;;;;;;22660:10;-1:-1:-1;22648:23:0;;;:11;:23;;;;;:29;;;;;;;;;:120;;;;;;;;;;-1:-1:-1;;22648:120:0;;;-1:-1:-1;;22648:120:0;;;;;;;;;;;;;;;22784:29;;22672:4;;22660:10;22784:29;;;22563:258;;:::o;17907:273::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;18033:91;;;;;;;;18075:4;18033:91;;-1:-1:-1;;;;;18033:91:0;;;;;;;;;;18013:10;-1:-1:-1;17998:26:0;;;;;;;;;:32;;;;;;;;;:126;;;;;;-1:-1:-1;;17998:126:0;;;;;;;-1:-1:-1;;17998:126:0;;;;;;;;;;;;;;;;;18140:32;;17998;;18140;;;17907:273;;:::o;39866:::-;39937:29;39935:31;;;;;;;;;;:36;39931:201;;;40104:16;40115:4;40104:10;:16::i;19491:258::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;19608:88;;;;;;;;19647:4;19608:88;;;;;;;;;;19588:10;-1:-1:-1;19576:23:0;;;;;;;;;:29;;;;;;;;;:120;;;;-1:-1:-1;;19576:120:0;;;;;;;;;;;;;;;;;19712:29;;19576;;19588:10;19712:29;;;19491:258;;:::o;19757:164::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;19851:10;19839:23;;;;:11;:23;;;;;;;;:29;;;;;;;;;19832:36;;-1:-1:-1;;19832:36:0;;;;;;;;;19884:29;19863:4;;19851:10;19884:29;;;19757:164;:::o;24589:251::-;-1:-1:-1;;;;;24740:28:0;;24669:12;24740:28;;;:13;:28;;;;;;;;:34;;;;;;;;24793:21;;;24816:15;;;24785:47;;;;;;;;;;24793:21;24785:47;-1:-1:-1;;24785:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;24683:12;;24740:34;;24793:21;;;;;24816:15;;;;24785:47;;24816:15;24785:47;;;;;;;;;;;;;;;;;;;;;;;;40423:447;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;40591:213;;;;;;;;40637:4;40591:213;;;40664:124;;;;;;;;;;40591:213;40664:124;;;;;;40591:213;;;;;;40571:10;-1:-1:-1;40552:30:0;;;:18;:30;;;;;:36;;;;;;;;;:252;;;;-1:-1:-1;;40552:252:0;;;;;;;;;;;;;40591:213;;40552:36;;:252;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40552:252:0;;;;;;;;;;;-1:-1:-1;;40820:42:0;;40857:4;;40845:10;;40820:42;;40552:252;;40820:42;40423:447;;;:::o;24411:170::-;15347:33;15369:10;15347:21;:33::i;:::-;15339:42;;;;;;;;24509:10;24495:25;;;;:13;:25;;;;;;;;:31;;;;;;;;24488:38;;-1:-1:-1;;24488:38:0;;;24495:31;24488:38;;;;24495:25;24488:38;:::i;:::-;-1:-1:-1;;24542:31:0;;24568:4;;24556:10;;24542:31;;;;;24411:170;:::o;1544:160::-;470:66;1665:21;1650:47::o;41921:257::-;;;;;;;;;-1:-1:-1;41921:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41921:257:0;;;-1:-1:-1;41921:257:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://41a953d855a89eeb04b17625df1e5d4e4ba5cf90f9ccebdde1870b02399e475a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.