Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
15.01 ETH
Eth Value
$49,096.74 (@ $3,270.94/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,129 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Server Force Gam... | 20285517 | 17 days ago | IN | 0 ETH | 0.00068416 | ||||
Transfer Profit ... | 20282091 | 17 days ago | IN | 0 ETH | 0.00021598 | ||||
Server End Game ... | 20281330 | 17 days ago | IN | 0 ETH | 0.0004851 | ||||
Create Game | 20279456 | 18 days ago | IN | 0.01 ETH | 0.00051145 | ||||
Server Force Gam... | 20278946 | 18 days ago | IN | 0 ETH | 0.00038957 | ||||
Server End Game ... | 20274763 | 18 days ago | IN | 0 ETH | 0.00092837 | ||||
Create Game | 20272844 | 18 days ago | IN | 0.04 ETH | 0.00056923 | ||||
Server End Game | 20272834 | 18 days ago | IN | 0 ETH | 0.00026344 | ||||
Create Game | 20272763 | 18 days ago | IN | 0.1 ETH | 0.00051288 | ||||
Server End Game | 20272760 | 18 days ago | IN | 0 ETH | 0.00022706 | ||||
Create Game | 20270947 | 19 days ago | IN | 0.02 ETH | 0.00067585 | ||||
Server End Game | 20270092 | 19 days ago | IN | 0 ETH | 0.00076434 | ||||
Create Game | 20269977 | 19 days ago | IN | 0.05 ETH | 0.00135782 | ||||
Server End Game | 20256820 | 21 days ago | IN | 0 ETH | 0.00016378 | ||||
Create Game | 20256469 | 21 days ago | IN | 0.08 ETH | 0.00045263 | ||||
Server End Game | 20193916 | 29 days ago | IN | 0 ETH | 0.00023328 | ||||
Create Game | 20193850 | 29 days ago | IN | 0.25 ETH | 0.00042438 | ||||
Server End Game | 20193817 | 29 days ago | IN | 0 ETH | 0.00014422 | ||||
Create Game | 20193807 | 29 days ago | IN | 0.11 ETH | 0.0004068 | ||||
Server End Game | 20107789 | 42 days ago | IN | 0 ETH | 0.00047842 | ||||
Create Game | 20107759 | 42 days ago | IN | 0.01 ETH | 0.00062094 | ||||
Server End Game | 20107755 | 42 days ago | IN | 0 ETH | 0.00041097 | ||||
Create Game | 20107745 | 42 days ago | IN | 0.01 ETH | 0.0005968 | ||||
Server End Game | 20107545 | 42 days ago | IN | 0 ETH | 0.00033077 | ||||
Create Game | 20107533 | 42 days ago | IN | 0.01 ETH | 0.00060783 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20282091 | 17 days ago | 5.12459124 ETH | ||||
20256820 | 21 days ago | 0.0005815 ETH | ||||
20193916 | 29 days ago | 0.00043914 ETH | ||||
20193817 | 29 days ago | 0.000583 ETH | ||||
20107789 | 42 days ago | 0.0099997 ETH | ||||
20107755 | 42 days ago | 0.00998 ETH | ||||
20107545 | 42 days ago | 0.009776 ETH | ||||
20003075 | 56 days ago | 0.0099997 ETH | ||||
19992102 | 58 days ago | 0.00078783 ETH | ||||
19991280 | 58 days ago | 0.31328 ETH | ||||
19990902 | 58 days ago | 0.0033676 ETH | ||||
19981567 | 59 days ago | 0.0000817 ETH | ||||
19902038 | 70 days ago | 0.1001375 ETH | ||||
19901949 | 70 days ago | 0.10454 ETH | ||||
19856840 | 77 days ago | 0.00018122 ETH | ||||
19843304 | 78 days ago | 0.000036 ETH | ||||
19778466 | 88 days ago | 0.675 ETH | ||||
19729972 | 94 days ago | 0.00516948 ETH | ||||
19691851 | 100 days ago | 0.00100965 ETH | ||||
19642276 | 107 days ago | 0.07352662 ETH | ||||
19607883 | 111 days ago | 0.09135159 ETH | ||||
19607159 | 112 days ago | 0.06046629 ETH | ||||
19580758 | 115 days ago | 0.000001 ETH | ||||
19580590 | 115 days ago | 0.0395 ETH | ||||
19558578 | 118 days ago | 0.00280951 ETH |
Loading...
Loading
Contract Name:
GameChannel
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./GameChannelConflict.sol"; /** * @title Game Channel * @author dicether */ contract GameChannel is GameChannelConflict { using SafeMath for uint; /** * @dev contract constructor * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address. * @param _houseAddress House address to move profit to. */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address payable _houseAddress ) GameChannelConflict(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress) { // nothing to do } /** * @notice Create games session request. msg.value needs to be valid stake value. * @param _userEndHash Last entry of users' hash chain. * @param _previousGameId User's previous game id, initial 0. * @param _createBefore Game can be only created before this timestamp. * @param _serverEndHash Last entry of server's hash chain. * @param _serverSig Server signature. See verifyCreateSig */ function createGame( bytes32 _userEndHash, uint _previousGameId, uint _createBefore, bytes32 _serverEndHash, bytes memory _serverSig ) public payable onlyValidValue onlyValidHouseStake(activeGames + 1) onlyNotPaused { uint previousGameId = userGameId[msg.sender]; Game storage game = gameIdGame[previousGameId]; require(game.status == GameStatus.ENDED, "prev game not ended"); require(previousGameId == _previousGameId, "inv gamePrevGameId"); require(block.timestamp < _createBefore, "expired"); verifyCreateSig(block.chainid, msg.sender, _previousGameId, _createBefore, _serverEndHash, _serverSig); uint gameId = gameIdCntr++; userGameId[msg.sender] = gameId; Game storage newGame = gameIdGame[gameId]; newGame.stake = uint128(msg.value); // It's safe to cast msg.value as it is limited, see onlyValidValue newGame.status = GameStatus.ACTIVE; activeGames = activeGames.add(1); // It's safe to cast msg.value as it is limited, see onlyValidValue emit LogGameCreated(msg.sender, gameId, uint128(msg.value), _serverEndHash, _userEndHash); } /** * @dev Regular end game session. Used if user and house have both * accepted current game session state. * The game session with gameId _gameId is closed * and the user paid out. This functions is called by the server after * the user requested the termination of the current game session. * @param _roundId Round id of bet. * @param _balance Current balance. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _userAddress Address of user. * @param _userSig User's signature of this bet. */ function serverEndGame( uint32 _roundId, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, address payable _userAddress, bytes memory _userSig ) public onlyServer { verifySig( _roundId, 0, 0, 0, _balance, _serverHash, _userHash, _gameId, _contractAddress, _userSig, _userAddress ); regularEndGame(_userAddress, _roundId, _balance, _gameId, _contractAddress); } /** * @notice Regular end game session. Normally not needed as server ends game (@see serverEndGame). * Can be used by user if server does not end game session. * @param _roundId Round id of bet. * @param _balance Current balance. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _serverSig Server's signature of this bet. */ function userEndGame( uint32 _roundId, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _serverSig ) public { verifySig( _roundId, 0, 0, 0, _balance, _serverHash, _userHash, _gameId, _contractAddress, _serverSig, serverAddress ); regularEndGame(payable(msg.sender), _roundId, _balance, _gameId, _contractAddress); } /** * @dev Verify server signature. * @param _userAddress User's address. * @param _previousGameId User's previous game id, initial 0. * @param _createBefore Game can be only created before this timestamp. * @param _serverEndHash Last entry of server's hash chain. * @param _serverSig Server signature. */ function verifyCreateSig( uint chainId, address _userAddress, uint _previousGameId, uint _createBefore, bytes32 _serverEndHash, bytes memory _serverSig ) private view { address contractAddress = address(this); bytes32 hash = keccak256(abi.encodePacked( chainId, contractAddress, _userAddress, _previousGameId, _createBefore, _serverEndHash )); verify(hash, _serverSig, serverAddress); } /** * @dev Regular end game session implementation. Used if user and house have both * accepted current game session state. The game session with gameId _gameId is closed * and the user paid out. * @param _userAddress Address of user. * @param _balance Current balance. * @param _gameId Game session id. * @param _contractAddress Address of this contract. */ function regularEndGame( address payable _userAddress, uint32 _roundId, int _balance, uint _gameId, address _contractAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = int(uint(game.stake)); require(_gameId == gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); // save to cast as game.stake hash fixed range require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); require(game.status == GameStatus.ACTIVE, "inv status"); assert(_contractAddress == address(this)); closeGame(game, gameId, _roundId, _userAddress, ReasonEnded.REGULAR_ENDED, _balance); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./Ownable.sol"; /** * @title Activatable * @dev Contract is initial deactivated and can be activated by owner. * @author Dicether */ contract Activatable is Ownable { bool public activated = false; /// @dev Event is fired if activated. event LogActive(); /// @dev Modifier, which only allows function execution if activated. modifier onlyActivated() { require(activated); _; } /// @dev Modifier, which only allows function execution if not activated. modifier onlyNotActivated() { require(!activated); _; } /// @dev activate contract, can be only called once by the contract owner. function activate() public onlyOwner onlyNotActivated { activated = true; emit LogActive(); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; /** * @title Conflict Resolution Interface * @dev interface to contract used for conflict resolution. Only needed if server or * user stops responding during game session. For documentation consult implementation * contract. * @author dicether */ interface ConflictResolutionInterface { function minHouseStake(uint activeGames) external view returns(uint); function maxBalance() external view returns(int); function conflictEndFine() external pure returns(int); function isValidBet(uint8 _gameType, uint _betNum, uint _betValue) external view returns(bool); function endGameConflict( uint8 _gameType, uint _betNum, uint _betValue, int _balance, uint _stake, bytes32 _serverSeed, bytes32 _userSeed ) external view returns(int); function serverForceGameEnd( uint8 gameType, uint _betNum, uint _betValue, int _balance, uint _stake, bytes32 _serverSeed, bytes32 _userSeed, uint _endInitiatedTime ) external view returns(int); function userForceGameEnd( uint8 _gameType, uint _betNum, uint _betValue, int _balance, uint _stake, uint _endInitiatedTime ) external view returns(int); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./ConflictResolutionInterface.sol"; import "./Ownable.sol"; /** * @title Conflict Resolution Manager * @author dicether */ contract ConflictResolutionManager is Ownable { /// @dev Conflict resolution contract. ConflictResolutionInterface public conflictRes; /// @dev New Conflict resolution contract. address public newConflictRes = address(0); /// @dev Time update of new conflict resolution contract was initiated. uint public updateTime = 0; /// @dev Min time before new conflict res contract can be activated after initiating update. uint public constant MIN_TIMEOUT = 3 days; /// @dev Min time before new conflict res contract can be activated after initiating update. uint public constant MAX_TIMEOUT = 6 days; /// @dev Update of conflict resolution contract was initiated. event LogUpdatingConflictResolution(address newConflictResolutionAddress); /// @dev New conflict resolution contract is active. event LogUpdatedConflictResolution(address newConflictResolutionAddress); /** * @dev Constructor * @param _conflictResAddress conflict resolution contract address. */ constructor(address _conflictResAddress) { conflictRes = ConflictResolutionInterface(_conflictResAddress); } /** * @dev Initiate conflict resolution contract update. * @param _newConflictResAddress New conflict resolution contract address. */ function updateConflictResolution(address _newConflictResAddress) public onlyOwner { newConflictRes = _newConflictResAddress; updateTime = block.timestamp; emit LogUpdatingConflictResolution(_newConflictResAddress); } /** * @dev Active new conflict resolution contract. */ function activateConflictResolution() public onlyOwner { require(newConflictRes != address(0)); require(updateTime != 0); require(updateTime + MIN_TIMEOUT <= block.timestamp && block.timestamp <= updateTime + MAX_TIMEOUT); conflictRes = ConflictResolutionInterface(newConflictRes); newConflictRes = address(0); updateTime = 0; emit LogUpdatedConflictResolution(newConflictRes); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./Pausable.sol"; /** * @title Destroyable * @dev Provides destroy support * @author dicether */ contract Destroyable is Pausable { /// @dev After pausing the contract for 20 days owner can selfdestruct it. uint public constant TIMEOUT_DESTROY = 20 days; /** * @dev Destroy contract and transfer ether to owner. */ function destroy() public onlyOwner onlyPausedSince(TIMEOUT_DESTROY) { selfdestruct(payable(owner)); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./ConflictResolutionInterface.sol"; import "./ConflictResolutionManager.sol"; import "./Destroyable.sol"; import "./MathUtil.sol"; import "./SafeCast.sol"; import "./SafeMath.sol"; /** * @title Game Channel Base * @dev Base contract for state channel implementation. * @author dicether */ contract GameChannelBase is Destroyable, ConflictResolutionManager { using SafeCast for int; using SafeCast for uint; using SafeMath for int; using SafeMath for uint; /// @dev Different game session states. enum GameStatus { ENDED, ///< @dev Game session is ended. ACTIVE, ///< @dev Game session is active. USER_INITIATED_END, ///< @dev User initiated non regular end. SERVER_INITIATED_END ///< @dev Server initiated non regular end. } /// @dev Reason game session ended. enum ReasonEnded { REGULAR_ENDED, ///< @dev Game session is regularly ended. SERVER_FORCED_END, ///< @dev User did not respond. Server forced end. USER_FORCED_END, ///< @dev Server did not respond. User forced end. CONFLICT_ENDED ///< @dev Server or user raised conflict ans pushed game state, opponent pushed same game state. } struct Game { /// @dev Game session status. GameStatus status; /// @dev User's stake. uint128 stake; /// @dev Last game round info if not regularly ended. /// If game session is ended normally this data is not used. uint8 gameType; uint32 roundId; uint betNum; uint betValue; int balance; bytes32 userSeed; bytes32 serverSeed; uint endInitiatedTime; } /// @dev Minimal time span between profit transfer. uint public constant MIN_TRANSFER_TIMESPAN = 1 days; /// @dev Maximal time span between profit transfer. uint public constant MAX_TRANSFER_TIMSPAN = 6 * 30 days; bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); bytes32 public constant BET_TYPEHASH = keccak256( "Bet(uint32 roundId,uint8 gameType,uint256 number,uint256 value,int256 balance,bytes32 serverHash,bytes32 userHash,uint256 gameId)" ); bytes32 public DOMAIN_SEPERATOR; /// @dev Current active game sessions. uint public activeGames = 0; /// @dev Game session id counter. Points to next free game session slot. So gameIdCntr -1 is the // number of game sessions created. uint public gameIdCntr = 1; /// @dev Only this address can accept and end games. address public serverAddress; /// @dev Address to transfer profit to. address payable public houseAddress; /// @dev Current house stake. uint public houseStake = 0; /// @dev House profit since last profit transfer. int public houseProfit = 0; /// @dev Min value user needs to deposit for creating game session. uint128 public minStake; /// @dev Max value user can deposit for creating game session. uint128 public maxStake; /// @dev Timeout until next profit transfer is allowed. uint public profitTransferTimeSpan = 14 days; /// @dev Last time profit transferred to house. uint public lastProfitTransferTimestamp; /// @dev Maps gameId to game struct. mapping (uint => Game) public gameIdGame; /// @dev Maps user address to current user game id. mapping (address => uint) public userGameId; /// @dev Maps user address to pending returns. mapping (address => uint) public pendingReturns; /// @dev Modifier, which only allows to execute if house stake is high enough. modifier onlyValidHouseStake(uint _activeGames) { uint minHouseStake = conflictRes.minHouseStake(_activeGames); require(houseStake >= minHouseStake, "inv houseStake"); _; } /// @dev Modifier to check if value send fulfills user stake requirements. modifier onlyValidValue() { require(minStake <= msg.value && msg.value <= maxStake, "inv stake"); _; } /// @dev Modifier, which only allows server to call function. modifier onlyServer() { require(msg.sender == serverAddress); _; } /// @dev Modifier, which only allows to set valid transfer timeouts. modifier onlyValidTransferTimeSpan(uint transferTimeout) { require(transferTimeout >= MIN_TRANSFER_TIMESPAN && transferTimeout <= MAX_TRANSFER_TIMSPAN); _; } /// @dev This event is fired when user creates game session. event LogGameCreated(address indexed user, uint indexed gameId, uint128 stake, bytes32 indexed serverEndHash, bytes32 userEndHash); /// @dev This event is fired when user requests conflict end. event LogUserRequestedEnd(address indexed user, uint indexed gameId); /// @dev This event is fired when server requests conflict end. event LogServerRequestedEnd(address indexed user, uint indexed gameId); /// @dev This event is fired when game session is ended. event LogGameEnded(address indexed user, uint indexed gameId, uint32 roundId, int balance, ReasonEnded reason); /// @dev this event is fired when owner modifies user's stake limits. event LogStakeLimitsModified(uint minStake, uint maxStake); /** * @dev Contract constructor. * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address. * @param _houseAddress House address to move profit to. */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address payable _houseAddress ) ConflictResolutionManager(_conflictResAddress) { require(_minStake > 0 && _minStake <= _maxStake); serverAddress = _serverAddress; houseAddress = _houseAddress; lastProfitTransferTimestamp = block.timestamp; minStake = _minStake; maxStake = _maxStake; DOMAIN_SEPERATOR = keccak256(abi.encode( EIP712DOMAIN_TYPEHASH, keccak256("Dicether"), keccak256("2"), block.chainid, address(this) )); } /** * @dev Set gameIdCntr. Can be only set before activating contract. */ function setGameIdCntr(uint _gameIdCntr) public onlyOwner onlyNotActivated { require(gameIdCntr > 0); gameIdCntr = _gameIdCntr; } /** * @notice Withdraw pending returns. */ function withdraw() public { uint toTransfer = pendingReturns[msg.sender]; require(toTransfer > 0); pendingReturns[msg.sender] = 0; payable(msg.sender).transfer(toTransfer); } /** * @notice Transfer house profit to houseAddress. */ function transferProfitToHouse() public { require(lastProfitTransferTimestamp.add(profitTransferTimeSpan) <= block.timestamp); // update last transfer timestamp lastProfitTransferTimestamp = block.timestamp; if (houseProfit <= 0) { // no profit to transfer return; } uint toTransfer = houseProfit.castToUint(); houseProfit = 0; houseStake = houseStake.sub(toTransfer); houseAddress.transfer(toTransfer); } /** * @dev Set profit transfer time span. */ function setProfitTransferTimeSpan(uint _profitTransferTimeSpan) public onlyOwner onlyValidTransferTimeSpan(_profitTransferTimeSpan) { profitTransferTimeSpan = _profitTransferTimeSpan; } /** * @dev Increase house stake by msg.value */ function addHouseStake() public payable onlyOwner { houseStake = houseStake.add(msg.value); } /** * @dev Withdraw house stake. */ function withdrawHouseStake(uint value) public onlyOwner { uint minHouseStake = conflictRes.minHouseStake(activeGames); require(value <= houseStake && houseStake.sub(value) >= minHouseStake); require(houseProfit <= 0 || houseProfit.castToUint() <= houseStake.sub(value)); houseStake = houseStake.sub(value); payable(owner).transfer(value); } /** * @dev Withdraw house stake and profit. */ function withdrawAll() public onlyOwner onlyPausedSince(3 days) { houseProfit = 0; uint toTransfer = houseStake; houseStake = 0; payable(owner).transfer(toTransfer); } /** * @dev Set new house address. * @param _houseAddress New house address. */ function setHouseAddress(address payable _houseAddress) public onlyOwner { houseAddress = _houseAddress; } /** * @dev Set stake min and max value. * @param _minStake Min stake. * @param _maxStake Max stake. */ function setStakeRequirements(uint128 _minStake, uint128 _maxStake) public onlyOwner { require(_minStake > 0 && _minStake <= _maxStake); minStake = _minStake; maxStake = _maxStake; emit LogStakeLimitsModified(minStake, maxStake); } /** * @dev Close game session. * @param _game Game session data. * @param _gameId Id of game session. * @param _userAddress User's address of game session. * @param _reason Reason for closing game session. * @param _balance Game session balance. */ function closeGame( Game storage _game, uint _gameId, uint32 _roundId, address payable _userAddress, ReasonEnded _reason, int _balance ) internal { _game.status = GameStatus.ENDED; activeGames = activeGames.sub(1); payOut(_userAddress, _game.stake, _balance); emit LogGameEnded(_userAddress, _gameId, _roundId, _balance, _reason); } /** * @dev End game by paying out user and server. * @param _userAddress User's address. * @param _stake User's stake. * @param _balance User's balance. */ function payOut(address payable _userAddress, uint128 _stake, int _balance) internal { int stakeInt = int(uint(_stake)); int houseStakeInt = houseStake.castToInt(); assert(_balance <= conflictRes.maxBalance()); assert((stakeInt.add(_balance)) >= 0); if (_balance > 0 && houseStakeInt < _balance) { // Should never happen! // House is bankrupt. // Payout left money. _balance = houseStakeInt; } houseProfit = houseProfit.sub(_balance); int newHouseStake = houseStakeInt.sub(_balance); houseStake = newHouseStake.castToUint(); uint valueUser = stakeInt.add(_balance).castToUint(); pendingReturns[_userAddress] += valueUser; if (pendingReturns[_userAddress] > 0) { safeSend(_userAddress); } } /** * @dev Send value of pendingReturns[_address] to _address. * @param _address Address to send value to. */ function safeSend(address payable _address) internal { uint valueToSend = pendingReturns[_address]; assert(valueToSend > 0); pendingReturns[_address] = 0; if (_address.send(valueToSend) == false) { pendingReturns[_address] = valueToSend; } } /** * @dev Verify signature of given data. Throws on verification failure. * @param _sig Signature of given data in the form of rsv. * @param _address Address of signature signer. */ function verifySig( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _sig, address _address ) internal view { // check if this is the correct contract address contractAddress = address(this); require(_contractAddress == contractAddress, "inv contractAddress"); bytes32 roundHash = calcHash( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId ); verify( roundHash, _sig, _address ); } /** * @dev Check if _sig is valid signature of _hash. Throws if invalid signature. * @param _hash Hash to check signature of. * @param _sig Signature of _hash. * @param _address Address of signer. */ function verify( bytes32 _hash, bytes memory _sig, address _address ) internal pure { (bytes32 r, bytes32 s, uint8 v) = signatureSplit(_sig); address addressRecover = ecrecover(_hash, v, r, s); require(addressRecover == _address, "inv sig"); } /** * @dev Calculate typed hash of given data (compare eth_signTypedData). * @return Hash of given data. */ function calcHash( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId ) private view returns(bytes32) { bytes32 betHash = keccak256(abi.encode( BET_TYPEHASH, _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId )); return keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPERATOR, betHash )); } /** * @dev Split the given signature of the form rsv in r s v. v is incremented with 27 if * it is below 2. * @param _signature Signature to split. * @return r s v */ function signatureSplit(bytes memory _signature) private pure returns (bytes32 r, bytes32 s, uint8 v) { require(_signature.length == 65, "inv sig"); assembly { r := mload(add(_signature, 32)) s := mload(add(_signature, 64)) v := and(mload(add(_signature, 65)), 0xff) } if (v < 2) { v = v + 27; } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./GameChannelBase.sol"; /** * @title Game Channel Conflict * @dev Conflict handling implementation. * @author dicether */ contract GameChannelConflict is GameChannelBase { using SafeCast for int; using SafeCast for uint; using SafeMath for int; using SafeMath for uint; /** * @dev Contract constructor. * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address * @param _houseAddress House address to move profit to */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address payable _houseAddress ) GameChannelBase(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress) { // nothing to do } /** * @dev Used by server if user does not end game session. * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server seed for this bet. * @param _userHash Hash of user seed for this bet. * @param _gameId Game session id. * @param _userSig User signature of this bet. * @param _userAddress Address of user. * @param _serverSeed Server seed for this bet. * @param _userSeed User seed for this bet. */ function serverEndGameConflict( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, bytes memory _userSig, address payable _userAddress, bytes32 _serverSeed, bytes32 _userSeed ) public onlyServer { verifySig( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId, address(this), _userSig, _userAddress ); serverEndGameConflictImpl( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _serverSeed, _userSeed, _gameId, _userAddress ); } /** * @notice Can be used by user if server does not answer to the end game session request. * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server seed for this bet. * @param _userHash Hash of user seed for this bet. * @param _gameId Game session id. * @param _serverSig Server signature of this bet. * @param _userSeed User seed for this bet. */ function userEndGameConflict( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, bytes memory _serverSig, bytes32 _userSeed ) public { verifySig( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId, address(this), _serverSig, serverAddress ); userEndGameConflictImpl( _roundId, _gameType, _num, _value, _balance, _userHash, _userSeed, _gameId, payable(msg.sender) ); } /** * @notice Cancel active game without playing. Useful if server stops responding before * one game is played. * @param _gameId Game session id. */ function userCancelActiveGame(uint _gameId) public { address payable userAddress = payable(msg.sender); uint gameId = userGameId[userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); if (game.status == GameStatus.ACTIVE) { game.endInitiatedTime = block.timestamp; game.status = GameStatus.USER_INITIATED_END; emit LogUserRequestedEnd(msg.sender, gameId); } else if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == 0) { cancelActiveGame(game, gameId, userAddress); } else { revert(); } } /** * @dev Cancel active game without playing. Useful if user starts game session and * does not play. * @param _userAddress Users' address. * @param _gameId Game session id. */ function serverCancelActiveGame(address payable _userAddress, uint _gameId) public onlyServer { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); if (game.status == GameStatus.ACTIVE) { game.endInitiatedTime = block.timestamp; game.status = GameStatus.SERVER_INITIATED_END; emit LogServerRequestedEnd(msg.sender, gameId); } else if (game.status == GameStatus.USER_INITIATED_END && game.roundId == 0) { cancelActiveGame(game, gameId, _userAddress); } else { revert(); } } /** * @dev Force end of game if user does not respond. Only possible after a certain period of time * to give the user a chance to respond. * @param _userAddress User's address. */ function serverForceGameEnd(address payable _userAddress, uint _gameId) public onlyServer { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); require(game.status == GameStatus.SERVER_INITIATED_END, "inv status"); // theoretically we have enough data to calculate winner // but as user did not respond assume he has lost. int newBalance = conflictRes.serverForceGameEnd( game.gameType, game.betNum, game.betValue, game.balance, game.stake, game.serverSeed, game.userSeed, game.endInitiatedTime ); closeGame(game, gameId, game.roundId, _userAddress, ReasonEnded.SERVER_FORCED_END, newBalance); } /** * @notice Force end of game if server does not respond. Only possible after a certain period of time * to give the server a chance to respond. */ function userForceGameEnd(uint _gameId) public { address payable userAddress = payable(msg.sender); uint gameId = userGameId[userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); require(game.status == GameStatus.USER_INITIATED_END, "inv status"); int newBalance = conflictRes.userForceGameEnd( game.gameType, game.betNum, game.betValue, game.balance, game.stake, game.endInitiatedTime ); closeGame(game, gameId, game.roundId, userAddress, ReasonEnded.USER_FORCED_END, newBalance); } /** * @dev Conflict handling implementation. Stores game data and timestamp if game * is active. If server has already marked conflict for game session the conflict * resolution contract is used (compare conflictRes). * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _userHash Hash of user's seed for this bet. * @param _userSeed User's seed for this bet. * @param _gameId game Game session id. * @param _userAddress User's address. */ function userEndGameConflictImpl( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _userHash, bytes32 _userSeed, uint _gameId, address payable _userAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = int(uint(game.stake)); require(gameId == _gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed"); require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128 require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet"); require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "value too high"); // game.stake save to cast as uint128 if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == _roundId) { game.userSeed = _userSeed; endGameConflict(game, gameId, _userAddress); } else if (game.status == GameStatus.ACTIVE || (game.status == GameStatus.SERVER_INITIATED_END && game.roundId < _roundId)) { game.status = GameStatus.USER_INITIATED_END; game.endInitiatedTime = block.timestamp; game.roundId = _roundId; game.gameType = _gameType; game.betNum = _num; game.betValue = _value; game.balance = _balance; game.userSeed = _userSeed; game.serverSeed = bytes32(0); emit LogUserRequestedEnd(msg.sender, gameId); } else { revert("inv state"); } } /** * @dev Conflict handling implementation. Stores game data and timestamp if game * is active. If user has already marked conflict for game session the conflict * resolution contract is used (compare conflictRes). * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _serverSeed Server's seed for this bet. * @param _userSeed User's seed for this bet. * @param _userAddress User's address. */ function serverEndGameConflictImpl( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, bytes32 _serverSeed, bytes32 _userSeed, uint _gameId, address payable _userAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = int(uint(game.stake)); require(gameId == _gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); require(keccak256(abi.encodePacked(_serverSeed)) == _serverHash, "inv serverSeed"); require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed"); require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128 require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet"); require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "too high value"); // game.stake save to cast as uin128 if (game.status == GameStatus.USER_INITIATED_END && game.roundId == _roundId) { game.serverSeed = _serverSeed; endGameConflict(game, gameId, _userAddress); } else if (game.status == GameStatus.ACTIVE || (game.status == GameStatus.USER_INITIATED_END && game.roundId < _roundId)) { game.status = GameStatus.SERVER_INITIATED_END; game.endInitiatedTime = block.timestamp; game.roundId = _roundId; game.gameType = _gameType; game.betNum = _num; game.betValue = _value; game.balance = _balance; game.serverSeed = _serverSeed; game.userSeed = _userSeed; emit LogServerRequestedEnd(_userAddress, gameId); } else { revert("inv state"); } } /** * @dev End conflicting game without placed bets. * @param _game Game session data. * @param _gameId Game session id. * @param _userAddress User's address. */ function cancelActiveGame(Game storage _game, uint _gameId, address payable _userAddress) private { // user need to pay a fee when conflict ended. // this ensures a malicious, rich user can not just generate game sessions and then wait // for us to end the game session and then confirm the session status, so // we would have to pay a high gas fee without profit. int newBalance = -conflictRes.conflictEndFine(); // do not allow balance below user stake int stake = int(uint(_game.stake)); if (newBalance < -stake) { newBalance = -stake; } closeGame(_game, _gameId, 0, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance); } /** * @dev End conflicting game. * @param _game Game session data. * @param _gameId Game session id. * @param _userAddress User's address. */ function endGameConflict(Game storage _game, uint _gameId, address payable _userAddress) private { int newBalance = conflictRes.endGameConflict( _game.gameType, _game.betNum, _game.betValue, _game.balance, _game.stake, _game.serverSeed, _game.userSeed ); closeGame(_game, _gameId, _game.roundId, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; /** * @title Math utils * @author dicether */ library MathUtil { /** * @dev Returns the absolute value of _val. * @param _val value * @return The absolute value of _val. */ function abs(int _val) internal pure returns(uint) { if (_val < 0) { return uint(-_val); } else { return uint(_val); } } /** * @dev Calculate maximum. */ function max(uint _val1, uint _val2) internal pure returns(uint) { return _val1 >= _val2 ? _val1 : _val2; } /** * @dev Calculate minimum. */ function min(uint _val1, uint _val2) internal pure returns(uint) { return _val1 <= _val2 ? _val1 : _val2; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; /** * @title Owned * @dev Basic contract for authorization control. * @author dicether */ contract Ownable { address public owner; address public pendingOwner; event LogOwnerShipTransferred(address indexed previousOwner, address indexed newOwner); event LogOwnerShipTransferInitiated(address indexed previousOwner, address indexed newOwner); /** * @dev Modifier, which throws if called by other account than owner. */ modifier onlyOwner { require(msg.sender == owner); _; } /** * @dev Modifier throws if called by any account other than the pendingOwner. */ modifier onlyPendingOwner() { require(msg.sender == pendingOwner); _; } /** * @dev Set contract creator as initial owner */ constructor() { owner = msg.sender; pendingOwner = address(0); } /** * @dev Allows the current owner to set the pendingOwner address. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address payable _newOwner) public onlyOwner { pendingOwner = _newOwner; emit LogOwnerShipTransferInitiated(owner, _newOwner); } /** * @dev PendingOwner can accept ownership. */ function claimOwnership() public onlyPendingOwner { owner = pendingOwner; pendingOwner = address(0); emit LogOwnerShipTransferred(owner, pendingOwner); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; import "./Activatable.sol"; import "./SafeMath.sol"; /** * @title Pausable * @dev Provides pausing support. * @author dicether */ contract Pausable is Activatable { using SafeMath for uint; /// @dev Is contract paused. Initial it is paused. bool public paused = true; /// @dev Time pause was called uint public timePaused = block.timestamp; /// @dev Modifier, which only allows function execution if not paused. modifier onlyNotPaused() { require(!paused, "paused"); _; } /// @dev Modifier, which only allows function execution if paused. modifier onlyPaused() { require(paused); _; } /// @dev Modifier, which only allows function execution if paused longer than timeSpan. modifier onlyPausedSince(uint timeSpan) { require(paused && (timePaused.add(timeSpan) <= block.timestamp)); _; } /// @dev Event is fired if paused. event LogPause(); /// @dev Event is fired if pause is ended. event LogUnpause(); /** * @dev Pause contract. No new game sessions can be created. */ function pause() public onlyOwner onlyNotPaused { paused = true; timePaused = block.timestamp; emit LogPause(); } /** * @dev Unpause contract. Initial contract is paused and can only be unpaused after activating it. */ function unpause() public onlyOwner onlyPaused onlyActivated { paused = false; timePaused = 0; emit LogUnpause(); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.11; library SafeCast { /** * Cast unsigned a to signed a. */ function castToInt(uint a) internal pure returns(int) { assert(a < (1 << 255)); return int(a); } /** * Cast signed a to unsigned a. */ function castToUint(int a) internal pure returns(uint) { assert(a >= 0); return uint(a); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @title SafeMath * @dev Math operations with safety checks that throw on error. * No checks necessary for solidity >= 0.8. * From zeppelin-solidity */ library SafeMath { /** * @dev Multiplies two unsigned integers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { return a * b; } /** * @dev Multiplies two signed integers, throws on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { return a * b; } /** * @dev Integer division of two unsigned integers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Integer division of two signed integers, truncating the quotient. */ function div(int256 a, int256 b) internal pure returns (int256) { return a / b; } /** * @dev Subtracts two unsigned integers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Subtracts two signed integers, throws on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { return a - b; } /** * @dev Adds two unsigned integers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { return a + b; } /** * @dev Adds two signed integers, throws on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { return a + b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_serverAddress","type":"address"},{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"},{"internalType":"address","name":"_conflictResAddress","type":"address"},{"internalType":"address payable","name":"_houseAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"stake","type":"uint128"},{"indexed":true,"internalType":"bytes32","name":"serverEndHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"userEndHash","type":"bytes32"}],"name":"LogGameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"roundId","type":"uint32"},{"indexed":false,"internalType":"int256","name":"balance","type":"int256"},{"indexed":false,"internalType":"enum GameChannelBase.ReasonEnded","name":"reason","type":"uint8"}],"name":"LogGameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"LogPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogServerRequestedEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"}],"name":"LogStakeLimitsModified","type":"event"},{"anonymous":false,"inputs":[],"name":"LogUnpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatedConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatingConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogUserRequestedEnd","type":"event"},{"inputs":[],"name":"BET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRANSFER_TIMSPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TRANSFER_TIMESPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMEOUT_DESTROY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateConflictResolution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addHouseStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"conflictRes","outputs":[{"internalType":"contract ConflictResolutionInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_userEndHash","type":"bytes32"},{"internalType":"uint256","name":"_previousGameId","type":"uint256"},{"internalType":"uint256","name":"_createBefore","type":"uint256"},{"internalType":"bytes32","name":"_serverEndHash","type":"bytes32"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"createGame","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gameIdCntr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameIdGame","outputs":[{"internalType":"enum GameChannelBase.GameStatus","name":"status","type":"uint8"},{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint8","name":"gameType","type":"uint8"},{"internalType":"uint32","name":"roundId","type":"uint32"},{"internalType":"uint256","name":"betNum","type":"uint256"},{"internalType":"uint256","name":"betValue","type":"uint256"},{"internalType":"int256","name":"balance","type":"int256"},{"internalType":"bytes32","name":"userSeed","type":"bytes32"},{"internalType":"bytes32","name":"serverSeed","type":"bytes32"},{"internalType":"uint256","name":"endInitiatedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProfitTransferTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newConflictRes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReturns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitTransferTimeSpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverCancelActiveGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"}],"name":"serverEndGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"bytes","name":"_userSig","type":"bytes"},{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"bytes32","name":"_serverSeed","type":"bytes32"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"serverEndGameConflict","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverForceGameEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameIdCntr","type":"uint256"}],"name":"setGameIdCntr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_houseAddress","type":"address"}],"name":"setHouseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitTransferTimeSpan","type":"uint256"}],"name":"setProfitTransferTimeSpan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"}],"name":"setStakeRequirements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timePaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferProfitToHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newConflictResAddress","type":"address"}],"name":"updateConflictResolution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userCancelActiveGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"userEndGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"userEndGameConflict","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userForceGameEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userGameId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawHouseStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001805461ffff60a01b1916600160a81b17815542600255600480546001600160a01b0319169055600060058190556007819055600891909155600b819055600c5562127500600e553480156200005a57600080fd5b5060405162003779380380620037798339810160408190526200007d9162000227565b60008054336001600160a01b0319918216179091556001805482169055600380549091166001600160a01b038416179055848484848484848484846001600160801b03841615801590620000e35750826001600160801b0316846001600160801b031611155b620000ed57600080fd5b600980546001600160a01b038781166001600160a01b031992831617909255600a80549284169290911691909117905542600f556001600160801b03838116600160801b0290851617600d55604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fdfb13de966cad53a4ce1c44730ad9a850de899696c2a38947c9e6affb568cdbb918101919091527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260c00160405160208183030381529060405280519060200120600681905550505050505050505050505050505050620002a0565b6001600160a01b03811681146200020757600080fd5b50565b80516001600160801b03811681146200022257600080fd5b919050565b600080600080600060a086880312156200024057600080fd5b85516200024d81620001f1565b94506200025d602087016200020a565b93506200026d604087016200020a565b925060608601516200027f81620001f1565b60808701519092506200029281620001f1565b809150509295509295909350565b6134c980620002b06000396000f3fe6080604052600436106103505760003560e01c806388fedd04116101c6578063d1e9dcbf116100f7578063e475222e11610095578063ef3aaf541161006f578063ef3aaf54146109d3578063f2fde38b146109f3578063f87ffb7414610a13578063fd306ca714610a2957600080fd5b8063e475222e14610976578063e60a33aa1461098c578063ea1b28e0146109ac57600080fd5b8063db420fe3116100d1578063db420fe314610909578063dc55509014610929578063de38eb3a1461093f578063e30c39781461095657600080fd5b8063d1e9dcbf146108a9578063d6e5fe98146108c9578063d7cee31e146108e957600080fd5b8063a8182cd311610164578063bd5c4e241161013e578063bd5c4e2414610828578063c49f91d31461083f578063c861f3a014610873578063cbffb1ae1461088957600080fd5b8063a8182cd3146107d5578063afc81953146107f5578063b064ca181461080857600080fd5b80639b29f133116101a05780639b29f133146107605780639c0051db146107805780639f34ce14146107a0578063a09f8659146107b557600080fd5b806388fedd04146107135780638da5cb5b14610729578063947bc72d1461074957600080fd5b80634d20d4bc116102a0578063613f92371161023e57806383197ef01161021857806383197ef01461063c57806383e256dc146106515780638456cb59146106e9578063853828b6146106fe57600080fd5b8063613f9237146105dc5780637eaf8879146105fc57806381efc01d1461061c57600080fd5b8063543ad1df1161027a578063543ad1df14610556578063563c23a01461056d5780635ba2dd22146105835780635c975abb146105bb57600080fd5b80634d20d4bc146105055780634e71e0c8146105395780634f739ff01461054e57600080fd5b8063287e9fbc1161030d5780633ccfd60b116102e75780633ccfd60b146104a55780633f4ba83a146104ba578063410453ae146104cf57806341b80184146104ef57600080fd5b8063287e9fbc146104375780632c94a23514610457578063375b3c0a1461046d57600080fd5b80630df63210146103555780630f15f4c01461037e578063186601ca1461039557806319fc36ed146103c65780631b08345a146103dd57806326b387bb1461040a575b600080fd5b34801561036157600080fd5b5061036b60065481565b6040519081526020015b60405180910390f35b34801561038a57600080fd5b50610393610a3e565b005b3480156103a157600080fd5b506001546103b690600160a01b900460ff1681565b6040519015158152602001610375565b3480156103d257600080fd5b5061036b6201518081565b3480156103e957600080fd5b5061036b6103f8366004612d5b565b60116020526000908152604090205481565b34801561041657600080fd5b5061036b610425366004612d5b565b60126020526000908152604090205481565b34801561044357600080fd5b50610393610452366004612d78565b610aaa565b34801561046357600080fd5b5061036b600e5481565b34801561047957600080fd5b50600d5461048d906001600160801b031681565b6040516001600160801b039091168152602001610375565b3480156104b157600080fd5b50610393610aec565b3480156104c657600080fd5b50610393610b45565b3480156104db57600080fd5b506103936104ea366004612e58565b610bc5565b3480156104fb57600080fd5b5061036b600f5481565b34801561051157600080fd5b5061036b7feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac81565b34801561054557600080fd5b50610393610c08565b610393610c70565b34801561056257600080fd5b5061036b6203f48081565b34801561057957600080fd5b5061036b60025481565b34801561058f57600080fd5b506003546105a3906001600160a01b031681565b6040516001600160a01b039091168152602001610375565b3480156105c757600080fd5b506001546103b690600160a81b900460ff1681565b3480156105e857600080fd5b506103936105f7366004612f03565b610c99565b34801561060857600080fd5b50610393610617366004612fc5565b610ce4565b34801561062857600080fd5b50610393610637366004612d78565b610d29565b34801561064857600080fd5b50610393610e5b565b34801561065d57600080fd5b506106d361066c366004612d78565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6040516103759a9998979695949392919061309d565b3480156106f557600080fd5b50610393610eb4565b34801561070a57600080fd5b50610393610f55565b34801561071f57600080fd5b5061036b600c5481565b34801561073557600080fd5b506000546105a3906001600160a01b031681565b34801561075557600080fd5b5061036b62ed4e0081565b34801561076c57600080fd5b5061039361077b366004612d78565b610fe9565b34801561078c57600080fd5b5061039361079b366004612d78565b6110ce565b3480156107ac57600080fd5b5061039361110b565b3480156107c157600080fd5b506004546105a3906001600160a01b031681565b3480156107e157600080fd5b506103936107f0366004613102565b6111dd565b61039361080336600461312e565b6112dc565b34801561081457600080fd5b50610393610823366004612d78565b611617565b34801561083457600080fd5b5061036b621a5e0081565b34801561084b57600080fd5b5061036b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b34801561087f57600080fd5b5061036b600b5481565b34801561089557600080fd5b506103936108a4366004612d5b565b611772565b3480156108b557600080fd5b506103936108c4366004613102565b6117e1565b3480156108d557600080fd5b506103936108e43660046131a9565b611976565b3480156108f557600080fd5b50600a546105a3906001600160a01b031681565b34801561091557600080fd5b506009546105a3906001600160a01b031681565b34801561093557600080fd5b5061036b60055481565b34801561094b57600080fd5b5061036b6207e90081565b34801561096257600080fd5b506001546105a3906001600160a01b031681565b34801561098257600080fd5b5061036b60075481565b34801561099857600080fd5b506103936109a73660046131dc565b611a25565b3480156109b857600080fd5b50600d5461048d90600160801b90046001600160801b031681565b3480156109df57600080fd5b506103936109ee366004612d5b565b611a65565b3480156109ff57600080fd5b50610393610a0e366004612d5b565b611a9e565b348015610a1f57600080fd5b5061036b60085481565b348015610a3557600080fd5b50610393611b06565b6000546001600160a01b03163314610a5557600080fd5b600154600160a01b900460ff1615610a6c57600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b6000546001600160a01b03163314610ac157600080fd5b600154600160a01b900460ff1615610ad857600080fd5b600060085411610ae757600080fd5b600855565b3360009081526012602052604090205480610b0657600080fd5b336000818152601260205260408082208290555183156108fc0291849190818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610b5c57600080fd5b600154600160a81b900460ff16610b7257600080fd5b600154600160a01b900460ff16610b8857600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b6009546001600160a01b03163314610bdc57600080fd5b610bf18860008060008b8b8b8b8b8a8c611b98565b610bfe8289898787611cbe565b5050505050505050565b6001546001600160a01b03163314610c1f57600080fd5b60018054600080546001600160a01b0383166001600160a01b03199182168117835592169092556040517f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6000546001600160a01b03163314610c8757600080fd5b600b54610c949034611e3b565b600b55565b6009546001600160a01b03163314610cb057600080fd5b610cc38c8c8c8c8c8c8c8c308d8d611b98565b610cd68c8c8c8c8c8c8c89898e8d611e4e565b505050505050505050505050565b610d0c8a8a8a8a8a8a8a8a308b600960009054906101000a90046001600160a01b0316611b98565b610d1d8a8a8a8a8a89878a33612333565b50505050505050505050565b6000546001600160a01b03163314610d4057600080fd5b6003546007546040516373c4726b60e01b815260048101919091526000916001600160a01b0316906373c4726b90602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190613263565b9050600b548211158015610dd35750600b548190610dd0908461272b565b10155b610ddc57600080fd5b6000600c54131580610e045750600b54610df6908361272b565b610e01600c54612737565b11155b610e0d57600080fd5b600b54610e1a908361272b565b600b55600080546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015610e56573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610e7257600080fd5b600154621a5e0090600160a81b900460ff168015610e9d57506002544290610e9a9083611e3b565b11155b610ea657600080fd5b6000546001600160a01b0316ff5b6000546001600160a01b03163314610ecb57600080fd5b600154600160a81b900460ff1615610f135760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064015b60405180910390fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b03163314610f6c57600080fd5b6001546203f48090600160a81b900460ff168015610f9757506002544290610f949083611e3b565b11155b610fa057600080fd5b6000600c819055600b805490829055815460405191926001600160a01b039091169183156108fc0291849190818181858888f19350505050158015610e56573d6000803e3d6000fd5b3360008181526011602090815260408083205480845260109092529091208382146110265760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561103e5761103e613069565b141561108757426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a36110c8565b6003815460ff16600381111561109f5761109f613069565b1480156110b857508054600160901b900463ffffffff16155b15610350576110c881838561274d565b50505050565b6000546001600160a01b031633146110e557600080fd5b806201518081101580156110fc575062ed4e008111155b61110557600080fd5b50600e55565b6000546001600160a01b0316331461112257600080fd5b6004546001600160a01b031661113757600080fd5b60055461114357600080fd5b426203f48060055461115591906132b6565b1115801561117357506207e90060055461116f91906132b6565b4211155b61117c57600080fd5b60048054600380546001600160a01b0383166001600160a01b031991821617909155169055600060058190556040519081527f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89060200160405180910390a1565b6009546001600160a01b031633146111f457600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461123a5760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561125257611252613069565b141561129b57426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a36110c8565b6002815460ff1660038111156112b3576112b3613069565b1480156112cc57508054600160901b900463ffffffff16155b15610350576110c881838661274d565b600d54346001600160801b039091161180159061130b5750600d54600160801b90046001600160801b03163411155b6113435760405162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b6044820152606401610f0a565b6007546113519060016132b6565b6003546040516373c4726b60e01b8152600481018390526000916001600160a01b0316906373c4726b90602401602060405180830381865afa15801561139b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bf9190613263565b905080600b5410156114045760405162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b6044820152606401610f0a565b600154600160a81b900460ff16156114475760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610f0a565b33600090815260116020908152604080832054808452601090925282209091815460ff16600381111561147c5761147c613069565b146114bf5760405162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b6044820152606401610f0a565b8782146115035760405162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b6044820152606401610f0a565b86421061153c5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610f0a565b61154a46338a8a8a8a612803565b600880546000918261155b836132ce565b9091555033600090815260116020908152604080832084905583835260109091529020805470ffffffffffffffffffffffffffffffffff191660ff19610100346001600160801b03160216176001908117825560075492935090916115bf91611e3b565b600755604080516001600160801b0334168152602081018d90528991849133917fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1910160405180910390a45050505050505050505050565b3360008181526011602090815260408083205480845260109092529091208382146116545760405162461bcd60e51b8152600401610f0a9061327c565b6002815460ff16600381111561166c5761166c613069565b146116895760405162461bcd60e51b8152600401610f0a906132e9565b6003805482546001840154600285015493850154600686015460405163062f5d8d60e11b8152600160881b850460ff1660048201526024810193909352604483019590955260648201526101009091046001600160801b0316608482015260a48101929092526000916001600160a01b0390911690630c5ebb1a9060c401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117489190613263565b825490915061176b9083908590600160901b900463ffffffff168760028661287a565b5050505050565b6000546001600160a01b0316331461178957600080fd5b600480546001600160a01b0319166001600160a01b038316908117909155426005556040519081527f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9060200160405180910390a150565b6009546001600160a01b031633146117f857600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461183e5760405162461bcd60e51b8152600401610f0a9061327c565b6003815460ff16600381111561185657611856613069565b146118735760405162461bcd60e51b8152600401610f0a906132e9565b60038054825460018401546002850154938501546005860154600480880154600689015460405163454a41cd60e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935260e48101929092526000916001600160a01b0390911690638a94839a9061010401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190613263565b825490915061176b9083908590600160901b900463ffffffff168860018661287a565b6000546001600160a01b0316331461198d57600080fd5b6000826001600160801b03161180156119b85750806001600160801b0316826001600160801b031611155b6119c157600080fd5b6001600160801b03828116600160801b8383168102828117600d8190556040805192861690941782529190910490921660208301527f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8910160405180910390a15050565b611a4f8760008060008a8a8a8a8a8a600960009054906101000a90046001600160a01b0316611b98565b611a5c3388888686611cbe565b50505050505050565b6000546001600160a01b03163314611a7c57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ab557600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b42611b1e600e54600f54611e3b90919063ffffffff16565b1115611b2957600080fd5b42600f55600c54600012611b3957565b6000611b46600c54612737565b6000600c55600b54909150611b5b908261272b565b600b55600a546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b41573d6000803e3d6000fd5b306001600160a01b0384168114611be75760405162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b6044820152606401610f0a565b604080517feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac60208083019190915263ffffffff8f168284015260ff8e166060830152608082018d905260a082018c905260c082018b905260e082018a90526101008201899052610120808301899052835180840390910181526101408301845280519082012060065461190160f01b61016085015261016284015261018280840191909152835180840390910181526101a29092019092528051910120611caf8185856128fd565b50505050505050505050505050565b6001600160a01b038086166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190613263565b825490915061010090046001600160801b0316838614611d7a5760405162461bcd60e51b8152600401610f0a9061327c565b60008863ffffffff1611611da05760405162461bcd60e51b8152600401610f0a9061330d565b86611daa82613332565b13158015611db85750818713155b611dd45760405162461bcd60e51b8152600401610f0a9061334f565b6001835460ff166003811115611dec57611dec613069565b14611e095760405162461bcd60e51b8152600401610f0a906132e9565b6001600160a01b0385163014611e2157611e21613374565b611e3083858a8c60008c61287a565b505050505050505050565b6000611e4782846132b6565b9392505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed89190613263565b825490915061010090046001600160801b0316858414611f0a5760405162461bcd60e51b8152600401610f0a9061327c565b60008f63ffffffff1611611f305760405162461bcd60e51b8152600401610f0a9061330d565b8988604051602001611f4491815260200190565b6040516020818303038152906040528051906020012014611f985760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b6044820152606401610f0a565b8887604051602001611fac91815260200190565b6040516020818303038152906040528051906020012014611ffe5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8a61200882613332565b131580156120165750818b13155b6120325760405162461bcd60e51b8152600401610f0a9061334f565b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b815260040161208d9392919060ff9390931683526020830191909152604082015260600190565b602060405180830381865afa1580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061338a565b6121045760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b60006121226121128e6129c8565b61211c848f6129dd565b906129e9565b12156121615760405162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b6044820152606401610f0a565b6002835460ff16600381111561217957612179613069565b1480156121a557508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b156121c157600583018890556121bc8385876129f5565b612322565b6001835460ff1660038111156121d9576121d9613069565b148061222457506002835460ff1660038111156121f8576121f8613069565b14801561222457508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156122ee578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a3612322565b60405162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b6044820152606401610f0a565b505050505050505050505050505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015612399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190613263565b825490915061010090046001600160801b03168584146123ef5760405162461bcd60e51b8152600401610f0a9061327c565b60008d63ffffffff16116124155760405162461bcd60e51b8152600401610f0a9061330d565b878760405160200161242991815260200190565b604051602081830303815290604052805190602001201461247b5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8861248582613332565b131580156124935750818913155b6124af5760405162461bcd60e51b8152600401610f0a9061334f565b6003546040516309eecdd760e01b815260ff8e166004820152602481018d9052604481018c90526001600160a01b03909116906309eecdd790606401602060405180830381865afa158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c919061338a565b6125625760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b600061257a6125708c6129c8565b61211c848d6129dd565b12156125b95760405162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b6044820152606401610f0a565b6003835460ff1660038111156125d1576125d1613069565b1480156125ee5750825463ffffffff8e8116600160901b90920416145b1561260a57600483018790556126058385876129f5565b611caf565b6001835460ff16600381111561262257612622613069565b148061265e57506003835460ff16600381111561264157612641613069565b14801561265e5750825463ffffffff808f16600160901b90920416105b156122ee578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611caf565b6000611e4782846133ac565b60008082121561274957612749613374565b5090565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a9160048083019260209291908290030181865afa158015612797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127bb9190613263565b6127c490613332565b845490915061010090046001600160801b03166127e081613332565b8212156127f3576127f081613332565b91505b61176b858560008660038761287a565b60408051602080820189905230606081811b6bffffffffffffffffffffffff1990811685870152908a901b166054840152606883018890526088830187905260a88084018790528451808503909101815260c89093019093528151910120600954610bfe90829085906001600160a01b03166128fd565b855460ff1916865560075461289090600161272b565b60075585546128af90849061010090046001600160801b031683612ae7565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de58684866040516128ed939291906133c3565b60405180910390a3505050505050565b600080600061290b85612c53565b92509250925060006001878386866040516000815260200160405260405161294f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612971573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b031614611a5c5760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b6000600160ff1b821061274957612749613374565b6000611e4782846133ee565b6000611e47828461342f565b600380548454600186015460028701549387015460058801546004808a0154604051631503b1e760e11b8152600160881b870460ff16928101929092526024820194909452604481019690965260648601919091526101009092046001600160801b0316608485015260a484019190915260c48301526000916001600160a01b0390911690632a0763ce9060e401602060405180830381865afa158015612aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac49190613263565b84549091506110c89085908590600160901b900463ffffffff168560038661287a565b6000826001600160801b031690506000612b02600b546129c8565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7b9190613263565b831315612b8a57612b8a613374565b6000612b9683856129dd565b1215612ba457612ba4613374565b600083138015612bb357508281125b15612bbc578092505b600c54612bc990846129e9565b600c556000612bd882856129e9565b9050612be381612737565b600b556000612bfa612bf585876129dd565b612737565b6001600160a01b038816600090815260126020526040812080549293508392909190612c279084906132b6565b90915550506001600160a01b03871660009081526012602052604090205415611a5c57611a5c87612cc6565b60008060008351604114612c935760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b50505060208101516040820151604183015160ff166002811015612cbf57612cbc81601b61346e565b90505b9193909250565b6001600160a01b03811660009081526012602052604090205480612cec57612cec613374565b6001600160a01b0382166000818152601260205260408082208290555183156108fc0291849190818181858888f115159350610b4192505050576001600160a01b0391909116600090815260126020526040902055565b6001600160a01b0381168114612d5857600080fd5b50565b600060208284031215612d6d57600080fd5b8135611e4781612d43565b600060208284031215612d8a57600080fd5b5035919050565b803563ffffffff81168114612da557600080fd5b919050565b8035612da581612d43565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ddc57600080fd5b813567ffffffffffffffff80821115612df757612df7612db5565b604051601f8301601f19908116603f01168101908282118183101715612e1f57612e1f612db5565b81604052838152866020858801011115612e3857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b031215612e7557600080fd5b612e7e89612d91565b97506020890135965060408901359550606089013594506080890135935060a0890135612eaa81612d43565b925060c0890135612eba81612d43565b915060e089013567ffffffffffffffff811115612ed657600080fd5b612ee28b828c01612dcb565b9150509295985092959890939650565b803560ff81168114612da557600080fd5b6000806000806000806000806000806000806101808d8f031215612f2657600080fd5b612f2f8d612d91565b9b50612f3d60208e01612ef2565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135955060e08d0135945067ffffffffffffffff6101008e01351115612f8357600080fd5b612f948e6101008f01358f01612dcb565b9350612fa36101208e01612daa565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000806000806000806000806101408b8d031215612fe557600080fd5b612fee8b612d91565b9950612ffc60208c01612ef2565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013567ffffffffffffffff81111561304357600080fd5b61304f8d828e01612dcb565b9250506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b60048110612d5857634e487b7160e01b600052602160045260246000fd5b61014081016130ab8c61307f565b9a81526001600160801b039990991660208a015260ff97909716604089015263ffffffff959095166060880152608087019390935260a086019190915260c085015260e08401526101008301526101209091015290565b6000806040838503121561311557600080fd5b823561312081612d43565b946020939093013593505050565b600080600080600060a0868803121561314657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561317957600080fd5b61318588828901612dcb565b9150509295509295909350565b80356001600160801b0381168114612da557600080fd5b600080604083850312156131bc57600080fd5b6131c583613192565b91506131d360208401613192565b90509250929050565b600080600080600080600060e0888a0312156131f757600080fd5b61320088612d91565b96506020880135955060408801359450606088013593506080880135925060a088013561322c81612d43565b915060c088013567ffffffffffffffff81111561324857600080fd5b6132548a828b01612dcb565b91505092959891949750929550565b60006020828403121561327557600080fd5b5051919050565b6020808252600a90820152691a5b9d8819d85b59525960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132c9576132c96132a0565b500190565b60006000198214156132e2576132e26132a0565b5060010190565b6020808252600a9082015269696e762073746174757360b01b604082015260600190565b6020808252600b908201526a1a5b9d881c9bdd5b99125960aa1b604082015260600190565b6000600160ff1b821415613348576133486132a0565b5060000390565b6020808252600b908201526a696e762062616c616e636560a81b604082015260600190565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561339c57600080fd5b81518015158114611e4757600080fd5b6000828210156133be576133be6132a0565b500390565b63ffffffff8416815260208101839052606081016133e08361307f565b826040830152949350505050565b600080821280156001600160ff1b0384900385131615613410576134106132a0565b600160ff1b8390038412811615613429576134296132a0565b50500190565b60008083128015600160ff1b85018412161561344d5761344d6132a0565b6001600160ff1b0384018313811615613468576134686132a0565b50500390565b600060ff821660ff84168060ff0382111561348b5761348b6132a0565b01939250505056fea264697066735822122079c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae64736f6c634300080c0033000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e800000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3
Deployed Bytecode
0x6080604052600436106103505760003560e01c806388fedd04116101c6578063d1e9dcbf116100f7578063e475222e11610095578063ef3aaf541161006f578063ef3aaf54146109d3578063f2fde38b146109f3578063f87ffb7414610a13578063fd306ca714610a2957600080fd5b8063e475222e14610976578063e60a33aa1461098c578063ea1b28e0146109ac57600080fd5b8063db420fe3116100d1578063db420fe314610909578063dc55509014610929578063de38eb3a1461093f578063e30c39781461095657600080fd5b8063d1e9dcbf146108a9578063d6e5fe98146108c9578063d7cee31e146108e957600080fd5b8063a8182cd311610164578063bd5c4e241161013e578063bd5c4e2414610828578063c49f91d31461083f578063c861f3a014610873578063cbffb1ae1461088957600080fd5b8063a8182cd3146107d5578063afc81953146107f5578063b064ca181461080857600080fd5b80639b29f133116101a05780639b29f133146107605780639c0051db146107805780639f34ce14146107a0578063a09f8659146107b557600080fd5b806388fedd04146107135780638da5cb5b14610729578063947bc72d1461074957600080fd5b80634d20d4bc116102a0578063613f92371161023e57806383197ef01161021857806383197ef01461063c57806383e256dc146106515780638456cb59146106e9578063853828b6146106fe57600080fd5b8063613f9237146105dc5780637eaf8879146105fc57806381efc01d1461061c57600080fd5b8063543ad1df1161027a578063543ad1df14610556578063563c23a01461056d5780635ba2dd22146105835780635c975abb146105bb57600080fd5b80634d20d4bc146105055780634e71e0c8146105395780634f739ff01461054e57600080fd5b8063287e9fbc1161030d5780633ccfd60b116102e75780633ccfd60b146104a55780633f4ba83a146104ba578063410453ae146104cf57806341b80184146104ef57600080fd5b8063287e9fbc146104375780632c94a23514610457578063375b3c0a1461046d57600080fd5b80630df63210146103555780630f15f4c01461037e578063186601ca1461039557806319fc36ed146103c65780631b08345a146103dd57806326b387bb1461040a575b600080fd5b34801561036157600080fd5b5061036b60065481565b6040519081526020015b60405180910390f35b34801561038a57600080fd5b50610393610a3e565b005b3480156103a157600080fd5b506001546103b690600160a01b900460ff1681565b6040519015158152602001610375565b3480156103d257600080fd5b5061036b6201518081565b3480156103e957600080fd5b5061036b6103f8366004612d5b565b60116020526000908152604090205481565b34801561041657600080fd5b5061036b610425366004612d5b565b60126020526000908152604090205481565b34801561044357600080fd5b50610393610452366004612d78565b610aaa565b34801561046357600080fd5b5061036b600e5481565b34801561047957600080fd5b50600d5461048d906001600160801b031681565b6040516001600160801b039091168152602001610375565b3480156104b157600080fd5b50610393610aec565b3480156104c657600080fd5b50610393610b45565b3480156104db57600080fd5b506103936104ea366004612e58565b610bc5565b3480156104fb57600080fd5b5061036b600f5481565b34801561051157600080fd5b5061036b7feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac81565b34801561054557600080fd5b50610393610c08565b610393610c70565b34801561056257600080fd5b5061036b6203f48081565b34801561057957600080fd5b5061036b60025481565b34801561058f57600080fd5b506003546105a3906001600160a01b031681565b6040516001600160a01b039091168152602001610375565b3480156105c757600080fd5b506001546103b690600160a81b900460ff1681565b3480156105e857600080fd5b506103936105f7366004612f03565b610c99565b34801561060857600080fd5b50610393610617366004612fc5565b610ce4565b34801561062857600080fd5b50610393610637366004612d78565b610d29565b34801561064857600080fd5b50610393610e5b565b34801561065d57600080fd5b506106d361066c366004612d78565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6040516103759a9998979695949392919061309d565b3480156106f557600080fd5b50610393610eb4565b34801561070a57600080fd5b50610393610f55565b34801561071f57600080fd5b5061036b600c5481565b34801561073557600080fd5b506000546105a3906001600160a01b031681565b34801561075557600080fd5b5061036b62ed4e0081565b34801561076c57600080fd5b5061039361077b366004612d78565b610fe9565b34801561078c57600080fd5b5061039361079b366004612d78565b6110ce565b3480156107ac57600080fd5b5061039361110b565b3480156107c157600080fd5b506004546105a3906001600160a01b031681565b3480156107e157600080fd5b506103936107f0366004613102565b6111dd565b61039361080336600461312e565b6112dc565b34801561081457600080fd5b50610393610823366004612d78565b611617565b34801561083457600080fd5b5061036b621a5e0081565b34801561084b57600080fd5b5061036b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b34801561087f57600080fd5b5061036b600b5481565b34801561089557600080fd5b506103936108a4366004612d5b565b611772565b3480156108b557600080fd5b506103936108c4366004613102565b6117e1565b3480156108d557600080fd5b506103936108e43660046131a9565b611976565b3480156108f557600080fd5b50600a546105a3906001600160a01b031681565b34801561091557600080fd5b506009546105a3906001600160a01b031681565b34801561093557600080fd5b5061036b60055481565b34801561094b57600080fd5b5061036b6207e90081565b34801561096257600080fd5b506001546105a3906001600160a01b031681565b34801561098257600080fd5b5061036b60075481565b34801561099857600080fd5b506103936109a73660046131dc565b611a25565b3480156109b857600080fd5b50600d5461048d90600160801b90046001600160801b031681565b3480156109df57600080fd5b506103936109ee366004612d5b565b611a65565b3480156109ff57600080fd5b50610393610a0e366004612d5b565b611a9e565b348015610a1f57600080fd5b5061036b60085481565b348015610a3557600080fd5b50610393611b06565b6000546001600160a01b03163314610a5557600080fd5b600154600160a01b900460ff1615610a6c57600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b6000546001600160a01b03163314610ac157600080fd5b600154600160a01b900460ff1615610ad857600080fd5b600060085411610ae757600080fd5b600855565b3360009081526012602052604090205480610b0657600080fd5b336000818152601260205260408082208290555183156108fc0291849190818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610b5c57600080fd5b600154600160a81b900460ff16610b7257600080fd5b600154600160a01b900460ff16610b8857600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b6009546001600160a01b03163314610bdc57600080fd5b610bf18860008060008b8b8b8b8b8a8c611b98565b610bfe8289898787611cbe565b5050505050505050565b6001546001600160a01b03163314610c1f57600080fd5b60018054600080546001600160a01b0383166001600160a01b03199182168117835592169092556040517f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6000546001600160a01b03163314610c8757600080fd5b600b54610c949034611e3b565b600b55565b6009546001600160a01b03163314610cb057600080fd5b610cc38c8c8c8c8c8c8c8c308d8d611b98565b610cd68c8c8c8c8c8c8c89898e8d611e4e565b505050505050505050505050565b610d0c8a8a8a8a8a8a8a8a308b600960009054906101000a90046001600160a01b0316611b98565b610d1d8a8a8a8a8a89878a33612333565b50505050505050505050565b6000546001600160a01b03163314610d4057600080fd5b6003546007546040516373c4726b60e01b815260048101919091526000916001600160a01b0316906373c4726b90602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190613263565b9050600b548211158015610dd35750600b548190610dd0908461272b565b10155b610ddc57600080fd5b6000600c54131580610e045750600b54610df6908361272b565b610e01600c54612737565b11155b610e0d57600080fd5b600b54610e1a908361272b565b600b55600080546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015610e56573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610e7257600080fd5b600154621a5e0090600160a81b900460ff168015610e9d57506002544290610e9a9083611e3b565b11155b610ea657600080fd5b6000546001600160a01b0316ff5b6000546001600160a01b03163314610ecb57600080fd5b600154600160a81b900460ff1615610f135760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b60448201526064015b60405180910390fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b03163314610f6c57600080fd5b6001546203f48090600160a81b900460ff168015610f9757506002544290610f949083611e3b565b11155b610fa057600080fd5b6000600c819055600b805490829055815460405191926001600160a01b039091169183156108fc0291849190818181858888f19350505050158015610e56573d6000803e3d6000fd5b3360008181526011602090815260408083205480845260109092529091208382146110265760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561103e5761103e613069565b141561108757426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a36110c8565b6003815460ff16600381111561109f5761109f613069565b1480156110b857508054600160901b900463ffffffff16155b15610350576110c881838561274d565b50505050565b6000546001600160a01b031633146110e557600080fd5b806201518081101580156110fc575062ed4e008111155b61110557600080fd5b50600e55565b6000546001600160a01b0316331461112257600080fd5b6004546001600160a01b031661113757600080fd5b60055461114357600080fd5b426203f48060055461115591906132b6565b1115801561117357506207e90060055461116f91906132b6565b4211155b61117c57600080fd5b60048054600380546001600160a01b0383166001600160a01b031991821617909155169055600060058190556040519081527f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89060200160405180910390a1565b6009546001600160a01b031633146111f457600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461123a5760405162461bcd60e51b8152600401610f0a9061327c565b6001815460ff16600381111561125257611252613069565b141561129b57426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a36110c8565b6002815460ff1660038111156112b3576112b3613069565b1480156112cc57508054600160901b900463ffffffff16155b15610350576110c881838661274d565b600d54346001600160801b039091161180159061130b5750600d54600160801b90046001600160801b03163411155b6113435760405162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b6044820152606401610f0a565b6007546113519060016132b6565b6003546040516373c4726b60e01b8152600481018390526000916001600160a01b0316906373c4726b90602401602060405180830381865afa15801561139b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bf9190613263565b905080600b5410156114045760405162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b6044820152606401610f0a565b600154600160a81b900460ff16156114475760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610f0a565b33600090815260116020908152604080832054808452601090925282209091815460ff16600381111561147c5761147c613069565b146114bf5760405162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b6044820152606401610f0a565b8782146115035760405162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b6044820152606401610f0a565b86421061153c5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b6044820152606401610f0a565b61154a46338a8a8a8a612803565b600880546000918261155b836132ce565b9091555033600090815260116020908152604080832084905583835260109091529020805470ffffffffffffffffffffffffffffffffff191660ff19610100346001600160801b03160216176001908117825560075492935090916115bf91611e3b565b600755604080516001600160801b0334168152602081018d90528991849133917fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1910160405180910390a45050505050505050505050565b3360008181526011602090815260408083205480845260109092529091208382146116545760405162461bcd60e51b8152600401610f0a9061327c565b6002815460ff16600381111561166c5761166c613069565b146116895760405162461bcd60e51b8152600401610f0a906132e9565b6003805482546001840154600285015493850154600686015460405163062f5d8d60e11b8152600160881b850460ff1660048201526024810193909352604483019590955260648201526101009091046001600160801b0316608482015260a48101929092526000916001600160a01b0390911690630c5ebb1a9060c401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117489190613263565b825490915061176b9083908590600160901b900463ffffffff168760028661287a565b5050505050565b6000546001600160a01b0316331461178957600080fd5b600480546001600160a01b0319166001600160a01b038316908117909155426005556040519081527f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9060200160405180910390a150565b6009546001600160a01b031633146117f857600080fd5b6001600160a01b038216600090815260116020908152604080832054808452601090925290912082821461183e5760405162461bcd60e51b8152600401610f0a9061327c565b6003815460ff16600381111561185657611856613069565b146118735760405162461bcd60e51b8152600401610f0a906132e9565b60038054825460018401546002850154938501546005860154600480880154600689015460405163454a41cd60e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935260e48101929092526000916001600160a01b0390911690638a94839a9061010401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119539190613263565b825490915061176b9083908590600160901b900463ffffffff168860018661287a565b6000546001600160a01b0316331461198d57600080fd5b6000826001600160801b03161180156119b85750806001600160801b0316826001600160801b031611155b6119c157600080fd5b6001600160801b03828116600160801b8383168102828117600d8190556040805192861690941782529190910490921660208301527f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8910160405180910390a15050565b611a4f8760008060008a8a8a8a8a8a600960009054906101000a90046001600160a01b0316611b98565b611a5c3388888686611cbe565b50505050505050565b6000546001600160a01b03163314611a7c57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ab557600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b42611b1e600e54600f54611e3b90919063ffffffff16565b1115611b2957600080fd5b42600f55600c54600012611b3957565b6000611b46600c54612737565b6000600c55600b54909150611b5b908261272b565b600b55600a546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b41573d6000803e3d6000fd5b306001600160a01b0384168114611be75760405162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b6044820152606401610f0a565b604080517feef42e798af5b621c1fec054bfc1e4afbc802193bba58f0790a159f94e21fbac60208083019190915263ffffffff8f168284015260ff8e166060830152608082018d905260a082018c905260c082018b905260e082018a90526101008201899052610120808301899052835180840390910181526101408301845280519082012060065461190160f01b61016085015261016284015261018280840191909152835180840390910181526101a29092019092528051910120611caf8185856128fd565b50505050505050505050505050565b6001600160a01b038086166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d489190613263565b825490915061010090046001600160801b0316838614611d7a5760405162461bcd60e51b8152600401610f0a9061327c565b60008863ffffffff1611611da05760405162461bcd60e51b8152600401610f0a9061330d565b86611daa82613332565b13158015611db85750818713155b611dd45760405162461bcd60e51b8152600401610f0a9061334f565b6001835460ff166003811115611dec57611dec613069565b14611e095760405162461bcd60e51b8152600401610f0a906132e9565b6001600160a01b0385163014611e2157611e21613374565b611e3083858a8c60008c61287a565b505050505050505050565b6000611e4782846132b6565b9392505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed89190613263565b825490915061010090046001600160801b0316858414611f0a5760405162461bcd60e51b8152600401610f0a9061327c565b60008f63ffffffff1611611f305760405162461bcd60e51b8152600401610f0a9061330d565b8988604051602001611f4491815260200190565b6040516020818303038152906040528051906020012014611f985760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b6044820152606401610f0a565b8887604051602001611fac91815260200190565b6040516020818303038152906040528051906020012014611ffe5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8a61200882613332565b131580156120165750818b13155b6120325760405162461bcd60e51b8152600401610f0a9061334f565b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b815260040161208d9392919060ff9390931683526020830191909152604082015260600190565b602060405180830381865afa1580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061338a565b6121045760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b60006121226121128e6129c8565b61211c848f6129dd565b906129e9565b12156121615760405162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b6044820152606401610f0a565b6002835460ff16600381111561217957612179613069565b1480156121a557508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b156121c157600583018890556121bc8385876129f5565b612322565b6001835460ff1660038111156121d9576121d9613069565b148061222457506002835460ff1660038111156121f8576121f8613069565b14801561222457508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156122ee578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a3612322565b60405162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b6044820152606401610f0a565b505050505050505050505050505050565b6001600160a01b038082166000908152601160209081526040808320548084526010835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a92600480830193928290030181865afa158015612399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190613263565b825490915061010090046001600160801b03168584146123ef5760405162461bcd60e51b8152600401610f0a9061327c565b60008d63ffffffff16116124155760405162461bcd60e51b8152600401610f0a9061330d565b878760405160200161242991815260200190565b604051602081830303815290604052805190602001201461247b5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b6044820152606401610f0a565b8861248582613332565b131580156124935750818913155b6124af5760405162461bcd60e51b8152600401610f0a9061334f565b6003546040516309eecdd760e01b815260ff8e166004820152602481018d9052604481018c90526001600160a01b03909116906309eecdd790606401602060405180830381865afa158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c919061338a565b6125625760405162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b6044820152606401610f0a565b600061257a6125708c6129c8565b61211c848d6129dd565b12156125b95760405162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b6044820152606401610f0a565b6003835460ff1660038111156125d1576125d1613069565b1480156125ee5750825463ffffffff8e8116600160901b90920416145b1561260a57600483018790556126058385876129f5565b611caf565b6001835460ff16600381111561262257612622613069565b148061265e57506003835460ff16600381111561264157612641613069565b14801561265e5750825463ffffffff808f16600160901b90920416105b156122ee578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611caf565b6000611e4782846133ac565b60008082121561274957612749613374565b5090565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a9160048083019260209291908290030181865afa158015612797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127bb9190613263565b6127c490613332565b845490915061010090046001600160801b03166127e081613332565b8212156127f3576127f081613332565b91505b61176b858560008660038761287a565b60408051602080820189905230606081811b6bffffffffffffffffffffffff1990811685870152908a901b166054840152606883018890526088830187905260a88084018790528451808503909101815260c89093019093528151910120600954610bfe90829085906001600160a01b03166128fd565b855460ff1916865560075461289090600161272b565b60075585546128af90849061010090046001600160801b031683612ae7565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de58684866040516128ed939291906133c3565b60405180910390a3505050505050565b600080600061290b85612c53565b92509250925060006001878386866040516000815260200160405260405161294f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612971573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b031614611a5c5760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b6000600160ff1b821061274957612749613374565b6000611e4782846133ee565b6000611e47828461342f565b600380548454600186015460028701549387015460058801546004808a0154604051631503b1e760e11b8152600160881b870460ff16928101929092526024820194909452604481019690965260648601919091526101009092046001600160801b0316608485015260a484019190915260c48301526000916001600160a01b0390911690632a0763ce9060e401602060405180830381865afa158015612aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac49190613263565b84549091506110c89085908590600160901b900463ffffffff168560038661287a565b6000826001600160801b031690506000612b02600b546129c8565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7b9190613263565b831315612b8a57612b8a613374565b6000612b9683856129dd565b1215612ba457612ba4613374565b600083138015612bb357508281125b15612bbc578092505b600c54612bc990846129e9565b600c556000612bd882856129e9565b9050612be381612737565b600b556000612bfa612bf585876129dd565b612737565b6001600160a01b038816600090815260126020526040812080549293508392909190612c279084906132b6565b90915550506001600160a01b03871660009081526012602052604090205415611a5c57611a5c87612cc6565b60008060008351604114612c935760405162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b6044820152606401610f0a565b50505060208101516040820151604183015160ff166002811015612cbf57612cbc81601b61346e565b90505b9193909250565b6001600160a01b03811660009081526012602052604090205480612cec57612cec613374565b6001600160a01b0382166000818152601260205260408082208290555183156108fc0291849190818181858888f115159350610b4192505050576001600160a01b0391909116600090815260126020526040902055565b6001600160a01b0381168114612d5857600080fd5b50565b600060208284031215612d6d57600080fd5b8135611e4781612d43565b600060208284031215612d8a57600080fd5b5035919050565b803563ffffffff81168114612da557600080fd5b919050565b8035612da581612d43565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ddc57600080fd5b813567ffffffffffffffff80821115612df757612df7612db5565b604051601f8301601f19908116603f01168101908282118183101715612e1f57612e1f612db5565b81604052838152866020858801011115612e3857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b031215612e7557600080fd5b612e7e89612d91565b97506020890135965060408901359550606089013594506080890135935060a0890135612eaa81612d43565b925060c0890135612eba81612d43565b915060e089013567ffffffffffffffff811115612ed657600080fd5b612ee28b828c01612dcb565b9150509295985092959890939650565b803560ff81168114612da557600080fd5b6000806000806000806000806000806000806101808d8f031215612f2657600080fd5b612f2f8d612d91565b9b50612f3d60208e01612ef2565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d0135955060e08d0135945067ffffffffffffffff6101008e01351115612f8357600080fd5b612f948e6101008f01358f01612dcb565b9350612fa36101208e01612daa565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000806000806000806000806101408b8d031215612fe557600080fd5b612fee8b612d91565b9950612ffc60208c01612ef2565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013567ffffffffffffffff81111561304357600080fd5b61304f8d828e01612dcb565b9250506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b60048110612d5857634e487b7160e01b600052602160045260246000fd5b61014081016130ab8c61307f565b9a81526001600160801b039990991660208a015260ff97909716604089015263ffffffff959095166060880152608087019390935260a086019190915260c085015260e08401526101008301526101209091015290565b6000806040838503121561311557600080fd5b823561312081612d43565b946020939093013593505050565b600080600080600060a0868803121561314657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561317957600080fd5b61318588828901612dcb565b9150509295509295909350565b80356001600160801b0381168114612da557600080fd5b600080604083850312156131bc57600080fd5b6131c583613192565b91506131d360208401613192565b90509250929050565b600080600080600080600060e0888a0312156131f757600080fd5b61320088612d91565b96506020880135955060408801359450606088013593506080880135925060a088013561322c81612d43565b915060c088013567ffffffffffffffff81111561324857600080fd5b6132548a828b01612dcb565b91505092959891949750929550565b60006020828403121561327557600080fd5b5051919050565b6020808252600a90820152691a5b9d8819d85b59525960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132c9576132c96132a0565b500190565b60006000198214156132e2576132e26132a0565b5060010190565b6020808252600a9082015269696e762073746174757360b01b604082015260600190565b6020808252600b908201526a1a5b9d881c9bdd5b99125960aa1b604082015260600190565b6000600160ff1b821415613348576133486132a0565b5060000390565b6020808252600b908201526a696e762062616c616e636560a81b604082015260600190565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561339c57600080fd5b81518015158114611e4757600080fd5b6000828210156133be576133be6132a0565b500390565b63ffffffff8416815260208101839052606081016133e08361307f565b826040830152949350505050565b600080821280156001600160ff1b0384900385131615613410576134106132a0565b600160ff1b8390038412811615613429576134296132a0565b50500190565b60008083128015600160ff1b85018412161561344d5761344d6132a0565b6001600160ff1b0384018313811615613468576134686132a0565b50500390565b600060ff821660ff84168060ff0382111561348b5761348b6132a0565b01939250505056fea264697066735822122079c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e800000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3
-----Decoded View---------------
Arg [0] : _serverAddress (address): 0x437EC7503dFF1b5F5Ab4Dab4455C45a270629f4d
Arg [1] : _minStake (uint128): 10000000000000000
Arg [2] : _maxStake (uint128): 30000000000000000000
Arg [3] : _conflictResAddress (address): 0xE48424356e1B5057b067FDd15dA2c939837608e8
Arg [4] : _houseAddress (address): 0x71BE1aCe87248F3950BdFc4c89b4B3EED059f6f3
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000437ec7503dff1b5f5ab4dab4455c45a270629f4d
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 000000000000000000000000000000000000000000000001a055690d9db80000
Arg [3] : 000000000000000000000000e48424356e1b5057b067fdd15da2c939837608e8
Arg [4] : 00000000000000000000000071be1ace87248f3950bdfc4c89b4b3eed059f6f3
Deployed Bytecode Sourcemap
157:7184:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2357:31:5;;;;;;;;;;;;;;;;;;;160:25:12;;;148:2;133:18;2357:31:5;;;;;;;;744:113:0;;;;;;;;;;;;;:::i;:::-;;253:29;;;;;;;;;;-1:-1:-1;253:29:0;;;;-1:-1:-1;;;253:29:0;;;;;;;;;361:14:12;;354:22;336:41;;324:2;309:18;253:29:0;196:187:12;1815:51:5;;;;;;;;;;;;1860:6;1815:51;;3530:43;;;;;;;;;;-1:-1:-1;3530:43:5;;;;;:::i;:::-;;;;;;;;;;;;;;3631:47;;;;;;;;;;-1:-1:-1;3631:47:5;;;;;:::i;:::-;;;;;;;;;;;;;;6605:149;;;;;;;;;;-1:-1:-1;6605:149:5;;;;;:::i;:::-;;:::i;3237:44::-;;;;;;;;;;;;;;;;3050:23;;;;;;;;;;-1:-1:-1;3050:23:5;;;;-1:-1:-1;;;;;3050:23:5;;;;;;-1:-1:-1;;;;;1307:47:12;;;1289:66;;1277:2;1262:18;3050:23:5;1143:218:12;6817:212:5;;;;;;;;;;;;;:::i;1455:143:9:-;;;;;;;;;;;;;:::i;3353:697:4:-;;;;;;;;;;-1:-1:-1;3353:697:4;;;;;:::i;:::-;;:::i;3340:39:5:-;;;;;;;;;;;;;;;;2155:195;;;;;;;;;;;;2194:156;2155:195;;1350:181:8;;;;;;;;;;;;;:::i;7974:105:5:-;;;:::i;654:41:2:-;;;;;;;;;;;;689:6;654:41;;395:40:9;;;;;;;;;;;;;;;;299:46:2;;;;;;;;;;-1:-1:-1;299:46:2;;;;-1:-1:-1;;;;;299:46:2;;;;;;-1:-1:-1;;;;;3692:32:12;;;3674:51;;3662:2;3647:18;299:46:2;3493:238:12;328:25:9;;;;;;;;;;-1:-1:-1;328:25:9;;;;-1:-1:-1;;;328:25:9;;;;;;1701:1057:6;;;;;;;;;;-1:-1:-1;1701:1057:6;;;;;:::i;:::-;;:::i;3331:841::-;;;;;;;;;;-1:-1:-1;3331:841:6;;;;;:::i;:::-;;:::i;8135:387:5:-;;;;;;;;;;-1:-1:-1;8135:387:5;;;;;:::i;:::-;;:::i;423:114:3:-;;;;;;;;;;;;;:::i;3427:40:5:-;;;;;;;;;;-1:-1:-1;3427:40:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3427:40:5;;-1:-1:-1;;;3427:40:5;;;;;;-1:-1:-1;;;3427:40:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1189:141:9:-;;;;;;;;;;;;;:::i;8589:203:5:-;;;;;;;;;;;;;:::i;2945:26::-;;;;;;;;;;;;;;;;186:20:8;;;;;;;;;;-1:-1:-1;186:20:8;;;;-1:-1:-1;;;;;186:20:8;;;1929:55:5;;;;;;;;;;;;1973:11;1929:55;;4352:677:6;;;;;;;;;;-1:-1:-1;4352:677:6;;;;;:::i;:::-;;:::i;7680:226:5:-;;;;;;;;;;-1:-1:-1;7680:226:5;;;;;:::i;:::-;;:::i;1842:441:2:-;;;;;;;;;;;;;:::i;399:42::-;;;;;;;;;;-1:-1:-1;399:42:2;;;;-1:-1:-1;;;;;399:42:2;;;5242:665:6;;;;;;;;;;-1:-1:-1;5242:665:6;;;;;:::i;:::-;;:::i;1373:1249:4:-;;;;;;:::i;:::-;;:::i;7126:668:6:-;;;;;;;;;;-1:-1:-1;7126:668:6;;;;;:::i;:::-;;:::i;296:46:3:-;;;;;;;;;;;;335:7;296:46;;1991:157:5;;;;;;;;;;;;2039:109;1991:157;;2858:26;;;;;;;;;;;;;;;;1521:246:2;;;;;;;;;;-1:-1:-1;1521:246:2;;;;;:::i;:::-;;:::i;6114:840:6:-;;;;;;;;;;-1:-1:-1;6114:840:6;;;;;:::i;:::-;;:::i;9147:267:5:-;;;;;;;;;;-1:-1:-1;9147:267:5;;;;;:::i;:::-;;:::i;2782:35::-;;;;;;;;;;-1:-1:-1;2782:35:5;;;;-1:-1:-1;;;;;2782:35:5;;;2703:28;;;;;;;;;;-1:-1:-1;2703:28:5;;;;-1:-1:-1;;;;;2703:28:5;;;524:26:2;;;;;;;;;;;;;;;;799:41;;;;;;;;;;;;834:6;799:41;;212:27:8;;;;;;;;;;-1:-1:-1;212:27:8;;;;-1:-1:-1;;;;;212:27:8;;;2438::5;;;;;;;;;;;;;;;;4592:650:4;;;;;;;;;;-1:-1:-1;4592:650:4;;;;;:::i;:::-;;:::i;3147:23:5:-;;;;;;;;;;-1:-1:-1;3147:23:5;;;;-1:-1:-1;;;3147:23:5;;-1:-1:-1;;;;;3147:23:5;;;8896:118;;;;;;;;;;-1:-1:-1;8896:118:5;;;;;:::i;:::-;;:::i;1107:174:8:-;;;;;;;;;;-1:-1:-1;1107:174:8;;;;;:::i;:::-;;:::i;2613:26:5:-;;;;;;;;;;;;;;;;7105:510;;;;;;;;;;;;;:::i;744:113:0:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;631:9:0::1;::::0;-1:-1:-1;;;631:9:0;::::1;;;630:10;622:19;;;::::0;::::1;;820:4:::2;808:16:::0;;-1:-1:-1;;;;808:16:0::2;-1:-1:-1::0;;;808:16:0::2;::::0;;839:11:::2;::::0;::::2;::::0;808:16;;839:11:::2;744:113::o:0;6605:149:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;631:9:0::1;::::0;-1:-1:-1;;;631:9:0;::::1;;;630:10;622:19;;;::::0;::::1;;6711:1:5::2;6698:10;;:14;6690:23;;;::::0;::::2;;6723:10;:24:::0;6605:149::o;6817:212::-;6887:10;6854:15;6872:26;;;:14;:26;;;;;;6916:14;6908:23;;;;;;6957:10;6971:1;6942:26;;;:14;:26;;;;;;:30;;;6982:40;;;;;;7011:10;;6982:40;;6971:1;6982:40;7011:10;6957;6982:40;;;;;;;;;;;;;;;;;;;;;6844:185;6817:212::o;1455:143:9:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;713:6:9::1;::::0;-1:-1:-1;;;713:6:9;::::1;;;705:15;;;::::0;::::1;;472:9:0::2;::::0;-1:-1:-1;;;472:9:0;::::2;;;464:18;;;::::0;::::2;;1526:6:9::3;:14:::0;;-1:-1:-1;;;;1526:14:9::3;::::0;;1535:5:::3;1550:10;:14:::0;;;1579:12:::3;::::0;::::3;::::0;1535:5;1579:12:::3;1455:143::o:0;3353:697:4:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;3658:299:4::1;3685:8;3711:1;3730::::0;3749::::1;3768:8;3794:11;3823:9;3850:7;3875:16;3909:8;3935:12;3658:9;:299::i;:::-;3968:75;3983:12;3997:8;4007;4017:7;4026:16;3968:14;:75::i;:::-;3353:697:::0;;;;;;;;:::o;1350:181:8:-;766:12;;-1:-1:-1;;;;;766:12:8;752:10;:26;744:35;;;;;;1418:12:::1;::::0;;::::1;1410:20:::0;;-1:-1:-1;;;;;1418:12:8;::::1;-1:-1:-1::0;;;;;;1410:20:8;;::::1;::::0;::::1;::::0;;1440:25;::::1;::::0;;;1480:44:::1;::::0;::::1;::::0;1418:12;;1480:44:::1;1350:181::o:0;7974:105:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8047:10:5::1;::::0;:25:::1;::::0;8062:9:::1;8047:14;:25::i;:::-;8034:10;:38:::0;7974:105::o;1701:1057:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;2101:312:6::1;2128:8;2154:9;2181:4;2203:6;2227:8;2253:11;2282:9;2309:7;2342:4;2365:8;2391:12;2101:9;:312::i;:::-;2424:327;2467:8;2493:9;2520:4;2542:6;2566:8;2592:11;2621:9;2648:11;2677:9;2704:7;2729:12;2424:25;:327::i;:::-;1701:1057:::0;;;;;;;;;;;;:::o;3331:841::-;3645:271;3668:8;3690:9;3713:4;3731:6;3751:8;3773:11;3798:9;3821:7;3850:4;3869:10;3893:13;;;;;;;;;-1:-1:-1;;;;;3893:13:6;3645:9;:271::i;:::-;3927:238;3964:8;3986:9;4009:4;4027:6;4047:8;4069:9;4092;4115:7;4144:10;3927:23;:238::i;:::-;3331:841;;;;;;;;;;:::o;8135:387:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8223:11:5::1;::::0;8249::::1;::::0;8223:38:::1;::::0;-1:-1:-1;;;8223:38:5;;::::1;::::0;::::1;160:25:12::0;;;;8202:18:5::1;::::0;-1:-1:-1;;;;;8223:11:5::1;::::0;:25:::1;::::0;133:18:12;;8223:38:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8202:59;;8289:10;;8280:5;:19;;:61;;;;-1:-1:-1::0;8303:10:5::1;::::0;8328:13;;8303:21:::1;::::0;8318:5;8303:14:::1;:21::i;:::-;:38;;8280:61;8272:70;;;::::0;::::1;;8375:1;8360:11;;:16;;:69;;;-1:-1:-1::0;8408:10:5::1;::::0;:21:::1;::::0;8423:5;8408:14:::1;:21::i;:::-;8380:24;:11;;:22;:24::i;:::-;:49;;8360:69;8352:78;;;::::0;::::1;;8454:10;::::0;:21:::1;::::0;8469:5;8454:14:::1;:21::i;:::-;8441:10;:34:::0;8493:5:::1;::::0;;8485:30:::1;::::0;-1:-1:-1;;;;;8493:5:5;;::::1;::::0;8485:30;::::1;;;::::0;8509:5;;8485:30;8493:5;8485:30;8509:5;8493;8485:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8192:330;8135:387:::0;:::o;423:114:3:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;894:6:9::1;::::0;335:7:3::1;::::0;-1:-1:-1;;;894:6:9;::::1;;;:55:::0;::::1;;;-1:-1:-1::0;905:10:9::1;::::0;933:15:::1;::::0;905:24:::1;::::0;920:8;905:14:::1;:24::i;:::-;:43;;894:55;886:64;;;::::0;::::1;;523:5:3::2;::::0;-1:-1:-1;;;;;523:5:3::2;502:28;1189:141:9::0;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;561:6:9::1;::::0;-1:-1:-1;;;561:6:9;::::1;;;560:7;552:26;;;::::0;-1:-1:-1;;;552:26:9;;10711:2:12;552:26:9::1;::::0;::::1;10693:21:12::0;10750:1;10730:18;;;10723:29;-1:-1:-1;;;10768:18:12;;;10761:36;10814:18;;552:26:9::1;;;;;;;;;1256:4:::2;1247:13:::0;;-1:-1:-1;;;;1247:13:9::2;-1:-1:-1::0;;;1247:13:9::2;::::0;;1283:15:::2;1270:10;:28:::0;1313:10:::2;::::0;::::2;::::0;1247:13;;1313:10:::2;1189:141::o:0;8589:203:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;894:6:9::1;::::0;8645::5::1;::::0;-1:-1:-1;;;894:6:9;::::1;;;:55:::0;::::1;;;-1:-1:-1::0;905:10:9::1;::::0;933:15:::1;::::0;905:24:::1;::::0;920:8;905:14:::1;:24::i;:::-;:43;;894:55;886:64;;;::::0;::::1;;8677:1:5::2;8663:11;:15:::0;;;8706:10:::2;::::0;;8726:14;;;;8758:5;;8750:35:::2;::::0;8706:10;;-1:-1:-1;;;;;8758:5:5;;::::2;::::0;8750:35;::::2;;;::::0;8706:10;;8750:35;;8677:1;8750:35;8706:10;8758:5;8750:35;::::2;;;;;;;;;;;;;::::0;::::2;;;;4352:677:6::0;4451:10;4413:27;4486:23;;;:10;:23;;;;;;;;;4539:18;;;:10;:18;;;;;;4576:17;;;4568:40;;;;-1:-1:-1;;;4568:40:6;;;;;;;:::i;:::-;4638:17;4623:11;;;;:32;;;;;;;;:::i;:::-;;4619:404;;;4695:15;4671:21;;;:39;4724:43;;-1:-1:-1;;4724:43:6;4738:29;4724:43;;;4787:39;;4819:6;;4807:10;;4787:39;;-1:-1:-1;;4787:39:6;4619:404;;;4862:31;4847:11;;;;:46;;;;;;;;:::i;:::-;;:67;;;;-1:-1:-1;4897:12:6;;-1:-1:-1;;;4897:12:6;;;;:17;4847:67;4843:180;;;4930:43;4947:4;4953:6;4961:11;4930:16;:43::i;:::-;4403:626;;;4352:677;:::o;7680:226:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;7812:23:5::1;1860:6;4487:15;:40;;:99;;;;;1973:11;4547:15;:39;;4487:99;4479:108;;;::::0;::::1;;-1:-1:-1::0;7851:22:5::2;:48:::0;7680:226::o;1842:441:2:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1915:14:2::1;::::0;-1:-1:-1;;;;;1915:14:2::1;1907:37;;;::::0;::::1;;1962:10;::::0;1954:24:::1;;;::::0;::::1;;2024:15;689:6;1996:10;;:24;;;;:::i;:::-;:43;;:90;;;;;834:6;2062:10;;:24;;;;:::i;:::-;2043:15;:43;;1996:90;1988:99;;;::::0;::::1;;2140:14;::::0;;2098:11:::1;:57:::0;;-1:-1:-1;;;;;2140:14:2;::::1;-1:-1:-1::0;;;;;;2098:57:2;;::::1;;::::0;;;2165:27:::1;::::0;;-1:-1:-1;2202:10:2::1;:14:::0;;;2232:44:::1;::::0;3674:51:12;;;2232:44:2::1;::::0;3662:2:12;3647:18;2232:44:2::1;;;;;;;1842:441::o:0;5242:665:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;-1:-1:-1;;;;;5360:24:6;::::1;5346:11;5360:24:::0;;;:10:::1;:24;::::0;;;;;;;;5414:18;;;:10:::1;:18:::0;;;;;;5451:17;;::::1;5443:40;;;;-1:-1:-1::0;;;5443:40:6::1;;;;;;;:::i;:::-;5513:17;5498:11:::0;;::::1;;:32;::::0;::::1;;;;;;:::i;:::-;;5494:407;;;5570:15;5546:21;::::0;::::1;:39:::0;5599:45;;-1:-1:-1;;5599:45:6::1;5613:31;5599:45;::::0;;5664:41:::1;::::0;5698:6;;5686:10:::1;::::0;5664:41:::1;::::0;-1:-1:-1;;5664:41:6::1;5494:407;;;5741:29;5726:11:::0;;::::1;;:44;::::0;::::1;;;;;;:::i;:::-;;:65;;;;-1:-1:-1::0;5774:12:6;;-1:-1:-1;;;5774:12:6;::::1;;;:17:::0;5726:65:::1;5722:179;;;5807:44;5824:4;5830:6;5838:12;5807:16;:44::i;1373:1249:4:-:0;4097:8:5;;4109:9;-1:-1:-1;;;;;4097:8:5;;;:21;;;;:46;;-1:-1:-1;4135:8:5;;-1:-1:-1;;;4135:8:5;;-1:-1:-1;;;;;4135:8:5;4122:9;:21;;4097:46;4089:68;;;;-1:-1:-1;;;4089:68:5;;11649:2:12;4089:68:5;;;11631:21:12;11688:1;11668:18;;;11661:29;-1:-1:-1;;;11706:18:12;;;11699:39;11755:18;;4089:68:5;11447:332:12;4089:68:5;1634:11:4::1;::::0;:15:::1;::::0;1648:1:::1;1634:15;:::i;:::-;3847:11:5;::::0;:39:::1;::::0;-1:-1:-1;;;3847:39:5;;::::1;::::0;::::1;160:25:12::0;;;3826:18:5::1;::::0;-1:-1:-1;;;;;3847:11:5::1;::::0;:25:::1;::::0;133:18:12;;3847:39:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3826:60;;3918:13;3904:10;;:27;;3896:54;;;::::0;-1:-1:-1;;;3896:54:5;;11986:2:12;3896:54:5::1;::::0;::::1;11968:21:12::0;12025:2;12005:18;;;11998:30;-1:-1:-1;;;12044:18:12;;;12037:44;12098:18;;3896:54:5::1;11784:338:12::0;3896:54:5::1;561:6:9::2;::::0;-1:-1:-1;;;561:6:9;::::2;;;560:7;552:26;;;::::0;-1:-1:-1;;;552:26:9;;10711:2:12;552:26:9::2;::::0;::::2;10693:21:12::0;10750:1;10730:18;;;10723:29;-1:-1:-1;;;10768:18:12;;;10761:36;10814:18;;552:26:9::2;10509:329:12::0;552:26:9::2;1720:10:4::3;1687:19;1709:22:::0;;;:10:::3;:22;::::0;;;;;;;;1761:26;;;:10:::3;:26:::0;;;;;1709:22;;1806:11;;::::3;;:31;::::0;::::3;;;;;;:::i;:::-;;1798:63;;;::::0;-1:-1:-1;;;1798:63:4;;12329:2:12;1798:63:4::3;::::0;::::3;12311:21:12::0;12368:2;12348:18;;;12341:30;-1:-1:-1;;;12387:18:12;;;12380:49;12446:18;;1798:63:4::3;12127:343:12::0;1798:63:4::3;1897:15;1879:14;:33;1871:64;;;::::0;-1:-1:-1;;;1871:64:4;;12677:2:12;1871:64:4::3;::::0;::::3;12659:21:12::0;12716:2;12696:18;;;12689:30;-1:-1:-1;;;12735:18:12;;;12728:48;12793:18;;1871:64:4::3;12475:342:12::0;1871:64:4::3;1971:13;1953:15;:31;1945:51;;;::::0;-1:-1:-1;;;1945:51:4;;13024:2:12;1945:51:4::3;::::0;::::3;13006:21:12::0;13063:1;13043:18;;;13036:29;-1:-1:-1;;;13081:18:12;;;13074:37;13128:18;;1945:51:4::3;12822:330:12::0;1945:51:4::3;2007:102;2023:13;2038:10;2050:15;2067:13;2082:14;2098:10;2007:15;:102::i;:::-;2134:10;:12:::0;;2120:11:::3;::::0;;2134:12:::3;::::0;::::3;:::i;:::-;::::0;;;-1:-1:-1;2167:10:4::3;2156:22;::::0;;;:10:::3;:22;::::0;;;;;;;:31;;;2220:18;;;:10:::3;:18:::0;;;;;2249:34;;-1:-1:-1;;2361:34:4;-1:-1:-1;;2249:34:4::3;2273:9;-1:-1:-1::0;;;;;2249:34:4::3;;2361::::0;;-1:-1:-1;2361:34:4;;::::3;::::0;;2420:11:::3;::::0;2156:31;;-1:-1:-1;2220:18:4;;2420::::3;::::0;:15:::3;:18::i;:::-;2406:11;:32:::0;2530:85:::3;::::0;;-1:-1:-1;;;;;2573:9:4::3;13489:47:12::0;13471:66;;13568:2;13553:18;;13546:34;;;2585:14:4;;2557:6;;2545:10:::3;::::0;2530:85:::3;::::0;13444:18:12;2530:85:4::3;;;;;;;1677:945;;;;3816:152:5::1;4167:1;1373:1249:4::0;;;;;:::o;7126:668:6:-;7221:10;7183:27;7256:23;;;:10;:23;;;;;;;;;7309:18;;;:10;:18;;;;;;7346:17;;;7338:40;;;;-1:-1:-1;;;7338:40:6;;;;;;;:::i;:::-;7411:29;7396:11;;;;:44;;;;;;;;:::i;:::-;;7388:67;;;;-1:-1:-1;;;7388:67:6;;;;;;;:::i;:::-;7483:11;;;7525:13;;7483:11;7552;;;7577:13;;;;7604:12;;;;7654:21;;;;7483:202;;-1:-1:-1;;;7483:202:6;;-1:-1:-1;;;7525:13:6;;;;7483:202;;;14211:36:12;14263:18;;;14256:34;;;;14306:18;;;14299:34;;;;14349:18;;;14342:34;7483:11:6;7630:10;;;-1:-1:-1;;;;;7630:10:6;14392:19:12;;;14385:76;14477:19;;;14470:35;;;;7466:14:6;;-1:-1:-1;;;;;7483:11:6;;;;:28;;14183:19:12;;7483:202:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7720:12;;7466:219;;-1:-1:-1;7696:91:6;;7720:12;;7712:6;;-1:-1:-1;;;7720:12:6;;;;7734:11;7747:27;7466:219;7696:9;:91::i;:::-;7173:621;;;;7126:668;:::o;1521:246:2:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1614:14:2::1;:39:::0;;-1:-1:-1;;;;;;1614:39:2::1;-1:-1:-1::0;;;;;1614:39:2;::::1;::::0;;::::1;::::0;;;1676:15:::1;1663:10;:28:::0;1707:53:::1;::::0;3674:51:12;;;1707:53:2::1;::::0;3662:2:12;3647:18;1707:53:2::1;;;;;;;1521:246:::0;:::o;6114:840:6:-;4301:13:5;;-1:-1:-1;;;;;4301:13:5;4287:10;:27;4279:36;;;;;;-1:-1:-1;;;;;6228:24:6;::::1;6214:11;6228:24:::0;;;:10:::1;:24;::::0;;;;;;;;6282:18;;;:10:::1;:18:::0;;;;;;6319:17;;::::1;6311:40;;;;-1:-1:-1::0;;;6311:40:6::1;;;;;;;:::i;:::-;6384:31;6369:11:::0;;::::1;;:46;::::0;::::1;;;;;;:::i;:::-;;6361:69;;;;-1:-1:-1::0;;;6361:69:6::1;;;;;;;:::i;:::-;6582:11;::::0;;6626:13;;6582:11;6653;::::1;::::0;6678:13:::1;::::0;::::1;::::0;6705:12;;::::1;::::0;6755:15:::1;::::0;::::1;::::0;6784:13:::1;::::0;;::::1;::::0;6811:21:::1;::::0;::::1;::::0;6582:260:::1;::::0;-1:-1:-1;;;6582:260:6;;-1:-1:-1;;;6626:13:6;::::1;;;6582:260:::0;;::::1;15041:36:12::0;;;;15093:18;;;15086:34;;;;15136:18;;;15129:34;;;;15179:18;;;15172:34;;;;6582:11:6::1;6731:10:::0;;::::1;-1:-1:-1::0;;;;;6731:10:6::1;15222:19:12::0;;;15215:76;15307:19;;;15300:35;;;;15351:19;;;15344:35;;;;15395:19;;;15388:35;;;;6565:14:6::1;::::0;-1:-1:-1;;;;;6582:11:6;;::::1;::::0;:30:::1;::::0;15013:19:12;;6582:260:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6877:12:::0;;6565:277;;-1:-1:-1;6853:94:6::1;::::0;6877:12;;6869:6;;-1:-1:-1;;;6877:12:6;::::1;;;6891::::0;6905:29:::1;6565:277:::0;6853:9:::1;:94::i;9147:267:5:-:0;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;9262:1:5::1;9250:9;-1:-1:-1::0;;;;;9250:13:5::1;;:39;;;;;9280:9;-1:-1:-1::0;;;;;9267:22:5::1;:9;-1:-1:-1::0;;;;;9267:22:5::1;;;9250:39;9242:48;;;::::0;::::1;;-1:-1:-1::0;;;;;9300:20:5;;::::1;-1:-1:-1::0;;;9330:20:5;;::::1;::::0;::::1;::::0;;::::1;9300:8;9330:20:::0;;;9365:42:::1;::::0;;9388:8;;;;;;15661:34:12;;9398:8:5;;;::::1;::::0;;::::1;15726:2:12::0;15711:18;;15704:43;9365:42:5::1;::::0;15581:18:12;9365:42:5::1;;;;;;;9147:267:::0;;:::o;4592:650:4:-;4840:302;4867:8;4893:1;4912;4931;4950:8;4976:11;5005:9;5032:7;5057:16;5091:10;5119:13;;;;;;;;;-1:-1:-1;;;;;5119:13:4;4840:9;:302::i;:::-;5153:82;5176:10;5189:8;5199;5209:7;5218:16;5153:14;:82::i;:::-;4592:650;;;;;;;:::o;8896:118:5:-;578:5:8;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;8979:12:5::1;:28:::0;;-1:-1:-1;;;;;;8979:28:5::1;-1:-1:-1::0;;;;;8979:28:5;;;::::1;::::0;;;::::1;::::0;;8896:118::o;1107:174:8:-;578:5;;-1:-1:-1;;;;;578:5:8;564:10;:19;556:28;;;;;;1188:12:::1;:24:::0;;-1:-1:-1;;;;;;1188:24:8::1;-1:-1:-1::0;;;;;1188:24:8;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1257:5:8;;1227:47:::1;::::0;1188:24;;1257:5:::1;::::0;1227:47:::1;::::0;-1:-1:-1;1227:47:8::1;1107:174:::0;:::o;7105:510:5:-;7222:15;7163:55;7195:22;;7163:27;;:31;;:55;;;;:::i;:::-;:74;;7155:83;;;;;;7321:15;7291:27;:45;7351:11;;7366:1;-1:-1:-1;7347:90:5;;7105:510::o;7347:90::-;7447:15;7465:24;:11;;:22;:24::i;:::-;7514:1;7500:11;:15;7538:10;;7447:42;;-1:-1:-1;7538:26:5;;7447:42;7538:14;:26::i;:::-;7525:10;:39;7575:12;;:33;;-1:-1:-1;;;;;7575:12:5;;;;:33;;;;;7597:10;;7575:12;:33;:12;:33;7597:10;7575:12;:33;;;;;;;;;;;;;;;;;;;11842:875;12271:4;-1:-1:-1;;;;;12294:35:5;;;;12286:67;;;;-1:-1:-1;;;12286:67:5;;15960:2:12;12286:67:5;;;15942:21:12;15999:2;15979:18;;;15972:30;-1:-1:-1;;;16018:18:12;;;16011:49;16077:18;;12286:67:5;15758:343:12;12286:67:5;13715:220;;;2194:156;13715:220;;;;21394:25:12;;;;21467:10;21455:23;;21435:18;;;21428:51;21527:4;21515:17;;21495:18;;;21488:45;21549:18;;;21542:34;;;21592:19;;;21585:35;;;21636:19;;;21629:35;;;21680:19;;;21673:35;;;21724:19;;;21717:35;;;21768:19;;;;21761:35;;;13715:220:5;;;;;;;;;;21366:19:12;;;13715:220:5;;13705:231;;;;;;14018:16;;-1:-1:-1;;;13964:101:5;;;22065:27:12;22108:11;;;22101:27;22144:12;;;;22137:28;;;;13964:101:5;;;;;;;;;;22181:12:12;;;;13964:101:5;;;13954:112;;;;;12619:91;12643:9;12670:4;12692:8;12619:6;:91::i;:::-;12178:539;;11842:875;;;;;;;;;;;:::o;6501:838:4:-;-1:-1:-1;;;;;6716:24:4;;;6702:11;6716:24;;;:10;:24;;;;;;;;;6770:18;;;:10;:18;;;;;6815:11;;:24;;-1:-1:-1;;;6815:24:4;;;;6716;;6770:18;;6702:11;6815;;;:22;;:24;;;;;6716;6815;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6874:10;;6798:41;;-1:-1:-1;6874:10:4;;;-1:-1:-1;;;;;6874:10:4;6905:17;;;6897:40;;;;-1:-1:-1;;;6897:40:4;;;;;;;:::i;:::-;6966:1;6955:8;:12;;;6947:36;;;;-1:-1:-1;;;6947:36:4;;;;;;;:::i;:::-;7070:8;7056:10;7057:9;7056:10;:::i;:::-;:22;;:48;;;;;7094:10;7082:8;:22;;7056:48;7048:72;;;;-1:-1:-1;;;7048:72:4;;;;;;;:::i;:::-;7153:17;7138:11;;;;:32;;;;;;;;:::i;:::-;;7130:55;;;;-1:-1:-1;;;7130:55:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;7203:33:4;;7231:4;7203:33;7196:41;;;;:::i;:::-;7248:84;7258:4;7264:6;7272:8;7282:12;7296:25;7323:8;7248:9;:84::i;:::-;6692:647;;;;6501:838;;;;;:::o;1468:98:11:-;1526:9;1554:5;1558:1;1554;:5;:::i;:::-;1547:12;1468:98;-1:-1:-1;;;1468:98:11:o;10975:1979:6:-;-1:-1:-1;;;;;11344:24:6;;;11330:11;11344:24;;;:10;:24;;;;;;;;;11398:18;;;:10;:18;;;;;11443:11;;:24;;-1:-1:-1;;;11443:24:6;;;;11344;;11398:18;;11330:11;11443;;;:22;;:24;;;;;11344;11443;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11502:10;;11426:41;;-1:-1:-1;11502:10:6;;;-1:-1:-1;;;;;11502:10:6;11533:17;;;11525:40;;;;-1:-1:-1;;;11525:40:6;;;;;;;:::i;:::-;11594:1;11583:8;:12;;;11575:36;;;;-1:-1:-1;;;11575:36:6;;;;;;;:::i;:::-;11673:11;11656;11639:29;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;11639:29:6;;;;;;;;;;;;;11629:40;;;;;;:55;11621:82;;;;-1:-1:-1;;;11621:82:6;;17448:2:12;11621:82:6;;;17430:21:12;17487:2;17467:18;;;17460:30;-1:-1:-1;;;17506:18:12;;;17499:44;17560:18;;11621:82:6;17246:338:12;11621:82:6;11763:9;11748;11731:27;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;11731:27:6;;;;;;;;;;;;;11721:38;;;;;;:51;11713:76;;;;-1:-1:-1;;;11713:76:6;;17791:2:12;11713:76:6;;;17773:21:12;17830:2;17810:18;;;17803:30;-1:-1:-1;;;17849:18:12;;;17842:42;17901:18;;11713:76:6;17589:336:12;11713:76:6;11821:8;11807:10;11808:9;11807:10;:::i;:::-;:22;;:48;;;;;11845:10;11833:8;:22;;11807:48;11799:72;;;;-1:-1:-1;;;11799:72:6;;;;;;;:::i;:::-;11927:11;;;;;;;;;-1:-1:-1;;;;;11927:11:6;-1:-1:-1;;;;;11927:22:6;;11950:9;11961:4;11967:6;11927:47;;;;;;;;;;;;;;;;18158:4:12;18146:17;;;;18128:36;;18195:2;18180:18;;18173:34;;;;18238:2;18223:18;;18216:34;18116:2;18101:18;;17930:326;11927:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11919:67;;;;-1:-1:-1;;;11919:67:6;;18745:2:12;11919:67:6;;;18727:21:12;18784:1;18764:18;;;18757:29;-1:-1:-1;;;18802:18:12;;;18795:37;18849:18;;11919:67:6;18543:330:12;11919:67:6;12055:1;12004:47;12032:18;:6;:16;:18::i;:::-;12004:23;:9;12018:8;12004:13;:23::i;:::-;:27;;:47::i;:::-;:52;;11996:79;;;;-1:-1:-1;;;11996:79:6;;19080:2:12;11996:79:6;;;19062:21:12;19119:2;19099:18;;;19092:30;-1:-1:-1;;;19138:18:12;;;19131:44;19192:18;;11996:79:6;18878:338:12;11996:79:6;12142:29;12127:11;;;;:44;;;;;;;;:::i;:::-;;:72;;;;;12191:8;12175:24;;:4;:12;;;;;;;;;;;;:24;;;12127:72;12123:825;;;12215:15;;;:29;;;12258:43;12215:4;12280:6;12288:12;12258:15;:43::i;:::-;12123:825;;;12337:17;12322:11;;;;:32;;;;;;;;:::i;:::-;;:125;;;-1:-1:-1;12390:29:6;12375:11;;;;:44;;;;;;;;:::i;:::-;;:71;;;;;12438:8;12423:23;;:4;:12;;;;;;;;;;;;:23;;;12375:71;12318:630;;;12463:45;;12477:31;;12463:4;;-1:-1:-1;;12463:45:6;;12477:31;12463:45;;;;;12546:15;12522:4;:21;;:39;;;;12590:8;12575:4;:12;;;:23;;;;;;;;;;;;;;;;;;12628:9;12612:4;:13;;;:25;;;;;;;;;;;;;;;;;;12665:4;12651;:11;;:18;;;;12699:6;12683:4;:13;;:22;;;;12734:8;12719:4;:12;;:23;;;;12774:11;12756:4;:15;;:29;;;;12815:9;12799:4;:13;;:25;;;;12880:6;12866:12;-1:-1:-1;;;;;12844:43:6;;;;;;;;;;;12318:630;;;12918:19;;-1:-1:-1;;;12918:19:6;;19423:2:12;12918:19:6;;;19405:21:12;19462:1;19442:18;;;19435:29;-1:-1:-1;;;19480:18:12;;;19473:39;19529:18;;12918:19:6;19221:332:12;12318:630:6;11320:1634;;;;10975:1979;;;;;;;;;;;:::o;8439:1821::-;-1:-1:-1;;;;;8748:24:6;;;8734:11;8748:24;;;:10;:24;;;;;;;;;8802:18;;;:10;:18;;;;;8847:11;;:24;;-1:-1:-1;;;8847:24:6;;;;8748;;8802:18;;8734:11;8847;;;:22;;:24;;;;;8748;8847;;;;;:11;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8906:10;;8830:41;;-1:-1:-1;8906:10:6;;;-1:-1:-1;;;;;8906:10:6;8937:17;;;8929:40;;;;-1:-1:-1;;;8929:40:6;;;;;;;:::i;:::-;8998:1;8987:8;:12;;;8979:36;;;;-1:-1:-1;;;8979:36:6;;;;;;;:::i;:::-;9075:9;9060;9043:27;;;;;;17188:19:12;;17232:2;17223:12;;17059:182;9043:27:6;;;;;;;;;;;;;9033:38;;;;;;:51;9025:76;;;;-1:-1:-1;;;9025:76:6;;17791:2:12;9025:76:6;;;17773:21:12;17830:2;17810:18;;;17803:30;-1:-1:-1;;;17849:18:12;;;17842:42;17901:18;;9025:76:6;17589:336:12;9025:76:6;9133:8;9119:10;9120:9;9119:10;:::i;:::-;:22;;:48;;;;;9157:10;9145:8;:22;;9119:48;9111:72;;;;-1:-1:-1;;;9111:72:6;;;;;;;:::i;:::-;9239:11;;:47;;-1:-1:-1;;;9239:47:6;;18158:4:12;18146:17;;9239:47:6;;;18128:36:12;18180:18;;;18173:34;;;18223:18;;;18216:34;;;-1:-1:-1;;;;;9239:11:6;;;;:22;;18101:18:12;;9239:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9231:67;;;;-1:-1:-1;;;9231:67:6;;18745:2:12;9231:67:6;;;18727:21:12;18784:1;18764:18;;;18757:29;-1:-1:-1;;;18802:18:12;;;18795:37;18849:18;;9231:67:6;18543:330:12;9231:67:6;9367:1;9316:47;9344:18;:6;:16;:18::i;:::-;9316:23;:9;9330:8;9316:13;:23::i;:47::-;:52;;9308:79;;;;-1:-1:-1;;;9308:79:6;;19760:2:12;9308:79:6;;;19742:21:12;19799:2;19779:18;;;19772:30;-1:-1:-1;;;19818:18:12;;;19811:44;19872:18;;9308:79:6;19558:338:12;9308:79:6;9455:31;9440:11;;;;:46;;;;;;;;:::i;:::-;;:74;;;;-1:-1:-1;9490:12:6;;:24;;;;-1:-1:-1;;;9490:12:6;;;;:24;9440:74;9436:818;;;9530:13;;;:25;;;9569:43;9530:4;9591:6;9599:12;9569:15;:43::i;:::-;9436:818;;;9648:17;9633:11;;;;:32;;;;;;;;:::i;:::-;;:127;;;-1:-1:-1;9701:31:6;9686:11;;;;:46;;;;;;;;:::i;:::-;;:73;;;;-1:-1:-1;9736:12:6;;:23;;;;-1:-1:-1;;;9736:12:6;;;;:23;9686:73;9629:625;;;9776:43;;9790:29;;9776:4;;-1:-1:-1;;9776:43:6;;9790:29;9776:43;;;;;9857:15;9833:4;:21;;:39;;;;9901:8;9886:4;:12;;;:23;;;;;;;;;;;;;;;;;;9939:9;9923:4;:13;;;:25;;;;;;;;;;;;;;;;;;9976:4;9962;:11;;:18;;;;10010:6;9994:4;:13;;:22;;;;10045:8;10030:4;:12;;:23;;;;10083:9;10067:4;:13;;:25;;;;10132:1;10124:10;;10106:4;:15;;:28;;;;10186:6;10174:10;-1:-1:-1;;;;;10154:39:6;;;;;;;;;;;9629:625;;1116:96:11;1174:7;1200:5;1204:1;1200;:5;:::i;317:110:10:-;366:4;394:1;389;:6;;382:14;;;;:::i;:::-;-1:-1:-1;418:1:10;317:110::o;13151:723:6:-;13574:11;;:29;;;-1:-1:-1;;;13574:29:6;;;;13556:14;;-1:-1:-1;;;;;13574:11:6;;:27;;:29;;;;;;;;;;;;;;:11;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13573:30;;;:::i;:::-;13684:11;;13556:47;;-1:-1:-1;13684:11:6;;;-1:-1:-1;;;;;13684:11:6;13724:6;13684:11;13724:6;:::i;:::-;13711:10;:19;13707:69;;;13759:6;13760:5;13759:6;:::i;:::-;13746:19;;13707:69;13785:82;13795:5;13802:7;13811:1;13814:12;13828:26;13856:10;13785:9;:82::i;5593:499:4:-;5908:126;;;;;;;20300:19:12;;;5868:4:4;20407:2:12;20403:15;;;-1:-1:-1;;20399:24:12;;;20385:12;;;20378:46;20458:15;;;;20454:24;20440:12;;;20433:46;20495:12;;;20488:28;;;20532:13;;;20525:29;;;20570:13;;;;20563:29;;;5908:126:4;;;;;;;;;;20608:13:12;;;;5908:126:4;;;5898:137;;;;;6071:13;;6046:39;;5898:137;;6059:10;;-1:-1:-1;;;;;6071:13:4;6046:6;:39::i;9708:435:5:-;9928:31;;-1:-1:-1;;9928:31:5;;;9984:11;;:18;;9928:31;9984:15;:18::i;:::-;9970:11;:32;10034:11;;10013:43;;10020:12;;10034:11;;;-1:-1:-1;;;;;10034:11:5;10047:8;10013:6;:43::i;:::-;10099:7;10085:12;-1:-1:-1;;;;;10072:64:5;;10108:8;10118;10128:7;10072:64;;;;;;;;:::i;:::-;;;;;;;;9708:435;;;;;;:::o;12953:319::-;13096:9;13107;13118:7;13129:20;13144:4;13129:14;:20::i;:::-;13095:54;;;;;;13159:22;13184:25;13194:5;13201:1;13204;13207;13184:25;;;;;;;;;;;;;;;;;22431::12;;;22504:4;22492:17;;;;22487:2;22472:18;;22465:45;22541:2;22526:18;;22519:34;22584:2;22569:18;;22562:34;22418:3;22403:19;;22204:398;13184:25:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13159:50;;13245:8;-1:-1:-1;;;;;13227:26:5;:14;-1:-1:-1;;;;;13227:26:5;;13219:46;;;;-1:-1:-1;;;13219:46:5;;22809:2:12;13219:46:5;;;22791:21:12;22848:1;22828:18;;;22821:29;-1:-1:-1;;;22866:18:12;;;22859:37;22913:18;;13219:46:5;22607:330:12;143:116:10;192:3;-1:-1:-1;;;214:1:10;:14;207:22;;;;:::i;1644:93:11:-;1700:6;1725:5;1729:1;1725;:5;:::i;1295:93::-;1351:6;1376:5;1380:1;1376;:5;:::i;14051:465:6:-;14175:11;;;14216:14;;14175:11;14244:12;;;14270:14;;;;14298:13;;;;14350:16;;;;14380:14;;;;;14175:229;;-1:-1:-1;;;14175:229:6;;-1:-1:-1;;;14216:14:6;;;;14175:229;;;23793:36:12;;;;23845:18;;;23838:34;;;;23888:18;;;23881:34;;;;23931:18;;;23924:34;;;;14175:11:6;14325;;;-1:-1:-1;;;;;14325:11:6;23974:19:12;;;23967:76;24059:19;;;24052:35;;;;24103:19;;;24096:35;14158:14:6;;-1:-1:-1;;;;;14175:11:6;;;;:27;;23765:19:12;;14175:229:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14441:13;;14158:246;;-1:-1:-1;14415:94:6;;14441:13;;14432:7;;-1:-1:-1;;;14441:13:6;;;;14456:12;14470:26;14158:246;14415:9;:94::i;10334:862:5:-;10429:12;10453:6;-1:-1:-1;;;;;10448:12:5;10429:32;;10471:17;10491:22;:10;;:20;:22::i;:::-;10471:42;;10543:11;;;;;;;;;-1:-1:-1;;;;;10543:11:5;-1:-1:-1;;;;;10543:22:5;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10531:8;:36;;10524:44;;;;:::i;:::-;10613:1;10586:22;:8;10599;10586:12;:22::i;:::-;10585:29;;10578:37;;;;:::i;:::-;10641:1;10630:8;:12;:40;;;;;10662:8;10646:13;:24;10630:40;10626:199;;;10801:13;10790:24;;10626:199;10849:11;;:25;;10865:8;10849:15;:25::i;:::-;10835:11;:39;10885:17;10905:27;:13;10923:8;10905:17;:27::i;:::-;10885:47;;10955:26;:13;:24;:26::i;:::-;10942:10;:39;10992:14;11009:35;:22;:8;11022;11009:12;:22::i;:::-;:33;:35::i;:::-;-1:-1:-1;;;;;11054:28:5;;;;;;:14;:28;;;;;:41;;10992:52;;-1:-1:-1;10992:52:5;;11054:28;;;:41;;10992:52;;11054:41;:::i;:::-;;;;-1:-1:-1;;;;;;;11109:28:5;;11140:1;11109:28;;;:14;:28;;;;;;:32;11105:85;;11157:22;11166:12;11157:8;:22::i;14275:418::-;14370:9;14381;14392:7;14423:10;:17;14444:2;14423:23;14415:43;;;;-1:-1:-1;;;14415:43:5;;22809:2:12;14415:43:5;;;22791:21:12;22848:1;22828:18;;;22821:29;-1:-1:-1;;;22866:18:12;;;22859:37;22913:18;;14415:43:5;22607:330:12;14415:43:5;-1:-1:-1;;;14519:2:5;14503:19;;14497:26;14563:2;14547:19;;14541:26;14611:2;14595:19;;14589:26;14617:4;14585:37;14649:1;14645:5;;14641:46;;;14670:6;:1;14674:2;14670:6;:::i;:::-;14666:10;;14641:46;14275:418;;;;;:::o;11331:298::-;-1:-1:-1;;;;;11413:24:5;;11394:16;11413:24;;;:14;:24;;;;;;11454:15;11447:23;;;;:::i;:::-;-1:-1:-1;;;;;11481:24:5;;11508:1;11481:24;;;:14;:24;;;;;;:28;;;11523:26;;;;;;11537:11;;11523:26;;11508:1;11523:26;11537:11;11481:24;11523:26;;:35;;;-1:-1:-1;11519:104:5;;-1:-1:-1;;;11519:104:5;-1:-1:-1;;;;;11574:24:5;;;;;;;;:14;:24;;;;;:38;11331:298::o;570:131:12:-;-1:-1:-1;;;;;645:31:12;;635:42;;625:70;;691:1;688;681:12;625:70;570:131;:::o;706:247::-;765:6;818:2;806:9;797:7;793:23;789:32;786:52;;;834:1;831;824:12;786:52;873:9;860:23;892:31;917:5;892:31;:::i;958:180::-;1017:6;1070:2;1058:9;1049:7;1045:23;1041:32;1038:52;;;1086:1;1083;1076:12;1038:52;-1:-1:-1;1109:23:12;;958:180;-1:-1:-1;958:180:12:o;1366:163::-;1433:20;;1493:10;1482:22;;1472:33;;1462:61;;1519:1;1516;1509:12;1462:61;1366:163;;;:::o;1534:142::-;1610:20;;1639:31;1610:20;1639:31;:::i;1681:127::-;1742:10;1737:3;1733:20;1730:1;1723:31;1773:4;1770:1;1763:15;1797:4;1794:1;1787:15;1813:718;1855:5;1908:3;1901:4;1893:6;1889:17;1885:27;1875:55;;1926:1;1923;1916:12;1875:55;1962:6;1949:20;1988:18;2025:2;2021;2018:10;2015:36;;;2031:18;;:::i;:::-;2106:2;2100:9;2074:2;2160:13;;-1:-1:-1;;2156:22:12;;;2180:2;2152:31;2148:40;2136:53;;;2204:18;;;2224:22;;;2201:46;2198:72;;;2250:18;;:::i;:::-;2290:10;2286:2;2279:22;2325:2;2317:6;2310:18;2371:3;2364:4;2359:2;2351:6;2347:15;2343:26;2340:35;2337:55;;;2388:1;2385;2378:12;2337:55;2452:2;2445:4;2437:6;2433:17;2426:4;2418:6;2414:17;2401:54;2499:1;2492:4;2487:2;2479:6;2475:15;2471:26;2464:37;2519:6;2510:15;;;;;;1813:718;;;;:::o;2536:952::-;2673:6;2681;2689;2697;2705;2713;2721;2729;2782:3;2770:9;2761:7;2757:23;2753:33;2750:53;;;2799:1;2796;2789:12;2750:53;2822:28;2840:9;2822:28;:::i;:::-;2812:38;;2897:2;2886:9;2882:18;2869:32;2859:42;;2948:2;2937:9;2933:18;2920:32;2910:42;;2999:2;2988:9;2984:18;2971:32;2961:42;;3050:3;3039:9;3035:19;3022:33;3012:43;;3105:3;3094:9;3090:19;3077:33;3119:31;3144:5;3119:31;:::i;:::-;3169:5;-1:-1:-1;3226:3:12;3211:19;;3198:33;3240;3198;3240;:::i;:::-;3292:7;-1:-1:-1;3350:3:12;3335:19;;3322:33;3378:18;3367:30;;3364:50;;;3410:1;3407;3400:12;3364:50;3433:49;3474:7;3465:6;3454:9;3450:22;3433:49;:::i;:::-;3423:59;;;2536:952;;;;;;;;;;;:::o;3736:156::-;3802:20;;3862:4;3851:16;;3841:27;;3831:55;;3882:1;3879;3872:12;3897:1106;4068:6;4076;4084;4092;4100;4108;4116;4124;4132;4140;4148:7;4157;4211:3;4199:9;4190:7;4186:23;4182:33;4179:53;;;4228:1;4225;4218:12;4179:53;4251:28;4269:9;4251:28;:::i;:::-;4241:38;;4298:36;4330:2;4319:9;4315:18;4298:36;:::i;:::-;4288:46;;4381:2;4370:9;4366:18;4353:32;4343:42;;4432:2;4421:9;4417:18;4404:32;4394:42;;4483:3;4472:9;4468:19;4455:33;4445:43;;4535:3;4524:9;4520:19;4507:33;4497:43;;4587:3;4576:9;4572:19;4559:33;4549:43;;4639:3;4628:9;4624:19;4611:33;4601:43;;4694:18;4687:3;4676:9;4672:19;4659:33;4656:57;4653:77;;;4726:1;4723;4716:12;4653:77;4749:76;4817:7;4809:3;4798:9;4794:19;4781:33;4770:9;4766:49;4749:76;:::i;:::-;4739:86;;4844:47;4886:3;4875:9;4871:19;4844:47;:::i;:::-;4834:57;;4939:3;4928:9;4924:19;4911:33;4900:44;;4992:3;4981:9;4977:19;4964:33;4953:44;;3897:1106;;;;;;;;;;;;;;:::o;5008:944::-;5153:6;5161;5169;5177;5185;5193;5201;5209;5217;5225;5278:3;5266:9;5257:7;5253:23;5249:33;5246:53;;;5295:1;5292;5285:12;5246:53;5318:28;5336:9;5318:28;:::i;:::-;5308:38;;5365:36;5397:2;5386:9;5382:18;5365:36;:::i;:::-;5355:46;;5448:2;5437:9;5433:18;5420:32;5410:42;;5499:2;5488:9;5484:18;5471:32;5461:42;;5550:3;5539:9;5535:19;5522:33;5512:43;;5602:3;5591:9;5587:19;5574:33;5564:43;;5654:3;5643:9;5639:19;5626:33;5616:43;;5706:3;5695:9;5691:19;5678:33;5668:43;;5762:3;5751:9;5747:19;5734:33;5790:18;5782:6;5779:30;5776:50;;;5822:1;5819;5812:12;5776:50;5845:49;5886:7;5877:6;5866:9;5862:22;5845:49;:::i;:::-;5835:59;;;5941:3;5930:9;5926:19;5913:33;5903:43;;5008:944;;;;;;;;;;;;;:::o;5957:127::-;6018:10;6013:3;6009:20;6006:1;5999:31;6049:4;6046:1;6039:15;6073:4;6070:1;6063:15;6089:212;6172:1;6165:5;6162:12;6152:143;;6217:10;6212:3;6208:20;6205:1;6198:31;6252:4;6249:1;6242:15;6280:4;6277:1;6270:15;6306:945;6696:3;6681:19;;6709:40;6742:6;6709:40;:::i;:::-;6758:25;;;-1:-1:-1;;;;;6819:47:12;;;;6814:2;6799:18;;6792:75;6915:4;6903:17;;;;6898:2;6883:18;;6876:45;6969:10;6957:23;;;;6952:2;6937:18;;6930:51;7012:3;6997:19;;6990:35;;;;7056:3;7041:19;;7034:35;;;;7100:3;7085:19;;7078:35;7144:3;7129:19;;7122:35;7188:3;7173:19;;7166:35;7232:3;7217:19;;;7210:35;6306:945;:::o;7644:323::-;7720:6;7728;7781:2;7769:9;7760:7;7756:23;7752:32;7749:52;;;7797:1;7794;7787:12;7749:52;7836:9;7823:23;7855:31;7880:5;7855:31;:::i;:::-;7905:5;7957:2;7942:18;;;;7929:32;;-1:-1:-1;;;7644:323:12:o;7972:594::-;8076:6;8084;8092;8100;8108;8161:3;8149:9;8140:7;8136:23;8132:33;8129:53;;;8178:1;8175;8168:12;8129:53;8214:9;8201:23;8191:33;;8271:2;8260:9;8256:18;8243:32;8233:42;;8322:2;8311:9;8307:18;8294:32;8284:42;;8373:2;8362:9;8358:18;8345:32;8335:42;;8428:3;8417:9;8413:19;8400:33;8456:18;8448:6;8445:30;8442:50;;;8488:1;8485;8478:12;8442:50;8511:49;8552:7;8543:6;8532:9;8528:22;8511:49;:::i;:::-;8501:59;;;7972:594;;;;;;;;:::o;8571:188::-;8639:20;;-1:-1:-1;;;;;8688:46:12;;8678:57;;8668:85;;8749:1;8746;8739:12;8764:260;8832:6;8840;8893:2;8881:9;8872:7;8868:23;8864:32;8861:52;;;8909:1;8906;8899:12;8861:52;8932:29;8951:9;8932:29;:::i;:::-;8922:39;;8980:38;9014:2;9003:9;8999:18;8980:38;:::i;:::-;8970:48;;8764:260;;;;;:::o;9253:802::-;9373:6;9381;9389;9397;9405;9413;9421;9474:3;9462:9;9453:7;9449:23;9445:33;9442:53;;;9491:1;9488;9481:12;9442:53;9514:28;9532:9;9514:28;:::i;:::-;9504:38;;9589:2;9578:9;9574:18;9561:32;9551:42;;9640:2;9629:9;9625:18;9612:32;9602:42;;9691:2;9680:9;9676:18;9663:32;9653:42;;9742:3;9731:9;9727:19;9714:33;9704:43;;9797:3;9786:9;9782:19;9769:33;9811:31;9836:5;9811:31;:::i;:::-;9861:5;-1:-1:-1;9917:3:12;9902:19;;9889:33;9945:18;9934:30;;9931:50;;;9977:1;9974;9967:12;9931:50;10000:49;10041:7;10032:6;10021:9;10017:22;10000:49;:::i;:::-;9990:59;;;9253:802;;;;;;;;;;:::o;10320:184::-;10390:6;10443:2;10431:9;10422:7;10418:23;10414:32;10411:52;;;10459:1;10456;10449:12;10411:52;-1:-1:-1;10482:16:12;;10320:184;-1:-1:-1;10320:184:12:o;10843:334::-;11045:2;11027:21;;;11084:2;11064:18;;;11057:30;-1:-1:-1;;;11118:2:12;11103:18;;11096:40;11168:2;11153:18;;10843:334::o;11182:127::-;11243:10;11238:3;11234:20;11231:1;11224:31;11274:4;11271:1;11264:15;11298:4;11295:1;11288:15;11314:128;11354:3;11385:1;11381:6;11378:1;11375:13;11372:39;;;11391:18;;:::i;:::-;-1:-1:-1;11427:9:12;;11314:128::o;13157:135::-;13196:3;-1:-1:-1;;13217:17:12;;13214:43;;;13237:18;;:::i;:::-;-1:-1:-1;13284:1:12;13273:13;;13157:135::o;13591:334::-;13793:2;13775:21;;;13832:2;13812:18;;;13805:30;-1:-1:-1;;;13866:2:12;13851:18;;13844:40;13916:2;13901:18;;13591:334::o;16106:335::-;16308:2;16290:21;;;16347:2;16327:18;;;16320:30;-1:-1:-1;;;16381:2:12;16366:18;;16359:41;16432:2;16417:18;;16106:335::o;16446:136::-;16481:3;-1:-1:-1;;;16502:22:12;;16499:48;;;16527:18;;:::i;:::-;-1:-1:-1;16567:1:12;16563:13;;16446:136::o;16587:335::-;16789:2;16771:21;;;16828:2;16808:18;;;16801:30;-1:-1:-1;;;16862:2:12;16847:18;;16840:41;16913:2;16898:18;;16587:335::o;16927:127::-;16988:10;16983:3;16979:20;16976:1;16969:31;17019:4;17016:1;17009:15;17043:4;17040:1;17033:15;18261:277;18328:6;18381:2;18369:9;18360:7;18356:23;18352:32;18349:52;;;18397:1;18394;18387:12;18349:52;18429:9;18423:16;18482:5;18475:13;18468:21;18461:5;18458:32;18448:60;;18504:1;18501;18494:12;19901:125;19941:4;19969:1;19966;19963:8;19960:34;;;19974:18;;:::i;:::-;-1:-1:-1;20011:9:12;;19901:125::o;20632:394::-;20873:10;20861:23;;20843:42;;20916:2;20901:18;;20894:34;;;20831:2;20816:18;;20937:40;20970:6;20937:40;:::i;:::-;21013:6;21008:2;20997:9;20993:18;20986:34;20632:394;;;;;;:::o;22942:265::-;22981:3;23009:9;;;23034:10;;-1:-1:-1;;;;;23053:27:12;;;23046:35;;23030:52;23027:78;;;23085:18;;:::i;:::-;-1:-1:-1;;;23132:19:12;;;23125:27;;23117:36;;23114:62;;;23156:18;;:::i;:::-;-1:-1:-1;;23192:9:12;;22942:265::o;23212:267::-;23251:4;23280:9;;;23305:10;;-1:-1:-1;;;23324:19:12;;23317:27;;23301:44;23298:70;;;23348:18;;:::i;:::-;-1:-1:-1;;;;;23395:27:12;;23388:35;;23380:44;;23377:70;;;23427:18;;:::i;:::-;-1:-1:-1;;23464:9:12;;23212:267::o;24142:204::-;24180:3;24216:4;24213:1;24209:12;24248:4;24245:1;24241:12;24283:3;24277:4;24273:14;24268:3;24265:23;24262:49;;;24291:18;;:::i;:::-;24327:13;;24142:204;-1:-1:-1;;;24142:204:12:o
Swarm Source
ipfs://79c3a5760c202f948c6e99da588bff4809558e21194ed3203dec81aaa08282ae
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,270.94 | 15.01 | $49,096.74 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.