Overview
APE Balance
APE Value
$30.91 (@ $0.19/APE)Multichain Info
Latest 25 from a total of 61,167 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Make Guess | 32745691 | 1 hr ago | IN | 0.07321158 APE | 0.04067595 | ||||
| Make Guess | 32745685 | 1 hr ago | IN | 0.07321158 APE | 0.04241472 | ||||
| Play | 32745670 | 1 hr ago | IN | 2.07321158 APE | 0.06813822 | ||||
| Play | 32742867 | 2 hrs ago | IN | 10.07321158 APE | 0.07191411 | ||||
| Cash Out | 32741808 | 2 hrs ago | IN | 0 APE | 0.01173693 | ||||
| Make Guess | 32741802 | 2 hrs ago | IN | 0.07321158 APE | 0.04036825 | ||||
| Play | 32741795 | 2 hrs ago | IN | 25.07321158 APE | 0.06605118 | ||||
| Play | 32741789 | 2 hrs ago | IN | 25.07321158 APE | 0.06576647 | ||||
| Play | 32741770 | 2 hrs ago | IN | 3.06321158 APE | 0.07013731 | ||||
| Play | 32741766 | 2 hrs ago | IN | 3.06321158 APE | 0.0681126 | ||||
| Play | 32741764 | 2 hrs ago | IN | 3.06321158 APE | 0.06811382 | ||||
| Cash Out | 32741056 | 3 hrs ago | IN | 0 APE | 0.01347449 | ||||
| Cash Out | 32739661 | 4 hrs ago | IN | 0 APE | 0.01173693 | ||||
| Make Guess | 32739659 | 4 hrs ago | IN | 0.07321158 APE | 0.04571667 | ||||
| Make Guess | 32739655 | 4 hrs ago | IN | 0.07321158 APE | 0.04065419 | ||||
| Play | 32739646 | 4 hrs ago | IN | 10.07321158 APE | 0.0681004 | ||||
| Make Guess | 32739643 | 4 hrs ago | IN | 0.07321158 APE | 0.04065297 | ||||
| Make Guess | 32739635 | 4 hrs ago | IN | 0.07321158 APE | 0.04065297 | ||||
| Play | 32739628 | 4 hrs ago | IN | 10.07321158 APE | 0.06809907 | ||||
| Make Guess | 32738888 | 4 hrs ago | IN | 0.07321158 APE | 0.04064809 | ||||
| Make Guess | 32738882 | 4 hrs ago | IN | 0.07321158 APE | 0.04238686 | ||||
| Play | 32738871 | 4 hrs ago | IN | 5.07321158 APE | 0.06604508 | ||||
| Make Guess | 32733247 | 7 hrs ago | IN | 0.07321158 APE | 0.04571667 | ||||
| Make Guess | 32733240 | 7 hrs ago | IN | 0.07321158 APE | 0.04571667 | ||||
| Play | 32733237 | 7 hrs ago | IN | 5.07321158 APE | 0.0681004 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32745692 | 1 hr ago | 3.31776 APE | ||||
| 32745691 | 1 hr ago | 0.07321158 APE | ||||
| 32745691 | 1 hr ago | 0.13824 APE | ||||
| 32745688 | 1 hr ago | 0.6912 APE | ||||
| 32745685 | 1 hr ago | 0.07321158 APE | ||||
| 32745685 | 1 hr ago | 0.1152 APE | ||||
| 32745673 | 1 hr ago | 0.96 APE | ||||
| 32745670 | 1 hr ago | 0.07321158 APE | ||||
| 32745670 | 1 hr ago | 0.08 APE | ||||
| 32742868 | 2 hrs ago | 9.6 APE | ||||
| 32742867 | 2 hrs ago | 0.07321158 APE | ||||
| 32742867 | 2 hrs ago | 0.4 APE | ||||
| 32741808 | 2 hrs ago | 31.625 APE | ||||
| 32741803 | 2 hrs ago | 5.225 APE | ||||
| 32741802 | 2 hrs ago | 0.07321158 APE | ||||
| 32741802 | 2 hrs ago | 1.1 APE | ||||
| 32741797 | 2 hrs ago | 3.5 APE | ||||
| 32741795 | 2 hrs ago | 0.07321158 APE | ||||
| 32741795 | 2 hrs ago | 1 APE | ||||
| 32741790 | 2 hrs ago | 24 APE | ||||
| 32741789 | 2 hrs ago | 0.07321158 APE | ||||
| 32741789 | 2 hrs ago | 1 APE | ||||
| 32741772 | 2 hrs ago | 2.8704 APE | ||||
| 32741770 | 2 hrs ago | 0.07321158 APE | ||||
| 32741770 | 2 hrs ago | 0.1196 APE |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at apescan.io on 2025-08-12
*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
interface IGovernanceManager {
function RNG() external view returns (address);
function owner() external view returns (address);
function referralManager() external view returns (address);
function feeReceiver() external view returns (address);
function claimManager() external view returns (address);
function house() external view returns (address);
function isGame(address game) external view returns (bool);
function userInfoTracker() external view returns (address);
function canPlayForOthers(address addr) external view returns (bool);
function paused() external view returns (bool);
function isAdmin(address admin) external view returns (bool);
}
interface IRNG {
function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
function getFee() external view returns (uint256);
}
contract ApeOwnable {
// Governance Manager
IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);
modifier onlyOwner() {
require(
msg.sender == manager.owner(),
'Only Owner'
);
_;
}
modifier onlyGame() {
require(
manager.isGame(msg.sender),
'UnAuthorized'
);
_;
}
modifier onlyRNG() {
require(
msg.sender == manager.RNG(),
'Only RNG Contract'
);
_;
}
modifier validatePlayer(address player) {
if (player != msg.sender) {
require(
manager.canPlayForOthers(msg.sender),
'UnAuthorized To Play For Others'
);
}
_;
}
modifier notPaused() {
require(
manager.paused() == false,
'All Games Paused'
);
_;
}
modifier onlyAdmin() {
require(
manager.isAdmin(msg.sender),
'UnAuthorized'
);
_;
}
}
interface IGame {
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external;
function play(address user, bytes calldata gameData) external payable;
}
interface IUserInfoTracker {
function wagered(address user, uint256 amount, uint256 GAME_ID) external;
}
interface IClaimManager {
function credit(
uint256 GAME_ID,
address user
) external payable;
function claim() external;
}
interface IHistoryManager {
function addData(address user, uint256 GAME_ID, uint256 gameId) external;
}
interface IFeeRecipient {
function takeFee(address ref, address player) external payable;
}
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
interface IHouse {
/**
House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
*/
function houseProfit(uint256 GAME_ID) external payable;
/**
Function Games Call to tell the house that a user has won the bet
*/
function payout(uint256 GAME_ID, address user, uint256 value) external;
/**
Read function to determine the maximum payout allowed by the house at the current time
*/
function maxPayout() external view returns (uint256);
/**
Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
*/
function randomRequested() external;
/**
Resolves a random request from chainlink, allowing house users to withdraw
*/
function randomRequestResolved() external;
}
/**
Game Master Class, any inheriting game must pass the necessary fields into the constructor
*/
contract GameMasterclass is ApeOwnable, IGame {
// GAME ID
uint256 public immutable GAME_ID;
// History Manager
IHistoryManager public immutable history;
/** Game Is Either Paused Or Unpaused */
bool public paused = false;
/** List of all used game ids */
uint256[] public usedGameIds;
mapping ( uint256 => bool ) internal isUsedGameId;
// request ID => GameID
mapping ( uint64 => uint256 ) private requestToGame;
/// @notice emitted after a random request has been sent out
event RandomnessRequested(uint256 gameId);
/**
Builds The Necessary Components Of Any Game
*/
constructor(
uint256 GAME_ID_,
address history_
) {
// set other variables
GAME_ID = GAME_ID_;
history = IHistoryManager(history_);
}
//////////////////////////////////////
/////// OWNER FUNCTIONS ////////
//////////////////////////////////////
function pause() external onlyOwner {
paused = true;
}
function resume() external onlyOwner {
paused = false;
}
function withdrawETH(address to, uint256 amount) external onlyOwner {
(bool s,) = payable(to).call{value: amount}("");
require(s);
}
function withdrawToken(address token, uint amount) external onlyOwner {
TransferHelper.safeTransfer(token, msg.sender, amount);
}
function _registerBet(address user, uint256 amount) internal {
IUserInfoTracker(manager.userInfoTracker()).wagered(user, amount, GAME_ID);
}
function _processFee(uint256 feeAmount, address ref, address player) internal {
IFeeRecipient(manager.feeReceiver()).takeFee{value: feeAmount}(ref, player);
}
function getVRFFee() public view returns (uint256) {
return IRNG(manager.RNG()).getFee();
}
function fulfillRandomWords(uint64 requestId, uint256[] calldata randomWords) external virtual {}
function play(address player, bytes calldata gameData) external payable override validatePlayer(player) notPaused() {
require(
!paused,
'Paused'
);
// play game
_playGame(player, gameData);
}
function _playGame(address player, bytes calldata gameData) internal virtual {}
function _handlePayout(address player, uint256 totalToPayout, uint256 amountForHouse) internal {
if (totalToPayout > 0) {
// there is a payout, we won something
if (totalToPayout >= amountForHouse) {
// the user has won more than we are giving to the house
// this means we need to send them (to claim manager) amountForHouse directly
// and only request that the house `payout` the difference!
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: amountForHouse}(
GAME_ID,
player
);
// get the difference
uint256 remaining = totalToPayout - amountForHouse;
if (remaining > 0) {
// payout the rest from the house
IHouse(manager.house()).payout(GAME_ID, player, remaining);
}
} else {
// the user has won less than we are giving to the house
// pay them out directly in full, send whatever is left over to the house
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: totalToPayout}(
GAME_ID,
player
);
// calculate remaining left for the house
uint256 remaining = amountForHouse - totalToPayout;
// send the remaining to the house
IHouse(manager.house()).houseProfit{value: remaining }(GAME_ID);
}
} else {
// we won nothing, send the house everything
IHouse(manager.house()).houseProfit{value: amountForHouse }(GAME_ID);
}
}
/// @dev logs the gameId in the used list and adds game to player's history
function _registerGameId(address player, uint256 gameId) internal {
// set history data
history.addData(player, GAME_ID, gameId);
// add to list of used game ids
usedGameIds.push(gameId);
isUsedGameId[gameId] = true;
}
function _requestRandom(uint256 gameId, uint8 numWords, bytes32 userRandomWord) internal {
// request random words from RNG contract
uint64 requestId = IRNG(manager.RNG()).requestRandom{value: getVRFFee()}(
userRandomWord, // random user seed
numWords // the number of random results to return
);
// require that the requestId is unused
require(
requestToGame[requestId] == 0,
'RequestId In Use'
);
// map this request ID to the game it belongs to
requestToGame[requestId] = gameId;
// set data in house
IHouse(manager.house()).randomRequested();
// emit event
emit RandomnessRequested(gameId);
}
function _resolveRandom(uint64 requestId) internal {
// resolve request in house
IHouse(manager.house()).randomRequestResolved();
// clear storage
delete requestToGame[requestId];
}
function getGameIdFromRequest(uint64 requestId) internal view returns (uint256) {
return requestToGame[requestId];
}
function getHouse() public view returns (address) {
return manager.house();
}
function isValidGameId(uint256 gameId) public view returns (bool) {
return isUsedGameId[gameId] == false && gameId > 0;
}
function batchCallIsUsedGameId(uint256[] calldata gameIds) external view returns (bool[] memory isUsed) {
uint len = gameIds.length;
isUsed = new bool[](len);
for (uint i = 0; i < len;) {
isUsed[i] = isUsedGameId[gameIds[i]];
unchecked { ++i; }
}
}
function paginateUsedGameIDs(uint256 start, uint256 end) external view returns (uint256[] memory) {
if (end > usedGameIds.length) {
end = usedGameIds.length;
}
uint256[] memory ids = new uint256[](end - start);
for (uint i = start; i < end;) {
ids[i - start] = usedGameIds[i];
unchecked { ++i; }
}
return ids;
}
function numUsedGameIDs() external view returns (uint256) {
return usedGameIds.length;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view virtual returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {}
function batchRawGameInfo(uint256[] calldata gameIds) external view virtual returns (bytes[] memory) {}
}
contract Claimer {
address public parent;
constructor() {
// set parent to the address that deployed this contract
parent = msg.sender;
}
function claim(address claimManager) external returns (uint256) {
require(msg.sender == parent, "Only parent can call this function");
// Call the claim function on the claim manager
IClaimManager(claimManager).claim();
// get amount
uint256 amount = address(this).balance;
// transfer the balance back to the parent
(bool success, ) = payable(parent).call{value: amount}("");
require(success, "Transfer failed");
// return the amount transferred
return amount;
}
receive() external payable {}
}
interface IHouseMaxPayout {
function getMaxPayoutForGame(uint256 GAME_ID) external view returns (uint256);
}
/**
DeathFun PvH Game
*/
contract DeathFun is GameMasterclass {
// How the game moves based on the player's index
uint8 public constant MIN_ROWS = 2;
uint8 public constant MAX_ROWS = 7;
uint8 public constant ROWS_MODULUS = MAX_ROWS - MIN_ROWS + 1; // 6
// maps a row to a payout multiplier
mapping ( uint8 => uint256 ) public rowPayouts;
// fees
uint256 public platformFee = 250; // 2.5%
/** Fee Denominator */
uint256 private constant FEE_DENOM = 10_000;
// Game Struct
struct Game {
// user playing the game
address user;
// guesses placed on each row (number for which row the user guessed)
uint8[] rowGuesses;
// where death hit on each row (number for which row the death hit)
uint8[] rowDeathHits;
// current payout the user could cash out
uint256 currentPayout;
// seeds the tile set to generate the tiles based on randomness
uint256 tilesetSeed;
// initial bet amount
uint256 initialBetAmount;
// total payout - 0 if user lost, set when user cashed out
uint256 totalPayout;
// bet amount sub fees for each round
uint256 amountForHouse;
// true when the game is over, either by user cashing out or game ended
bool hasEnded;
// time the game was started
uint256 timestamp;
}
// return type
struct GameInfoReturnType {
uint256 initialBetAmount; // initial bet amount
uint256 payout; // total payout
address user; // user playing the game
uint256 currentPayout;
uint8[] rowGuesses;
uint8[] rowDeathHits;
uint256 tilesetSeed;
bool hasEnded; // has the game ended
uint256 timestamp; // timestamp of the game
}
// claimer
Claimer public claimer;
// mapping from GameID => Game
mapping ( uint256 => Game ) public games;
/// @notice emitted when the platform fee is changed
event SetPlatformFee(uint256 newPlatformFee);
/// @notice emitted after a game has been started at a specific table
event GameStarted(address indexed user, uint256 gameId);
/// @notice Emitted after the VRF comes back with the index of the winning player
event GameEnded(
address indexed user,
uint256 gameId,
uint256 buyIn,
uint256 payout
);
/// @notice Emitted if the fulfilRandomWords function needs to return out for any reason
event FulfilRandomFailed(uint256 requestId, uint256 gameId, uint256[] randomWords);
constructor(
// Game ID
uint256 GAME_ID_,
/** History Manager */
address history_
) GameMasterclass(GAME_ID_, history_) {
rowPayouts[2] = 19_200; // 1.92x
rowPayouts[3] = 14_400; // 1.44x
rowPayouts[4] = 12_800; // 1.28x
rowPayouts[5] = 12_000; // 1.20x
rowPayouts[6] = 11_500; // 1.15x
rowPayouts[7] = 11_000; // 1.10x
// set claimer
claimer = new Claimer();
}
function setPlatformFees(uint256 newPlatformFee) external onlyOwner {
require(
newPlatformFee <= 500,
'Cannot Exceed 5% Fee'
);
platformFee = newPlatformFee;
emit SetPlatformFee(newPlatformFee);
}
function setRowPayout(uint8 row, uint256 payout) external onlyOwner {
require(
row >= MIN_ROWS && row <= MAX_ROWS,
'Invalid Row'
);
require(
payout >= FEE_DENOM && payout <= 20_000,
'Invalid Payout'
);
rowPayouts[row] = payout;
}
function _playGame(address player, bytes calldata gameData) internal override {
// determine vrf fee
uint256 vrfFee = getVRFFee();
// decode game data
(
uint256 gameId,
uint256 tilesetSeed,
uint8 firstGuess,
address ref,
bytes32 userRandomWord
) = abi.decode(gameData, (uint256, uint256, uint8, address, bytes32));
// validate inputs
require(
msg.value >= vrfFee,
'ERR: MIN BUY IN'
);
require(
isValidGameId(gameId) == true,
'Invalid Game ID'
);
// get rows for round
uint8 numTiles = getRowsForRound(0, games[gameId].tilesetSeed);
require(
firstGuess < numTiles,
'ERR: INVALID FIRST GUESS'
);
// determine total bet amount
uint256 totalBetAmount = msg.value - vrfFee;
require(
totalBetAmount > 0,
'Invalid Bet Amount'
);
// take platform fee out of the buy in
uint256 platformFeeAmount = (totalBetAmount * platformFee) / FEE_DENOM;
// send to platform receiver (taking ref into account)
_processFee(platformFeeAmount, ref, player);
// pair gameId data
games[gameId].user = player;
games[gameId].tilesetSeed = tilesetSeed;
games[gameId].hasEnded = false;
games[gameId].timestamp = block.timestamp;
games[gameId].amountForHouse = totalBetAmount - platformFeeAmount;
games[gameId].rowGuesses.push(firstGuess);
games[gameId].currentPayout = totalBetAmount;
games[gameId].initialBetAmount = totalBetAmount;
// register game Id
_registerGameId(player, gameId);
// register bet
_registerBet(player, totalBetAmount);
// emit event
emit GameStarted(player, gameId);
// fetch random number
_requestRandom(gameId, 1, userRandomWord);
}
function makeGuess(
uint256 gameId,
uint8 index,
bytes32 userRandomWord
) external payable {
require(
msg.value == getVRFFee(),
'ERR: INVALID FEE AMOUNT'
);
require(
games[gameId].user == msg.sender,
'ERR: NOT YOUR GAME'
);
require(
games[gameId].hasEnded == false,
'ERR: GAME HAS ENDED'
);
require(
games[gameId].rowDeathHits.length > 0,
'ERR: NO ROUNDS PLAYED YET'
);
require(
games[gameId].rowGuesses.length == games[gameId].rowDeathHits.length,
'ERR: MUST RESOLVE LAST GUESS FIRST'
);
require(
index < getRowsForRound(games[gameId].rowDeathHits.length, games[gameId].tilesetSeed),
'ERR: INVALID GUESS'
);
// save guess
games[gameId].rowGuesses.push(index);
// manage bet amount -- this is the next bet officially -- use the payout of the last round
uint256 newBetAmount = games[gameId].currentPayout;
// take platform fee out of the buy in
uint256 platformFeeAmount = (newBetAmount * platformFee) / FEE_DENOM;
// send to platform receiver
_processFee(platformFeeAmount, address(0), msg.sender);
// save amount for house
games[gameId].amountForHouse = newBetAmount - platformFeeAmount;
// register bet
_registerBet(msg.sender, newBetAmount);
// request random number
_requestRandom(gameId, 1, userRandomWord);
}
function cashOut(uint256 gameId) external {
// check if game exists
require(
games[gameId].user == msg.sender,
'ERR: NOT YOUR GAME'
);
// check if game has ended
require(
games[gameId].hasEnded == false,
'ERR: GAME HAS ENDED'
);
require(
games[gameId].rowDeathHits.length > 0,
'Invalid Round'
);
require(
games[gameId].rowGuesses.length == games[gameId].rowDeathHits.length,
'ERR: MUST RESOLVE LAST GUESS FIRST'
);
// set game as ended
games[gameId].hasEnded = true;
// if the last round has a payout, we can cash out
uint256 payout = games[gameId].currentPayout;
require(
payout > 0,
'ERR: NO PAYOUT'
);
require(
address(this).balance >= payout,
'ERR: NOT ENOUGH FUNDS TO PAYOUT'
);
// save payout
games[gameId].totalPayout = payout;
// send payout to user
IClaimManager(manager.claimManager()).credit{value: payout}(
GAME_ID,
games[gameId].user
);
// emit event
emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, payout);
}
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external override onlyRNG {
// get game ID from requestId
uint256 gameId = getGameIdFromRequest(requestId);
// resolve randomness
_resolveRandom(requestId);
// if faulty ID, remove
if (gameId == 0 || games[gameId].user == address(0) || games[gameId].hasEnded == true) {
emit FulfilRandomFailed(requestId, gameId, randomWords);
return;
}
// fetch round ID
uint256 roundId = games[gameId].rowDeathHits.length;
if (roundId != games[gameId].rowGuesses.length - 1) {
emit FulfilRandomFailed(requestId, gameId, randomWords);
return;
}
uint8 numTiles = getRowsForRound(roundId, games[gameId].tilesetSeed);
// determine tile death hit
uint8 deathHit = uint8((randomWords[0] % numTiles));
// save death hit
games[gameId].rowDeathHits.push(deathHit);
// if death hit is the same as the guess, game over
if (deathHit == games[gameId].rowGuesses[roundId]) {
// game is over, user lost
games[gameId].hasEnded = true;
games[gameId].totalPayout = 0;
games[gameId].currentPayout = 0;
// emit Game Ended Event
emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, 0);
// handle payout
IHouse(manager.house()).houseProfit{value: games[gameId].amountForHouse }(GAME_ID);
} else {
// user survived, calculate new payout
uint256 roundPayout = ( games[gameId].currentPayout * rowPayouts[numTiles] ) / FEE_DENOM;
// update current payout
games[gameId].currentPayout = roundPayout;
if (roundPayout > games[gameId].amountForHouse && roundPayout > 0) {
// get max house payout
uint256 maxPayout = IHouseMaxPayout(manager.house()).getMaxPayoutForGame(GAME_ID);
// user won, determine amount needed to payout
uint256 diff = roundPayout - games[gameId].amountForHouse;
// if the payout is larger than the max payout, we need to handle it
if (diff > maxPayout) {
// determine excess
uint256 excess = diff - maxPayout;
// reduce payout by excess
games[gameId].currentPayout -= excess;
// handle midgame payout
uint256 amountOut = _handleMidgamePayout(maxPayout);
if (amountOut < maxPayout) {
// if the amount out is less than the max payout, we need to reduce the payout
games[gameId].currentPayout -= (maxPayout - amountOut);
}
// end the game to prevent future moves
games[gameId].hasEnded = true;
// if the last round has a payout, we can cash out
uint256 payout = games[gameId].currentPayout;
// save payout
games[gameId].totalPayout = payout;
// send payout to user
IClaimManager(manager.claimManager()).credit{value: payout}(
GAME_ID,
games[gameId].user
);
// emit event
emit GameEnded(games[gameId].user, gameId, games[gameId].initialBetAmount, payout);
} else {
// handle midgame payout
_handleMidgamePayout(diff);
}
}
}
}
function _handleMidgamePayout(uint256 amount) internal returns (uint256 amountOut) {
if (amount > 0) {
// payout the rest from the house
IHouse(manager.house()).payout(GAME_ID, address(claimer), amount);
// claim from claim manager
amountOut = claimer.claim(manager.claimManager());
}
}
function getRowsForRound(uint256 roundId, uint256 tilesetSeed) public pure returns (uint8) {
if (tilesetSeed == 0) {
// now we do our cascading rounds, starting with 7 going to 3, then back to 7, then back to 3, etc.
if (roundId > 0 && roundId % 20 == 0) {
return uint8(2);
}
return uint8(7) - uint8( roundId % 5 ); // 7-3
}
// hash the tileset seed with the round ID
uint256 tSeed = uint256(keccak256(abi.encodePacked(roundId, tilesetSeed)));
// constrain the rows to be between MIN_ROWS and MAX_ROWS
return uint8((tSeed % ROWS_MODULUS) + MIN_ROWS);
}
function batchRowsForRounds(uint256[] calldata roundIds, uint256 tilesetSeed) external pure returns (uint8[] memory rows) {
uint len = roundIds.length;
rows = new uint8[](len);
for (uint i = 0; i < len;) {
rows[i] = getRowsForRound(roundIds[i], tilesetSeed);
unchecked { ++i; }
}
}
function getGameInfo(uint256 _gameId) public view returns (
GameInfoReturnType memory
) {
if (games[_gameId].rowGuesses.length == 0) {
return GameInfoReturnType({
initialBetAmount: 0,
payout: 0,
user: address(0),
currentPayout: 0,
rowGuesses: new uint8[](0),
rowDeathHits: new uint8[](0),
tilesetSeed: 0,
hasEnded: false,
timestamp: 0
});
}
return GameInfoReturnType({
initialBetAmount: games[_gameId].initialBetAmount, // first round bet amount
payout: games[_gameId].totalPayout,
user: games[_gameId].user,
currentPayout: games[_gameId].currentPayout,
rowGuesses: games[_gameId].rowGuesses,
rowDeathHits: games[_gameId].rowDeathHits,
tilesetSeed: games[_gameId].tilesetSeed,
hasEnded: games[_gameId].hasEnded,
timestamp: games[_gameId].timestamp
});
}
function batchRawGameInfo(uint256[] calldata gameIds) external view override returns (bytes[] memory) {
uint len = gameIds.length;
bytes[] memory retTypes = new bytes[](len);
for (uint i = 0; i < len;) {
retTypes[i] = abi.encode(getGameInfo(gameIds[i]));
unchecked { ++i; }
}
return retTypes;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view override returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {
uint len = gameIds.length;
players = new address[](len);
buyInAmounts = new uint256[](len);
totalPayouts = new uint256[](len);
timestamps = new uint256[](len);
hasEndeds = new bool[](len);
for (uint i = 0; i < len;) {
players[i] = games[gameIds[i]].user;
uint256 rounds = games[gameIds[i]].rowGuesses.length;
if (rounds == 0) {
buyInAmounts[i] = 0;
totalPayouts[i] = 0;
timestamps[i] = 0;
hasEndeds[i] = false;
} else {
buyInAmounts[i] = games[gameIds[i]].initialBetAmount; // first round bet amount
totalPayouts[i] = games[gameIds[i]].totalPayout; // total payout
timestamps[i] = games[gameIds[i]].timestamp; // timestamp of the game
hasEndeds[i] = games[gameIds[i]].hasEnded; // has the game ended?
}
unchecked { ++i; }
}
}
receive() external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"history_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROWS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ROWS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROWS_MODULUS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"roundIds","type":"uint256[]"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"}],"name":"batchRowsForRounds","outputs":[{"internalType":"uint8[]","name":"rows","type":"uint8[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimer","outputs":[{"internalType":"contract Claimer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"requestId","type":"uint64"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"currentPayout","type":"uint256"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"},{"internalType":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"getEssentialGameInfo","outputs":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint256[]","name":"buyInAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"totalPayouts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"bool[]","name":"hasEndeds","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"getGameInfo","outputs":[{"components":[{"internalType":"uint256","name":"initialBetAmount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"currentPayout","type":"uint256"},{"internalType":"uint8[]","name":"rowGuesses","type":"uint8[]"},{"internalType":"uint8[]","name":"rowDeathHits","type":"uint8[]"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct DeathFun.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundId","type":"uint256"},{"internalType":"uint256","name":"tilesetSeed","type":"uint256"}],"name":"getRowsForRound","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"history","outputs":[{"internalType":"contract IHistoryManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"isValidGameId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"bytes32","name":"userRandomWord","type":"bytes32"}],"name":"makeGuess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"bytes","name":"gameData","type":"bytes"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"rowPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatformFee","type":"uint256"}],"name":"setPlatformFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"uint256","name":"payout","type":"uint256"}],"name":"setRowPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedGameIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040526000805460ff1916905560fa60055534801561001f57600080fd5b506040516141ac3803806141ac83398101604081905261003e91610196565b60808290526001600160a01b03811660a0526004602052614b007f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7556138407f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa0556132007f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f55612ee07f04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f0555612cec7fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f556007600052612af87fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5515560405161014490610189565b604051809103906000f080158015610160573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b0392909216919091179055506101d39050565b61029780613f1583390190565b600080604083850312156101a957600080fd5b825160208401519092506001600160a01b03811681146101c857600080fd5b809150509250929050565b60805160a051613ce5610230600039600081816105c701526133c80152600081816106d301528181611423015281816118c401528181611a2201528181611bfd015281816129ed01528181612e17015261339b0152613ce56000f3fe6080604052600436106101f25760003560e01c806379caee8c1161010d578063b6d5cfbb116100a0578063d379be231161006f578063d379be2314610677578063e67953ea14610697578063f0034a7e146106ac578063fdcdb06b146106c1578063ffc22316146106f557600080fd5b8063b6d5cfbb14610609578063c4fd5d6d1461061e578063c811ad711461064f578063cc81d0551461066257600080fd5b806391ea41e6116100dc57806391ea41e61461055b57806398006ebe1461058857806398daac83146105b55780639e281a98146105e957600080fd5b806379caee8c146104d95780637b8d3879146104f95780638456cb591461052657806389fc2c0f1461053b57600080fd5b806346d369bc1161018557806351e925591161015457806351e925591461044f5780635c7b79f51461047f5780635c975abb1461049f578063749fa03c146104b957600080fd5b806346d369bc146103cd5780634782f779146103e057806347e1d55014610400578063481c6a751461042d57600080fd5b8063252ddc72116101c1578063252ddc721461032f57806326232a2e1461034f57806332883e7e1461037357806343aade15146103a057600080fd5b8063046f7da2146101fe57806304e2064f146102155780630840cfaa14610247578063117a5b901461027957600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361070a565b005b34801561022157600080fd5b5061022a6107bf565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b50610267610262366004613470565b610836565b60405160ff909116815260200161023e565b34801561028557600080fd5b506102e8610294366004613492565b6007602081905260009182526040909120805460038201546004830154600584015460068501549585015460088601546009909601546001600160a01b039095169693959294919392909160ff9091169088565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e08201526101000161023e565b34801561033b57600080fd5b5061021361034a3660046134bc565b6108e3565b34801561035b57600080fd5b5061036560055481565b60405190815260200161023e565b34801561037f57600080fd5b5061039361038e366004613470565b610a3c565b60405161023e9190613522565b3480156103ac57600080fd5b506103656103bb36600461353c565b60046020526000908152604090205481565b6102136103db366004613557565b610afe565b3480156103ec57600080fd5b506102136103fb3660046135a5565b610db9565b34801561040c57600080fd5b5061042061041b366004613492565b610ebe565b60405161023e91906135f8565b34801561043957600080fd5b5061022a600080516020613c9083398151915281565b34801561045b57600080fd5b5061046f61046a366004613492565b61117d565b604051901515815260200161023e565b34801561048b57600080fd5b5061021361049a366004613492565b61119d565b3480156104ab57600080fd5b5060005461046f9060ff1681565b3480156104c557600080fd5b506102136104d4366004613704565b6114fd565b3480156104e557600080fd5b506102136104f4366004613492565b611d00565b34801561050557600080fd5b50610519610514366004613758565b611e24565b60405161023e91906137cd565b34801561053257600080fd5b50610213611ee1565b34801561054757600080fd5b50610365610556366004613492565b611f90565b34801561056757600080fd5b5061057b610576366004613758565b611fb1565b60405161023e9190613804565b34801561059457600080fd5b506105a86105a3366004613884565b61207d565b60405161023e91906138cf565b3480156105c157600080fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f557600080fd5b506102136106043660046135a5565b612126565b34801561061557600080fd5b50610267600281565b34801561062a57600080fd5b5061063e610639366004613758565b6121d5565b60405161023e9594939291906138e2565b61021361065d366004613982565b6125d1565b34801561066e57600080fd5b50600154610365565b34801561068357600080fd5b5060065461022a906001600160a01b031681565b3480156106a357600080fd5b50610267600781565b3480156106b857600080fd5b50610365612798565b3480156106cd57600080fd5b506103657f000000000000000000000000000000000000000000000000000000000000000081565b34801561070157600080fd5b5061026761286b565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190613a07565b6001600160a01b0316336001600160a01b0316146107b35760405162461bcd60e51b81526004016107aa90613a24565b60405180910390fd5b6000805460ff19169055565b6000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613a07565b905090565b600081600003610882576000831180156108585750610856601484613a5e565b155b15610865575060026108dd565b610870600584613a5e565b61087b906007613a88565b90506108dd565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060026108b7816007613a88565b6108c2906001613aa1565b6108cf9060ff1683613a5e565b6108d99190613aba565b9150505b92915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190613a07565b6001600160a01b0316336001600160a01b0316146109835760405162461bcd60e51b81526004016107aa90613a24565b600260ff83161080159061099b5750600760ff831611155b6109d55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c696420526f7760a81b60448201526064016107aa565b61271081101580156109e95750614e208111155b610a265760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590814185e5bdd5d60921b60448201526064016107aa565b60ff909116600090815260046020526040902055565b600154606090821115610a4f5760015491505b6000610a5b8484613acd565b6001600160401b03811115610a7257610a72613ae0565b604051908082528060200260200182016040528015610a9b578160200160208202803683370190505b509050835b83811015610af65760018181548110610abb57610abb613af6565b9060005260206000200154828683610ad39190613acd565b81518110610ae357610ae3613af6565b6020908102919091010152600101610aa0565b509392505050565b610b06612798565b3414610b545760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107aa565b6000838152600760205260409020546001600160a01b03163314610baf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008381526007602052604090206008015460ff1615610c075760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b600083815260076020526040902060020154610c655760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107aa565b6000838152600760205260409020600281015460019091015414610c9b5760405162461bcd60e51b81526004016107aa90613b0c565b60008381526007602052604090206002810154600490910154610cbe9190610836565b60ff168260ff1610610d075760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c494420475545535360701b60448201526064016107aa565b600083815260076020908152604082206001808201805491820181558452828420928104909201805460ff808816601f9095166101000a94850294021916929092179091558482526003015460055490919061271090610d679084613b4e565b610d719190613b65565b9050610d7f81600033612885565b610d898183613acd565b60008681526007602081905260409091200155610da63383612957565b610db285600185612a55565b5050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190613a07565b6001600160a01b0316336001600160a01b031614610e595760405162461bcd60e51b81526004016107aa90613a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea6576040519150601f19603f3d011682016040523d82523d6000602084013e610eab565b606091505b5050905080610eb957600080fd5b505050565b610f18604051806101200160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001606081526020016060815260200160008152602001600015158152602001600081525090565b6000828152600760205260408120600101549003610ff357604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160401b03811115610f7a57610f7a613ae0565b604051908082528060200260200182016040528015610fa3578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b5081526000602082018190526040820181905260609091015292915050565b60408051610120810182526000848152600760208181528483206005810154855260068101548286015280546001600160a01b0316858701526003810154606086015292879052908152600190910180548451818402810184019095528085529293608085019390928301828280156110a957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161107a5790505b505050505081526020016007600085815260200190815260200160002060020180548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111025790505b50505091835250506000848152600760208181526040808420600481015483870152600881015460ff161515918601919091529690925290526009909301546060909301929092525090565b60008181526002602052604081205460ff161580156108dd575050151590565b6000818152600760205260409020546001600160a01b031633146111f85760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008181526007602052604090206008015460ff16156112505760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b60008181526007602052604090206002015461129e5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107aa565b60008181526007602052604090206002810154600190910154146112d45760405162461bcd60e51b81526004016107aa90613b0c565b600081815260076020526040902060088101805460ff1916600117905560030154806113335760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107aa565b804710156113835760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107aa565b600082815260076020908152604091829020600601839055815163a9a36dcd60e01b81529151600080516020613c908339815191529263a9a36dcd9260048083019391928290030181865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190613a07565b600083815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561147e57600080fd5b505af1158015611492573d6000803e3d6000fd5b50505060008481526007602090815260409182902080546005909101548351888152928301529181018590526001600160a01b0390911692507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae8915060600160405180910390a25050565b600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d9190613a07565b6001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107aa565b6001600160401b0383166000908152600360205260409020546115e384612cb1565b80158061160557506000818152600760205260409020546001600160a01b0316155b80611626575060008181526007602052604090206008015460ff1615156001145b1561166e577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5848285856040516116609493929190613b79565b60405180910390a150505050565b60008181526007602052604090206002810154600191820154909161169291613acd565b81146116dc577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5858386866040516116cd9493929190613b79565b60405180910390a15050505050565b6000828152600760205260408120600401546116f9908390610836565b905060008160ff168686600081811061171457611714613af6565b905060200201356117259190613a5e565b6000858152600760209081526040822060028101805460018181018355918552838520938104909301805460ff808816601f9096166101000a958602950219169390931790925591879052018054919250908490811061178757611787613af6565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361193657600084815260076020908152604080832060088101805460ff1916600117905560068101849055600381018490558054600590910154825189815293840152908201929092526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a2600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190613a07565b600085815260076020819052604091829020015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561191857600080fd5b505af115801561192c573d6000803e3d6000fd5b5050505050611cf7565b60ff821660009081526004602090815260408083205487845260079092528220600301546127109161196791613b4e565b6119719190613b65565b60008681526007602081905260409091206003810183905501549091508111801561199c5750600081115b15611cf5576000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190613a07565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015611a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9d9190613bcb565b60008781526007602081905260408220015491925090611abd9084613acd565b905081811115611ce7576000611ad38383613acd565b905080600760008a81526020019081526020016000206003016000828254611afb9190613acd565b9091555060009050611b0c84612d8d565b905083811015611b4757611b208185613acd565b60008a81526007602052604081206003018054909190611b41908490613acd565b90915550505b60008981526007602090815260409182902060088101805460ff1916600117905560038101546006909101819055825163a9a36dcd60e01b815292519092600080516020613c908339815191529263a9a36dcd926004808401938290030181865afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde9190613a07565b60008b815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505060008c81526007602052604090819020805460059091015491516001600160a01b0390911693507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89250611cd7918e9186909283526020830191909152604082015260600190565b60405180910390a2505050611cf2565b611cf081612d8d565b505b50505b505b50505050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190613a07565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b81526004016107aa90613a24565b6101f4811115611de95760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107aa565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b03811115611e3f57611e3f613ae0565b604051908082528060200260200182016040528015611e68578160200160208202803683370190505b50915060005b81811015611ed95760026000868684818110611e8c57611e8c613af6565b90506020020135815260200190815260200160002060009054906101000a900460ff16838281518110611ec157611ec1613af6565b91151560209283029190910190910152600101611e6e565b505092915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190613a07565b6001600160a01b0316336001600160a01b031614611f815760405162461bcd60e51b81526004016107aa90613a24565b6000805460ff19166001179055565b60018181548110611fa057600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115611fce57611fce613ae0565b60405190808252806020026020018201604052801561200157816020015b6060815260200190600190039081611fec5790505b50905060005b828110156120745761203086868381811061202457612024613af6565b90506020020135610ebe565b60405160200161204091906135f8565b60405160208183030381529060405282828151811061206157612061613af6565b6020908102919091010152600101612007565b50949350505050565b606082806001600160401b0381111561209857612098613ae0565b6040519080825280602002602001820160405280156120c1578160200160208202803683370190505b50915060005b8181101561211d576120f18686838181106120e4576120e4613af6565b9050602002013585610836565b83828151811061210357612103613af6565b60ff909216602092830291909101909101526001016120c7565b50509392505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121969190613a07565b6001600160a01b0316336001600160a01b0316146121c65760405162461bcd60e51b81526004016107aa90613a24565b6121d1823383612f93565b5050565b60608080808085806001600160401b038111156121f4576121f4613ae0565b60405190808252806020026020018201604052801561221d578160200160208202803683370190505b509550806001600160401b0381111561223857612238613ae0565b604051908082528060200260200182016040528015612261578160200160208202803683370190505b509450806001600160401b0381111561227c5761227c613ae0565b6040519080825280602002602001820160405280156122a5578160200160208202803683370190505b509350806001600160401b038111156122c0576122c0613ae0565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b509250806001600160401b0381111561230457612304613ae0565b60405190808252806020026020018201604052801561232d578160200160208202803683370190505b50915060005b818110156125c557600760008a8a8481811061235157612351613af6565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061238f5761238f613af6565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600760008b8b858181106123c7576123c7613af6565b9050602002013581526020019081526020016000206001018054905090508060000361247657600087838151811061240157612401613af6565b602002602001018181525050600086838151811061242157612421613af6565b602002602001018181525050600085838151811061244157612441613af6565b602002602001018181525050600084838151811061246157612461613af6565b911515602092830291909101909101526125bc565b600760008b8b8581811061248c5761248c613af6565b905060200201358152602001908152602001600020600501548783815181106124b7576124b7613af6565b602002602001018181525050600760008b8b858181106124d9576124d9613af6565b9050602002013581526020019081526020016000206006015486838151811061250457612504613af6565b602002602001018181525050600760008b8b8581811061252657612526613af6565b9050602002013581526020019081526020016000206009015485838151811061255157612551613af6565b602002602001018181525050600760008b8b8581811061257357612573613af6565b90506020020135815260200190815260200160002060080160009054906101000a900460ff168483815181106125ab576125ab613af6565b911515602092830291909101909101525b50600101612333565b50509295509295909350565b826001600160a01b038116331461269b57604051636d6d50a160e11b8152336004820152600080516020613c908339815191529063dadaa14290602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190613be4565b61269b5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107aa565b600080516020613c908339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270b9190613be4565b1561274b5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107aa565b60005460ff16156127875760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107aa565b6127928484846130bd565b50505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280a9190613a07565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613bcb565b61287760026007613a88565b612882906001613aa1565b81565b600080516020613c908339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f59190613a07565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561294357600080fd5b505af1158015611cf5573d6000803e3d6000fd5b600080516020613c908339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190613a07565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b505050505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac79190613a07565b6001600160a01b03166397cca7af612add612798565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b479190613c06565b6001600160401b03811660009081526003602052604090205490915015612ba35760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107aa565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b031981529151600080516020613c908339815191529263ff9b3acf9260048083019391928290030181865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190613a07565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161166091815260200190565b600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613a07565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115612f8e57600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190613a07565b60065460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b158015612e7857600080fd5b505af1158015612e8c573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b0316631e83409a600080516020613c908339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f249190613a07565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612f6a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190613bcb565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612fef9190613c23565b6000604051808303816000865af19150503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b509150915081801561305b57508051158061305b57508080602001905181019061305b9190613be4565b610db25760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107aa565b60006130c7612798565b90506000808080806130db87890189613c3f565b94509450945094509450853410156131275760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107aa565b6131308561117d565b15156001146131735760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107aa565b600085815260076020526040812060040154613190908290610836565b90508060ff168460ff16106131e75760405162461bcd60e51b815260206004820152601860248201527f4552523a20494e56414c4944204649525354204755455353000000000000000060448201526064016107aa565b60006131f38834613acd565b90506000811161323a5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107aa565b60006127106005548361324d9190613b4e565b6132579190613b65565b905061326481868e612885565b600088815260076020526040902080546001600160a01b0319166001600160a01b038e161781556004810188905560088101805460ff19169055426009909101556132af8183613acd565b60008981526007602081815260408320918201939093556001808201805491820181558352838320938104909301805460ff808c16601f9096166101000a9586029502191693909317909255899052600381018390556005018290556133158c8961337c565b61331f8c83612957565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78960405161335a91815260200190565b60405180910390a261336e88600186612a55565b505050505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b15801561340c57600080fd5b505af1158015613420573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000806040838503121561348357600080fd5b50508035926020909101359150565b6000602082840312156134a457600080fd5b5035919050565b803560ff81168114612f8e57600080fd5b600080604083850312156134cf57600080fd5b6134d8836134ab565b946020939093013593505050565b600081518084526020840193506020830160005b828110156135185781518652602095860195909101906001016134fa565b5093949350505050565b60208152600061353560208301846134e6565b9392505050565b60006020828403121561354e57600080fd5b613535826134ab565b60008060006060848603121561356c57600080fd5b8335925061357c602085016134ab565b929592945050506040919091013590565b6001600160a01b03811681146135a257600080fd5b50565b600080604083850312156135b857600080fd5b82356134d88161358d565b600081518084526020840193506020830160005b8281101561351857815160ff168652602095860195909101906001016135d7565b6020815281516020820152602082015160408201526000604083015161362960608401826001600160a01b03169052565b5060608301516080830152608083015161012060a084015261364f6101408401826135c3565b905060a0840151601f198483030160c085015261366c82826135c3565b91505060c084015160e084015260e084015161368d61010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146135a257600080fd5b60008083601f8401126136cb57600080fd5b5081356001600160401b038111156136e257600080fd5b6020830191508360208260051b85010111156136fd57600080fd5b9250929050565b60008060006040848603121561371957600080fd5b8335613724816136a4565b925060208401356001600160401b0381111561373f57600080fd5b61374b868287016136b9565b9497909650939450505050565b6000806020838503121561376b57600080fd5b82356001600160401b0381111561378157600080fd5b61378d858286016136b9565b90969095509350505050565b600081518084526020840193506020830160005b8281101561351857815115158652602095860195909101906001016137ad565b6020815260006135356020830184613799565b60005b838110156137fb5781810151838201526020016137e3565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561387857603f19878603018452815180518087526138558160208901602085016137e0565b601f01601f1916959095016020908101955093840193919091019060010161382c565b50929695505050505050565b60008060006040848603121561389957600080fd5b83356001600160401b038111156138af57600080fd5b6138bb868287016136b9565b909790965060209590950135949350505050565b60208152600061353560208301846135c3565b60a08082528651908201819052600090602088019060c0840190835b818110156139255783516001600160a01b03168352602093840193909201916001016138fe565b5050838103602085015261393981896134e6565b915050828103604084015261394e81876134e6565b9050828103606084015261396281866134e6565b905082810360808401526139768185613799565b98975050505050505050565b60008060006040848603121561399757600080fd5b83356139a28161358d565b925060208401356001600160401b038111156139bd57600080fd5b8401601f810186136139ce57600080fd5b80356001600160401b038111156139e457600080fd5b8660208284010111156139f657600080fd5b939660209190910195509293505050565b600060208284031215613a1957600080fd5b81516135358161358d565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082613a6d57613a6d613a48565b500690565b634e487b7160e01b600052601160045260246000fd5b60ff82811682821603908111156108dd576108dd613a72565b60ff81811683821601908111156108dd576108dd613a72565b808201808211156108dd576108dd613a72565b818103818111156108dd576108dd613a72565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f4552523a204d555354205245534f4c5645204c4153542047554553532046495260408201526114d560f21b606082015260800190565b80820281158282048414176108dd576108dd613a72565b600082613b7457613b74613a48565b500490565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b03831115613bb057600080fd5b8260051b808560808501379190910160800195945050505050565b600060208284031215613bdd57600080fd5b5051919050565b600060208284031215613bf657600080fd5b8151801515811461353557600080fd5b600060208284031215613c1857600080fd5b8151613535816136a4565b60008251613c358184602087016137e0565b9190910192915050565b600080600080600060a08688031215613c5757600080fd5b8535945060208601359350613c6e604087016134ab565b92506060860135613c7e8161358d565b94979396509194608001359291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212207f4e812b814813a999f7c15e75443867a624ac0637fdb57bc849e3920e30fb2564736f6c634300081c00336080604052348015600f57600080fd5b50600080546001600160a01b03191633179055610266806100316000396000f3fe60806040526004361061002d5760003560e01c80631e83409a1461003957806360f96a8f1461006c57600080fd5b3661003457005b600080fd5b34801561004557600080fd5b50610059610054366004610200565b6100a4565b6040519081526020015b60405180910390f35b34801561007857600080fd5b5060005461008c906001600160a01b031681565b6040516001600160a01b039091168152602001610063565b600080546001600160a01b0316331461010f5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c7920706172656e742063616e2063616c6c20746869732066756e63746960448201526137b760f11b60648201526084015b60405180910390fd5b816001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561014a57600080fd5b505af115801561015e573d6000803e3d6000fd5b5050600080546040514794509192506001600160a01b03169083908381818185875af1925050503d80600081146101b1576040519150601f19603f3d011682016040523d82523d6000602084013e6101b6565b606091505b50509050806101f95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610106565b5092915050565b60006020828403121561021257600080fd5b81356001600160a01b038116811461022957600080fd5b939250505056fea26469706673582212209d3dcfa10808d923c6427b4fae63609b7edac37cce12a2317ed57a753ada9c9564736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
Deployed Bytecode
0x6080604052600436106101f25760003560e01c806379caee8c1161010d578063b6d5cfbb116100a0578063d379be231161006f578063d379be2314610677578063e67953ea14610697578063f0034a7e146106ac578063fdcdb06b146106c1578063ffc22316146106f557600080fd5b8063b6d5cfbb14610609578063c4fd5d6d1461061e578063c811ad711461064f578063cc81d0551461066257600080fd5b806391ea41e6116100dc57806391ea41e61461055b57806398006ebe1461058857806398daac83146105b55780639e281a98146105e957600080fd5b806379caee8c146104d95780637b8d3879146104f95780638456cb591461052657806389fc2c0f1461053b57600080fd5b806346d369bc1161018557806351e925591161015457806351e925591461044f5780635c7b79f51461047f5780635c975abb1461049f578063749fa03c146104b957600080fd5b806346d369bc146103cd5780634782f779146103e057806347e1d55014610400578063481c6a751461042d57600080fd5b8063252ddc72116101c1578063252ddc721461032f57806326232a2e1461034f57806332883e7e1461037357806343aade15146103a057600080fd5b8063046f7da2146101fe57806304e2064f146102155780630840cfaa14610247578063117a5b901461027957600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361070a565b005b34801561022157600080fd5b5061022a6107bf565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025357600080fd5b50610267610262366004613470565b610836565b60405160ff909116815260200161023e565b34801561028557600080fd5b506102e8610294366004613492565b6007602081905260009182526040909120805460038201546004830154600584015460068501549585015460088601546009909601546001600160a01b039095169693959294919392909160ff9091169088565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e08201526101000161023e565b34801561033b57600080fd5b5061021361034a3660046134bc565b6108e3565b34801561035b57600080fd5b5061036560055481565b60405190815260200161023e565b34801561037f57600080fd5b5061039361038e366004613470565b610a3c565b60405161023e9190613522565b3480156103ac57600080fd5b506103656103bb36600461353c565b60046020526000908152604090205481565b6102136103db366004613557565b610afe565b3480156103ec57600080fd5b506102136103fb3660046135a5565b610db9565b34801561040c57600080fd5b5061042061041b366004613492565b610ebe565b60405161023e91906135f8565b34801561043957600080fd5b5061022a600080516020613c9083398151915281565b34801561045b57600080fd5b5061046f61046a366004613492565b61117d565b604051901515815260200161023e565b34801561048b57600080fd5b5061021361049a366004613492565b61119d565b3480156104ab57600080fd5b5060005461046f9060ff1681565b3480156104c557600080fd5b506102136104d4366004613704565b6114fd565b3480156104e557600080fd5b506102136104f4366004613492565b611d00565b34801561050557600080fd5b50610519610514366004613758565b611e24565b60405161023e91906137cd565b34801561053257600080fd5b50610213611ee1565b34801561054757600080fd5b50610365610556366004613492565b611f90565b34801561056757600080fd5b5061057b610576366004613758565b611fb1565b60405161023e9190613804565b34801561059457600080fd5b506105a86105a3366004613884565b61207d565b60405161023e91906138cf565b3480156105c157600080fd5b5061022a7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b3480156105f557600080fd5b506102136106043660046135a5565b612126565b34801561061557600080fd5b50610267600281565b34801561062a57600080fd5b5061063e610639366004613758565b6121d5565b60405161023e9594939291906138e2565b61021361065d366004613982565b6125d1565b34801561066e57600080fd5b50600154610365565b34801561068357600080fd5b5060065461022a906001600160a01b031681565b3480156106a357600080fd5b50610267600781565b3480156106b857600080fd5b50610365612798565b3480156106cd57600080fd5b506103657f000000000000000000000000000000000000000000000000000000000000000d81565b34801561070157600080fd5b5061026761286b565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190613a07565b6001600160a01b0316336001600160a01b0316146107b35760405162461bcd60e51b81526004016107aa90613a24565b60405180910390fd5b6000805460ff19169055565b6000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561080d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613a07565b905090565b600081600003610882576000831180156108585750610856601484613a5e565b155b15610865575060026108dd565b610870600584613a5e565b61087b906007613a88565b90506108dd565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060026108b7816007613a88565b6108c2906001613aa1565b6108cf9060ff1683613a5e565b6108d99190613aba565b9150505b92915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190613a07565b6001600160a01b0316336001600160a01b0316146109835760405162461bcd60e51b81526004016107aa90613a24565b600260ff83161080159061099b5750600760ff831611155b6109d55760405162461bcd60e51b815260206004820152600b60248201526a496e76616c696420526f7760a81b60448201526064016107aa565b61271081101580156109e95750614e208111155b610a265760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590814185e5bdd5d60921b60448201526064016107aa565b60ff909116600090815260046020526040902055565b600154606090821115610a4f5760015491505b6000610a5b8484613acd565b6001600160401b03811115610a7257610a72613ae0565b604051908082528060200260200182016040528015610a9b578160200160208202803683370190505b509050835b83811015610af65760018181548110610abb57610abb613af6565b9060005260206000200154828683610ad39190613acd565b81518110610ae357610ae3613af6565b6020908102919091010152600101610aa0565b509392505050565b610b06612798565b3414610b545760405162461bcd60e51b815260206004820152601760248201527f4552523a20494e56414c49442046454520414d4f554e5400000000000000000060448201526064016107aa565b6000838152600760205260409020546001600160a01b03163314610baf5760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008381526007602052604090206008015460ff1615610c075760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b600083815260076020526040902060020154610c655760405162461bcd60e51b815260206004820152601960248201527f4552523a204e4f20524f554e445320504c41594544205945540000000000000060448201526064016107aa565b6000838152600760205260409020600281015460019091015414610c9b5760405162461bcd60e51b81526004016107aa90613b0c565b60008381526007602052604090206002810154600490910154610cbe9190610836565b60ff168260ff1610610d075760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c494420475545535360701b60448201526064016107aa565b600083815260076020908152604082206001808201805491820181558452828420928104909201805460ff808816601f9095166101000a94850294021916929092179091558482526003015460055490919061271090610d679084613b4e565b610d719190613b65565b9050610d7f81600033612885565b610d898183613acd565b60008681526007602081905260409091200155610da63383612957565b610db285600185612a55565b5050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190613a07565b6001600160a01b0316336001600160a01b031614610e595760405162461bcd60e51b81526004016107aa90613a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea6576040519150601f19603f3d011682016040523d82523d6000602084013e610eab565b606091505b5050905080610eb957600080fd5b505050565b610f18604051806101200160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001606081526020016060815260200160008152602001600015158152602001600081525090565b6000828152600760205260408120600101549003610ff357604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160401b03811115610f7a57610f7a613ae0565b604051908082528060200260200182016040528015610fa3578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015610fd4578160200160208202803683370190505b5081526000602082018190526040820181905260609091015292915050565b60408051610120810182526000848152600760208181528483206005810154855260068101548286015280546001600160a01b0316858701526003810154606086015292879052908152600190910180548451818402810184019095528085529293608085019390928301828280156110a957602002820191906000526020600020906000905b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161107a5790505b505050505081526020016007600085815260200190815260200160002060020180548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111025790505b50505091835250506000848152600760208181526040808420600481015483870152600881015460ff161515918601919091529690925290526009909301546060909301929092525090565b60008181526002602052604081205460ff161580156108dd575050151590565b6000818152600760205260409020546001600160a01b031633146111f85760405162461bcd60e51b81526020600482015260126024820152714552523a204e4f5420594f55522047414d4560701b60448201526064016107aa565b60008181526007602052604090206008015460ff16156112505760405162461bcd60e51b81526020600482015260136024820152721154948e8811d0535148121054c81153911151606a1b60448201526064016107aa565b60008181526007602052604090206002015461129e5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908149bdd5b99609a1b60448201526064016107aa565b60008181526007602052604090206002810154600190910154146112d45760405162461bcd60e51b81526004016107aa90613b0c565b600081815260076020526040902060088101805460ff1916600117905560030154806113335760405162461bcd60e51b815260206004820152600e60248201526d1154948e881393c814105653d55560921b60448201526064016107aa565b804710156113835760405162461bcd60e51b815260206004820152601f60248201527f4552523a204e4f5420454e4f5547482046554e445320544f205041594f55540060448201526064016107aa565b600082815260076020908152604091829020600601839055815163a9a36dcd60e01b81529151600080516020613c908339815191529263a9a36dcd9260048083019391928290030181865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190613a07565b600083815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b15801561147e57600080fd5b505af1158015611492573d6000803e3d6000fd5b50505060008481526007602090815260409182902080546005909101548351888152928301529181018590526001600160a01b0390911692507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae8915060600160405180910390a25050565b600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156d9190613a07565b6001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b60448201526064016107aa565b6001600160401b0383166000908152600360205260409020546115e384612cb1565b80158061160557506000818152600760205260409020546001600160a01b0316155b80611626575060008181526007602052604090206008015460ff1615156001145b1561166e577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5848285856040516116609493929190613b79565b60405180910390a150505050565b60008181526007602052604090206002810154600191820154909161169291613acd565b81146116dc577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a5858386866040516116cd9493929190613b79565b60405180910390a15050505050565b6000828152600760205260408120600401546116f9908390610836565b905060008160ff168686600081811061171457611714613af6565b905060200201356117259190613a5e565b6000858152600760209081526040822060028101805460018181018355918552838520938104909301805460ff808816601f9096166101000a958602950219169390931790925591879052018054919250908490811061178757611787613af6565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361193657600084815260076020908152604080832060088101805460ff1916600117905560068101849055600381018490558054600590910154825189815293840152908201929092526001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89060600160405180910390a2600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190613a07565b600085815260076020819052604091829020015490516359e5b78d60e11b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b03929092169163b3cb6f1a91906024016000604051808303818588803b15801561191857600080fd5b505af115801561192c573d6000803e3d6000fd5b5050505050611cf7565b60ff821660009081526004602090815260408083205487845260079092528220600301546127109161196791613b4e565b6119719190613b65565b60008681526007602081905260409091206003810183905501549091508111801561199c5750600081115b15611cf5576000600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a139190613a07565b604051630102fbc160e21b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b03919091169063040bef0490602401602060405180830381865afa158015611a79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9d9190613bcb565b60008781526007602081905260408220015491925090611abd9084613acd565b905081811115611ce7576000611ad38383613acd565b905080600760008a81526020019081526020016000206003016000828254611afb9190613acd565b9091555060009050611b0c84612d8d565b905083811015611b4757611b208185613acd565b60008a81526007602052604081206003018054909190611b41908490613acd565b90915550505b60008981526007602090815260409182902060088101805460ff1916600117905560038101546006909101819055825163a9a36dcd60e01b815292519092600080516020613c908339815191529263a9a36dcd926004808401938290030181865afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde9190613a07565b60008b815260076020526040908190205490516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b039182166024820152911690639fec19e09083906044016000604051808303818588803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b50505060008c81526007602052604090819020805460059091015491516001600160a01b0390911693507fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89250611cd7918e9186909283526020830191909152604082015260600190565b60405180910390a2505050611cf2565b611cf081612d8d565b505b50505b505b50505050505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190613a07565b6001600160a01b0316336001600160a01b031614611da05760405162461bcd60e51b81526004016107aa90613a24565b6101f4811115611de95760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74204578636565642035252046656560601b60448201526064016107aa565b60058190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b606081806001600160401b03811115611e3f57611e3f613ae0565b604051908082528060200260200182016040528015611e68578160200160208202803683370190505b50915060005b81811015611ed95760026000868684818110611e8c57611e8c613af6565b90506020020135815260200190815260200160002060009054906101000a900460ff16838281518110611ec157611ec1613af6565b91151560209283029190910190910152600101611e6e565b505092915050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190613a07565b6001600160a01b0316336001600160a01b031614611f815760405162461bcd60e51b81526004016107aa90613a24565b6000805460ff19166001179055565b60018181548110611fa057600080fd5b600091825260209091200154905081565b6060816000816001600160401b03811115611fce57611fce613ae0565b60405190808252806020026020018201604052801561200157816020015b6060815260200190600190039081611fec5790505b50905060005b828110156120745761203086868381811061202457612024613af6565b90506020020135610ebe565b60405160200161204091906135f8565b60405160208183030381529060405282828151811061206157612061613af6565b6020908102919091010152600101612007565b50949350505050565b606082806001600160401b0381111561209857612098613ae0565b6040519080825280602002602001820160405280156120c1578160200160208202803683370190505b50915060005b8181101561211d576120f18686838181106120e4576120e4613af6565b9050602002013585610836565b83828151811061210357612103613af6565b60ff909216602092830291909101909101526001016120c7565b50509392505050565b600080516020613c908339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121969190613a07565b6001600160a01b0316336001600160a01b0316146121c65760405162461bcd60e51b81526004016107aa90613a24565b6121d1823383612f93565b5050565b60608080808085806001600160401b038111156121f4576121f4613ae0565b60405190808252806020026020018201604052801561221d578160200160208202803683370190505b509550806001600160401b0381111561223857612238613ae0565b604051908082528060200260200182016040528015612261578160200160208202803683370190505b509450806001600160401b0381111561227c5761227c613ae0565b6040519080825280602002602001820160405280156122a5578160200160208202803683370190505b509350806001600160401b038111156122c0576122c0613ae0565b6040519080825280602002602001820160405280156122e9578160200160208202803683370190505b509250806001600160401b0381111561230457612304613ae0565b60405190808252806020026020018201604052801561232d578160200160208202803683370190505b50915060005b818110156125c557600760008a8a8481811061235157612351613af6565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061238f5761238f613af6565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600760008b8b858181106123c7576123c7613af6565b9050602002013581526020019081526020016000206001018054905090508060000361247657600087838151811061240157612401613af6565b602002602001018181525050600086838151811061242157612421613af6565b602002602001018181525050600085838151811061244157612441613af6565b602002602001018181525050600084838151811061246157612461613af6565b911515602092830291909101909101526125bc565b600760008b8b8581811061248c5761248c613af6565b905060200201358152602001908152602001600020600501548783815181106124b7576124b7613af6565b602002602001018181525050600760008b8b858181106124d9576124d9613af6565b9050602002013581526020019081526020016000206006015486838151811061250457612504613af6565b602002602001018181525050600760008b8b8581811061252657612526613af6565b9050602002013581526020019081526020016000206009015485838151811061255157612551613af6565b602002602001018181525050600760008b8b8581811061257357612573613af6565b90506020020135815260200190815260200160002060080160009054906101000a900460ff168483815181106125ab576125ab613af6565b911515602092830291909101909101525b50600101612333565b50509295509295909350565b826001600160a01b038116331461269b57604051636d6d50a160e11b8152336004820152600080516020613c908339815191529063dadaa14290602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190613be4565b61269b5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f74686572730060448201526064016107aa565b600080516020613c908339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270b9190613be4565b1561274b5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b60448201526064016107aa565b60005460ff16156127875760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b60448201526064016107aa565b6127928484846130bd565b50505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280a9190613a07565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108319190613bcb565b61287760026007613a88565b612882906001613aa1565b81565b600080516020613c908339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f59190613a07565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e59085906044016000604051808303818588803b15801561294357600080fd5b505af1158015611cf5573d6000803e3d6000fd5b600080516020613c908339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190613a07565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f000000000000000000000000000000000000000000000000000000000000000d6044830152919091169063eb3d9bea90606401600060405180830381600087803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b505050505050565b6000600080516020613c908339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015612aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac79190613a07565b6001600160a01b03166397cca7af612add612798565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015612b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b479190613c06565b6001600160401b03811660009081526003602052604090205490915015612ba35760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b60448201526064016107aa565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b031981529151600080516020613c908339815191529263ff9b3acf9260048083019391928290030181865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190613a07565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c6857600080fd5b505af1158015612c7c573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161166091815260200190565b600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613a07565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b60008115612f8e57600080516020613c908339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e059190613a07565b60065460405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000d60048201526001600160a01b0391821660248201526044810185905291169063ae2f5d9390606401600060405180830381600087803b158015612e7857600080fd5b505af1158015612e8c573d6000803e3d6000fd5b50505050600660009054906101000a90046001600160a01b03166001600160a01b0316631e83409a600080516020613c908339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f249190613a07565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612f6a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190613bcb565b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612fef9190613c23565b6000604051808303816000865af19150503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b509150915081801561305b57508051158061305b57508080602001905181019061305b9190613be4565b610db25760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016107aa565b60006130c7612798565b90506000808080806130db87890189613c3f565b94509450945094509450853410156131275760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b60448201526064016107aa565b6131308561117d565b15156001146131735760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590811d85b59481251608a1b60448201526064016107aa565b600085815260076020526040812060040154613190908290610836565b90508060ff168460ff16106131e75760405162461bcd60e51b815260206004820152601860248201527f4552523a20494e56414c4944204649525354204755455353000000000000000060448201526064016107aa565b60006131f38834613acd565b90506000811161323a5760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a590810995d08105b5bdd5b9d60721b60448201526064016107aa565b60006127106005548361324d9190613b4e565b6132579190613b65565b905061326481868e612885565b600088815260076020526040902080546001600160a01b0319166001600160a01b038e161781556004810188905560088101805460ff19169055426009909101556132af8183613acd565b60008981526007602081815260408320918201939093556001808201805491820181558352838320938104909301805460ff808c16601f9096166101000a9586029502191693909317909255899052600381018390556005018290556133158c8961337c565b61331f8c83612957565b8b6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c78960405161335a91815260200190565b60405180910390a261336e88600186612a55565b505050505050505050505050565b604051639a4918c160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000d6024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b15801561340c57600080fd5b505af1158015613420573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b6000806040838503121561348357600080fd5b50508035926020909101359150565b6000602082840312156134a457600080fd5b5035919050565b803560ff81168114612f8e57600080fd5b600080604083850312156134cf57600080fd5b6134d8836134ab565b946020939093013593505050565b600081518084526020840193506020830160005b828110156135185781518652602095860195909101906001016134fa565b5093949350505050565b60208152600061353560208301846134e6565b9392505050565b60006020828403121561354e57600080fd5b613535826134ab565b60008060006060848603121561356c57600080fd5b8335925061357c602085016134ab565b929592945050506040919091013590565b6001600160a01b03811681146135a257600080fd5b50565b600080604083850312156135b857600080fd5b82356134d88161358d565b600081518084526020840193506020830160005b8281101561351857815160ff168652602095860195909101906001016135d7565b6020815281516020820152602082015160408201526000604083015161362960608401826001600160a01b03169052565b5060608301516080830152608083015161012060a084015261364f6101408401826135c3565b905060a0840151601f198483030160c085015261366c82826135c3565b91505060c084015160e084015260e084015161368d61010085018215159052565b506101008401516101208401528091505092915050565b6001600160401b03811681146135a257600080fd5b60008083601f8401126136cb57600080fd5b5081356001600160401b038111156136e257600080fd5b6020830191508360208260051b85010111156136fd57600080fd5b9250929050565b60008060006040848603121561371957600080fd5b8335613724816136a4565b925060208401356001600160401b0381111561373f57600080fd5b61374b868287016136b9565b9497909650939450505050565b6000806020838503121561376b57600080fd5b82356001600160401b0381111561378157600080fd5b61378d858286016136b9565b90969095509350505050565b600081518084526020840193506020830160005b8281101561351857815115158652602095860195909101906001016137ad565b6020815260006135356020830184613799565b60005b838110156137fb5781810151838201526020016137e3565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561387857603f19878603018452815180518087526138558160208901602085016137e0565b601f01601f1916959095016020908101955093840193919091019060010161382c565b50929695505050505050565b60008060006040848603121561389957600080fd5b83356001600160401b038111156138af57600080fd5b6138bb868287016136b9565b909790965060209590950135949350505050565b60208152600061353560208301846135c3565b60a08082528651908201819052600090602088019060c0840190835b818110156139255783516001600160a01b03168352602093840193909201916001016138fe565b5050838103602085015261393981896134e6565b915050828103604084015261394e81876134e6565b9050828103606084015261396281866134e6565b905082810360808401526139768185613799565b98975050505050505050565b60008060006040848603121561399757600080fd5b83356139a28161358d565b925060208401356001600160401b038111156139bd57600080fd5b8401601f810186136139ce57600080fd5b80356001600160401b038111156139e457600080fd5b8660208284010111156139f657600080fd5b939660209190910195509293505050565b600060208284031215613a1957600080fd5b81516135358161358d565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082613a6d57613a6d613a48565b500690565b634e487b7160e01b600052601160045260246000fd5b60ff82811682821603908111156108dd576108dd613a72565b60ff81811683821601908111156108dd576108dd613a72565b808201808211156108dd576108dd613a72565b818103818111156108dd576108dd613a72565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f4552523a204d555354205245534f4c5645204c4153542047554553532046495260408201526114d560f21b606082015260800190565b80820281158282048414176108dd576108dd613a72565b600082613b7457613b74613a48565b500490565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b03831115613bb057600080fd5b8260051b808560808501379190910160800195945050505050565b600060208284031215613bdd57600080fd5b5051919050565b600060208284031215613bf657600080fd5b8151801515811461353557600080fd5b600060208284031215613c1857600080fd5b8151613535816136a4565b60008251613c358184602087016137e0565b9190910192915050565b600080600080600060a08688031215613c5757600080fd5b8535945060208601359350613c6e604087016134ab565b92506060860135613c7e8161358d565b94979396509194608001359291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212207f4e812b814813a999f7c15e75443867a624ac0637fdb57bc849e3920e30fb2564736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
-----Decoded View---------------
Arg [0] : GAME_ID_ (uint256): 13
Arg [1] : history_ (address): 0xFa296156dAc165Af92F7Fdb012B61a874670e1AA
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [1] : 000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa
Deployed Bytecode Sourcemap
14011:17178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6796:70;;;;;;;;;;;;;:::i;:::-;;11573:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;11573:91:0;;;;;;;;27295:694;;;;;;;;;;-1:-1:-1;27295:694:0;;;;;:::i;:::-;;:::i;:::-;;;854:4:1;842:17;;;824:36;;812:2;797:18;27295:694:0;682:184:1;15961:40:0;;;;;;;;;;-1:-1:-1;15961:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15961:40:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1553:32:1;;;1535:51;;1617:2;1602:18;;1595:34;;;;1645:18;;;1638:34;;;;1703:2;1688:18;;1681:34;;;;1746:3;1731:19;;1724:35;1573:3;1775:19;;1768:35;1847:14;1840:22;1834:3;1819:19;;1812:51;1894:3;1879:19;;1872:35;1522:3;1507:19;15961:40:0;1198:715:1;17448:331:0;;;;;;;;;;-1:-1:-1;17448:331:0;;;;;:::i;:::-;;:::i;14378:32::-;;;;;;;;;;;;;;;;;;;2526:25:1;;;2514:2;2499:18;14378:32:0;2380:177:1;12138:409:0;;;;;;;;;;-1:-1:-1;12138:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14310:46::-;;;;;;;;;;-1:-1:-1;14310:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;19877:1655;;;;;;:::i;:::-;;:::i;6874:155::-;;;;;;;;;;-1:-1:-1;6874:155:0;;;;;:::i;:::-;;:::i;28353:1106::-;;;;;;;;;;-1:-1:-1;28353:1106:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1014:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1014:107:0;;11672:135;;;;;;;;;;-1:-1:-1;11672:135:0;;;;;:::i;:::-;;:::i;:::-;;;6345:14:1;;6338:22;6320:41;;6308:2;6293:18;11672:135:0;6180:187:1;21540:1385:0;;;;;;;;;;-1:-1:-1;21540:1385:0;;;;;:::i;:::-;;:::i;5945:26::-;;;;;;;;;;-1:-1:-1;5945:26:0;;;;;;;;22999:3913;;;;;;;;;;-1:-1:-1;22999:3913:0;;;;;:::i;:::-;;:::i;17167:273::-;;;;;;;;;;-1:-1:-1;17167:273:0;;;;;:::i;:::-;;:::i;11815:315::-;;;;;;;;;;-1:-1:-1;11815:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6720:68::-;;;;;;;;;;;;;:::i;6018:28::-;;;;;;;;;;-1:-1:-1;6018:28:0;;;;;:::i;:::-;;:::i;29467:370::-;;;;;;;;;;-1:-1:-1;29467:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27997:348::-;;;;;;;;;;-1:-1:-1;27997:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5850:40::-;;;;;;;;;;;;;;;7037:143;;;;;;;;;;-1:-1:-1;7037:143:0;;;;;:::i;:::-;;:::i;14112:34::-;;;;;;;;;;;;14145:1;14112:34;;29845:1304;;;;;;;;;;-1:-1:-1;29845:1304:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;7752:260::-;;;;;;:::i;:::-;;:::i;12555:102::-;;;;;;;;;;-1:-1:-1;12631:11:0;:18;12555:102;;15894:22;;;;;;;;;;-1:-1:-1;15894:22:0;;;;-1:-1:-1;;;;;15894:22:0;;;14153:34;;;;;;;;;;;;14186:1;14153:34;;7534:105;;;;;;;;;;;;;:::i;5785:32::-;;;;;;;;;;;;;;;14194:60;;;;;;;;;;;;;:::i;6796:70::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;;;;;;;;;6853:5:::1;6844:14:::0;;-1:-1:-1;;6844:14:0::1;::::0;;6796:70::o;11573:91::-;11614:7;-1:-1:-1;;;;;;;;;;;;;;;;11641:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11634:22;;11573:91;:::o;27295:694::-;27379:5;27403:11;27418:1;27403:16;27399:309;;27563:1;27553:7;:11;:32;;;;-1:-1:-1;27568:12:0;27578:2;27568:7;:12;:::i;:::-;:17;27553:32;27549:88;;;-1:-1:-1;27619:1:0;27606:15;;27549:88;27676:11;27686:1;27676:7;:11;:::i;:::-;27658:31;;27664:1;27658:31;:::i;:::-;27651:38;;;;27399:309;27814:38;;;;;;;14564:19:1;;;14599:12;;;14592:28;;;27814:38:0;;;;;;;;;14636:12:1;;;;27814:38:0;;;27804:49;;;;;14145:1;14231:19;14145:1;14186;14231:19;:::i;:::-;:23;;14253:1;14231:23;:::i;:::-;27948:20;;;;:5;:20;:::i;:::-;27947:33;;;;:::i;:::-;27934:47;;;27295:694;;;;;:::o;17448:331::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;14145:1:::1;17549:15;::::0;::::1;;::::0;::::1;::::0;:34:::1;;-1:-1:-1::0;14186:1:0::1;17568:15;::::0;::::1;;;17549:34;17527:95;;;::::0;-1:-1:-1;;;17527:95:0;;15144:2:1;17527:95:0::1;::::0;::::1;15126:21:1::0;15183:2;15163:18;;;15156:30;-1:-1:-1;;;15202:18:1;;;15195:41;15253:18;;17527:95:0::1;14942:335:1::0;17527:95:0::1;14492:6;17655;:19;;:39;;;;;17688:6;17678;:16;;17655:39;17633:103;;;::::0;-1:-1:-1;;;17633:103:0;;15484:2:1;17633:103:0::1;::::0;::::1;15466:21:1::0;15523:2;15503:18;;;15496:30;-1:-1:-1;;;15542:18:1;;;15535:44;15596:18;;17633:103:0::1;15282:338:1::0;17633:103:0::1;17747:15;::::0;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:24;17448:331::o;12138:409::-;12257:11;:18;12218:16;;12251:24;;12247:81;;;12298:11;:18;;-1:-1:-1;12247:81:0;12338:20;12375:11;12381:5;12375:3;:11;:::i;:::-;-1:-1:-1;;;;;12361:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12361:26:0;-1:-1:-1;12338:49:0;-1:-1:-1;12412:5:0;12398:121;12423:3;12419:1;:7;12398:121;;;12461:11;12473:1;12461:14;;;;;;;;:::i;:::-;;;;;;;;;12444:3;12452:5;12448:1;:9;;;;:::i;:::-;12444:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;12502:3;;12398:121;;;-1:-1:-1;12536:3:0;12138:409;-1:-1:-1;;;12138:409:0:o;19877:1655::-;20046:11;:9;:11::i;:::-;20033:9;:24;20011:97;;;;-1:-1:-1;;;20011:97:0;;16224:2:1;20011:97:0;;;16206:21:1;16263:2;16243:18;;;16236:30;16302:25;16282:18;;;16275:53;16345:18;;20011:97:0;16022:347:1;20011:97:0;20141:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;20141:18:0;20163:10;20141:32;20119:100;;;;-1:-1:-1;;;20119:100:0;;16576:2:1;20119:100:0;;;16558:21:1;16615:2;16595:18;;;16588:30;-1:-1:-1;;;16634:18:1;;;16627:48;16692:18;;20119:100:0;16374:342:1;20119:100:0;20252:13;;;;:5;:13;;;;;:22;;;;;:31;20230:100;;;;-1:-1:-1;;;20230:100:0;;16923:2:1;20230:100:0;;;16905:21:1;16962:2;16942:18;;;16935:30;-1:-1:-1;;;16981:18:1;;;16974:49;17040:18;;20230:100:0;16721:343:1;20230:100:0;20399:1;20363:13;;;:5;:13;;;;;:26;;:33;20341:112;;;;-1:-1:-1;;;20341:112:0;;17271:2:1;20341:112:0;;;17253:21:1;17310:2;17290:18;;;17283:30;17349:27;17329:18;;;17322:55;17394:18;;20341:112:0;17069:349:1;20341:112:0;20521:13;;;;:5;:13;;;;;:26;;;:33;20486:24;;;;:31;:68;20464:152;;;;-1:-1:-1;;;20464:152:0;;;;;;;:::i;:::-;20673:13;;;;:5;:13;;;;;:26;;;:33;20708:25;;;;;20657:77;;20673:33;20657:15;:77::i;:::-;20649:85;;:5;:85;;;20627:153;;;;-1:-1:-1;;;20627:153:0;;18028:2:1;20627:153:0;;;18010:21:1;18067:2;18047:18;;;18040:30;-1:-1:-1;;;18086:18:1;;;18079:48;18144:18;;20627:153:0;17826:342:1;20627:153:0;20816:13;;;;:5;:13;;;;;;;:24;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20989:13;;;:27;;;21121:11;;20989:27;;20816:13;14492:6;;21106:26;;20989:27;21106:26;:::i;:::-;21105:40;;;;:::i;:::-;21077:68;;21196:54;21208:17;21235:1;21239:10;21196:11;:54::i;:::-;21328:32;21343:17;21328:12;:32;:::i;:::-;21297:13;;;;:5;:13;;;;;;;;:28;:63;21398:38;21411:10;21423:12;21398;:38::i;:::-;21483:41;21498:6;21506:1;21509:14;21483;:41::i;:::-;20000:1532;;19877:1655;;;:::o;6874:155::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;6954:6:::1;6973:2;-1:-1:-1::0;;;;;6965:16:0::1;6989:6;6965:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6953:47;;;7019:1;7011:10;;;::::0;::::1;;6942:87;6874:155:::0;;:::o;28353:1106::-;28422:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28422:25:0;28470:14;;;;:5;:14;;;;;:25;;:32;:37;;28466:438;;28531:361;;;;;;;;28587:1;28531:361;;;;28615:1;28531:361;;;;28649:1;-1:-1:-1;;;;;28531:361:0;;;;;28685:1;28531:361;;;;28729:1;-1:-1:-1;;;;;28717:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28717:14:0;-1:-1:-1;28531:361:0;;;;28776:1;28764:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28764:14:0;-1:-1:-1;28531:361:0;;28810:1;28531:361;;;;;;;;;;;;;;;;;28524:368;28353:1106;-1:-1:-1;;28353:1106:0:o;28466:438::-;28923:528;;;;;;;;-1:-1:-1;28975:14:0;;;:5;:14;;;;;;;:31;;;;28923:528;;29055:26;;;;28923:528;;;;29102:19;;-1:-1:-1;;;;;29102:19:0;28923:528;;;;29151:28;;;;28923:528;;;;29206:14;;;;;;;29102:19;29206:25;;;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;29206:25;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29260:5;:14;29266:7;29260:14;;;;;;;;;;;:27;;28923:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28923:528:0;;;-1:-1:-1;;29315:14:0;;;;:5;28923:528;29315:14;;;;;;;:26;;;;28923:528;;;;29366:23;;;;;;28923:528;;;;;;;;;29415:14;;;;;;:24;;;;;28923:528;;;;;;;;-1:-1:-1;28916:535:0;28353:1106::o;11672:135::-;11732:4;11756:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;11789:10:0;;;11672:135::o;21540:1385::-;21650:13;;;;:5;:13;;;;;:18;-1:-1:-1;;;;;21650:18:0;21672:10;21650:32;21628:100;;;;-1:-1:-1;;;21628:100:0;;16576:2:1;21628:100:0;;;16558:21:1;16615:2;16595:18;;;16588:30;-1:-1:-1;;;16634:18:1;;;16627:48;16692:18;;21628:100:0;16374:342:1;21628:100:0;21799:13;;;;:5;:13;;;;;:22;;;;;:31;21777:100;;;;-1:-1:-1;;;21777:100:0;;16923:2:1;21777:100:0;;;16905:21:1;16962:2;16942:18;;;16935:30;-1:-1:-1;;;16981:18:1;;;16974:49;17040:18;;21777:100:0;16721:343:1;21777:100:0;21946:1;21910:13;;;:5;:13;;;;;:26;;:33;21888:100;;;;-1:-1:-1;;;21888:100:0;;18883:2:1;21888:100:0;;;18865:21:1;18922:2;18902:18;;;18895:30;-1:-1:-1;;;18941:18:1;;;18934:43;18994:18;;21888:100:0;18681:337:1;21888:100:0;22056:13;;;;:5;:13;;;;;:26;;;:33;22021:24;;;;:31;:68;21999:152;;;;-1:-1:-1;;;21999:152:0;;;;;;;:::i;:::-;22194:13;;;;:5;:13;;;;;:22;;;:29;;-1:-1:-1;;22194:29:0;22219:4;22194:29;;;22313:27;;;22373:10;22351:74;;;;-1:-1:-1;;;22351:74:0;;19225:2:1;22351:74:0;;;19207:21:1;19264:2;19244:18;;;19237:30;-1:-1:-1;;;19283:18:1;;;19276:44;19337:18;;22351:74:0;19023:338:1;22351:74:0;22485:6;22460:21;:31;;22438:112;;;;-1:-1:-1;;;22438:112:0;;19568:2:1;22438:112:0;;;19550:21:1;19607:2;19587:18;;;19580:30;19646:33;19626:18;;;19619:61;19697:18;;22438:112:0;19366:355:1;22438:112:0;22587:13;;;;:5;:13;;;;;;;;;:25;;:34;;;22680:22;;-1:-1:-1;;;22680:22:0;;;;-1:-1:-1;;;;;;;;;;;1078:42:0;22680:20;;:22;;;;;22587:13;;22680:22;;;;;1078:42;22680:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22762:13;;;;:5;:13;;;;;;;:18;22666:125;;-1:-1:-1;;;22666:125:0;;22740:7;22666:125;;;19900:25:1;-1:-1:-1;;;;;22762:18:0;;;19941::1;;;19934:60;22666:44:0;;;;;22718:6;;19873:18:1;;22666:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22850:13:0;;;;:5;:13;;;;;;;;;:18;;22878:30;;;;;22840:77;;20207:25:1;;;20248:18;;;20241:34;20291:18;;;20284:34;;;-1:-1:-1;;;;;22850:18:0;;;;-1:-1:-1;22840:77:0;;-1:-1:-1;20195:2:1;20180:18;22840:77:0;;;;;;;21582:1343;21540:1385;:::o;22999:3913::-;-1:-1:-1;;;;;;;;;;;;;;;;1492:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1478:27:0;:10;-1:-1:-1;;;;;1478:27:0;;1456:94;;;;-1:-1:-1;;;1456:94:0;;20531:2:1;1456:94:0;;;20513:21:1;20570:2;20550:18;;;20543:30;-1:-1:-1;;;20589:18:1;;;20582:47;20646:18;;1456:94:0;20329:341:1;1456:94:0;-1:-1:-1;;;;;11533:24:0;;23180:14:::1;11533:24:::0;;;:13;:24;;;;;;23272:25:::1;11533:24:::0;23272:14:::1;:25::i;:::-;23355:11:::0;;;:47:::1;;-1:-1:-1::0;23400:1:0::1;23370:13:::0;;;:5:::1;:13;::::0;;;;:18;-1:-1:-1;;;;;23370:18:0::1;:32:::0;23355:47:::1;:81;;;-1:-1:-1::0;23406:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;23355:81;23351:190;;;23458:50;23477:9;23488:6;23496:11;;23458:50;;;;;;;;;:::i;:::-;;;;;;;;23523:7;6942:87;6874:155:::0;;:::o;23351:190::-:1;23580:15;23598:13:::0;;;:5:::1;:13;::::0;;;;:26:::1;::::0;::::1;:33:::0;23691:1:::1;23657:24:::0;;::::1;:31:::0;23598:33;;23657:35:::1;::::0;::::1;:::i;:::-;23646:7;:46;23642:155;;23714:50;23733:9;23744:6;23752:11;;23714:50;;;;;;;;;:::i;:::-;;;;;;;;23779:7;;6942:87;6874:155:::0;;:::o;23642:::-:1;23809:14;23851:13:::0;;;:5:::1;:13;::::0;;;;:25:::1;;::::0;23826:51:::1;::::0;23842:7;;23826:15:::1;:51::i;:::-;23809:68;;23935:14;23976:8;23959:25;;:11;;23971:1;23959:14;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;24026:13;::::0;;;:5:::1;:13;::::0;;;;;;:26:::1;::::0;::::1;:41:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;::::1;;;::::0;;;::::1;::::0;;;24157:13;;;;:24:::1;:33:::0;;23935:51;;-1:-1:-1;24157:24:0;24182:7;;24157:33;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;24145:45;;:8;:45;;::::0;24141:2764:::1;;24249:13;::::0;;;:5:::1;:13;::::0;;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24249:29:0::1;24274:4;24249:29;::::0;;24293:25:::1;::::0;::::1;:29:::0;;;24337:27:::1;::::0;::::1;:31:::0;;;24438:18;;-1:-1:-1;24466:30:0;;::::1;::::0;24428:72;;20207:25:1;;;20248:18;;;20241:34;20291:18;;;20284:34;;;;-1:-1:-1;;;;;24438:18:0;;::::1;::::0;24428:72:::1;::::0;20195:2:1;20180:18;24428:72:0::1;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;24554:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24590:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:28:::1;::::0;24547:82;;-1:-1:-1;;;24547:82:0;;24621:7:::1;24547:82;::::0;::::1;2526:25:1::0;-1:-1:-1;;;;;24547:35:0;;;::::1;::::0;::::1;::::0;24590:28;2499:18:1;;24547:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;24141:2764;;;24772:20;::::0;::::1;24718:19;24772:20:::0;;;:10:::1;:20;::::0;;;;;;;;24742:13;;;:5:::1;:13:::0;;;;;:27:::1;;::::0;14492:6:::1;::::0;24742:50:::1;::::0;::::1;:::i;:::-;24740:66;;;;:::i;:::-;24861:13;::::0;;;:5:::1;:13;::::0;;;;;;;:27:::1;::::0;::::1;:41:::0;;;24937:28:::1;::::0;24718:88;;-1:-1:-1;24923:42:0;::::1;:61:::0;::::1;;;;24983:1;24969:11;:15;24923:61;24919:1975;;;25048:17;-1:-1:-1::0;;;;;;;;;;;;;;;;25084:13:0::1;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25068:61;::::0;-1:-1:-1;;;25068:61:0;;25121:7:::1;25068:61;::::0;::::1;2526:25:1::0;-1:-1:-1;;;;;25068:52:0;;;::::1;::::0;::::1;::::0;2499:18:1;;25068:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25214:12;25243:13:::0;;;:5:::1;:13;::::0;;;;;;:28:::1;::::0;25048:81;;-1:-1:-1;25214:12:0;25229:42:::1;::::0;:11;:42:::1;:::i;:::-;25214:57;;25389:9;25382:4;:16;25378:1501;;;25466:14;25483:16;25490:9:::0;25483:4;:16:::1;:::i;:::-;25466:33;;25603:6;25572:5;:13;25578:6;25572:13;;;;;;;;;;;:27;;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;25680:17:0::1;::::0;-1:-1:-1;25700:31:0::1;25721:9:::0;25700:20:::1;:31::i;:::-;25680:51;;25772:9;25760;:21;25756:236;;;25946:21;25958:9:::0;25946;:21:::1;:::i;:::-;25914:13;::::0;;;:5:::1;:13;::::0;;;;:27:::1;;:54:::0;;:27;;:13;:54:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;25756:236:0::1;26077:13;::::0;;;:5:::1;:13;::::0;;;;;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;26077:29:0::1;26102:4;26077:29;::::0;;26220:27:::1;::::0;::::1;::::0;26308:25:::1;::::0;;::::1;:34:::0;;;26425:22;;-1:-1:-1;;;26425:22:0;;;;26220:27;;-1:-1:-1;;;;;;;;;;;1078:42:0;26425:20:::1;::::0;:22:::1;::::0;;::::1;::::0;;;;;;1078:42;26425:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26531:13;::::0;;;:5:::1;:13;::::0;;;;;;:18;26411:161;;-1:-1:-1;;;26411:161:0;;26497:7:::1;26411:161;::::0;::::1;19900:25:1::0;-1:-1:-1;;;;;26531:18:0;;::::1;19941::1::0;;;19934:60;26411:44:0;::::1;::::0;::::1;::::0;26463:6;;19873:18:1;;26411:161:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;26667:13:0::1;::::0;;;:5:::1;:13;::::0;;;;;;:18;;26695:30:::1;::::0;;::::1;::::0;26657:77;;-1:-1:-1;;;;;26667:18:0;;::::1;::::0;-1:-1:-1;26657:77:0::1;::::0;-1:-1:-1;26657:77:0::1;::::0;26673:6;;26727;;20207:25:1;;;20263:2;20248:18;;20241:34;;;;20306:2;20291:18;;20284:34;20195:2;20180:18;;20005:319;26657:77:0::1;;;;;;;;25400:1356;;;25378:1501;;;26833:26;26854:4;26833:20;:26::i;:::-;;25378:1501;24986:1908;;24919:1975;24649:2256;24141:2764;23128:3784;;;;22999:3913:::0;;;:::o;17167:273::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;17286:3:::1;17268:14;:21;;17246:91;;;::::0;-1:-1:-1;;;17246:91:0;;22014:2:1;17246:91:0::1;::::0;::::1;21996:21:1::0;22053:2;22033:18;;;22026:30;-1:-1:-1;;;22072:18:1;;;22065:50;22132:18;;17246:91:0::1;21812:344:1::0;17246:91:0::1;17358:11;:28:::0;;;17402:30:::1;::::0;2526:25:1;;;17402:30:0::1;::::0;2514:2:1;2499:18;17402:30:0::1;;;;;;;17167:273:::0;:::o;11815:315::-;11897:20;11941:7;;-1:-1:-1;;;;;11975:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11975:15:0;;11966:24;;12006:6;12001:122;12022:3;12018:1;:7;12001:122;;;12055:12;:24;12068:7;;12076:1;12068:10;;;;;;;:::i;:::-;;;;;;;12055:24;;;;;;;;;;;;;;;;;;;;;12043:6;12050:1;12043:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;12106:3;;12001:122;;;;11919:211;11815:315;;;;:::o;6720:68::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;6767:6:::1;:13:::0;;-1:-1:-1;;6767:13:0::1;6776:4;6767:13;::::0;;6720:68::o;6018:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6018:28:0;:::o;29467:370::-;29553:14;29591:7;29580:8;29591:7;-1:-1:-1;;;;;29642:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29616:42;;29674:6;29669:135;29690:3;29686:1;:7;29669:135;;;29736:23;29748:7;;29756:1;29748:10;;;;;;;:::i;:::-;;;;;;;29736:11;:23::i;:::-;29725:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;29711:8;29720:1;29711:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;29787:3;;29669:135;;;-1:-1:-1;29821:8:0;29467:370;-1:-1:-1;;;;29467:370:0:o;27997:348::-;28098:19;28141:8;;-1:-1:-1;;;;;28174:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28174:16:0;;28167:23;;28206:6;28201:137;28222:3;28218:1;:7;28201:137;;;28253:41;28269:8;;28278:1;28269:11;;;;;;;:::i;:::-;;;;;;;28282;28253:15;:41::i;:::-;28243:4;28248:1;28243:7;;;;;;;;:::i;:::-;:51;;;;:7;;;;;;;;;;;:51;28321:3;;28201:137;;;;28119:226;27997:348;;;;;:::o;7037:143::-;-1:-1:-1;;;;;;;;;;;;;;;;1198:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1184:29:0;:10;-1:-1:-1;;;;;1184:29:0;;1162:89;;;;-1:-1:-1;;;1162:89:0;;;;;;;:::i;:::-;7118:54:::1;7146:5;7153:10;7165:6;7118:27;:54::i;:::-;7037:143:::0;;:::o;29845:1304::-;29945:24;;;;;30151:7;;-1:-1:-1;;;;;30186:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30186:18:0;;30176:28;;30244:3;-1:-1:-1;;;;;30230:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30230:18:0;;30215:33;;30288:3;-1:-1:-1;;;;;30274:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30274:18:0;;30259:33;;30330:3;-1:-1:-1;;;;;30316:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30316:18:0;;30303:31;;30368:3;-1:-1:-1;;;;;30357:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30357:15:0;;30345:27;;30390:6;30385:757;30406:3;30402:1;:7;30385:757;;;30440:5;:17;30446:7;;30454:1;30446:10;;;;;;;:::i;:::-;;;;;;;30440:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;30440:22:0;30427:7;30435:1;30427:10;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;30427:35:0;;;-1:-1:-1;;;;;30427:35:0;;;;;30477:14;30494:5;:17;30500:7;;30508:1;30500:10;;;;;;;:::i;:::-;;;;;;;30494:17;;;;;;;;;;;:28;;:35;;;;30477:52;;30548:6;30558:1;30548:11;30544:555;;30598:1;30580:12;30593:1;30580:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;30636:1;30618:12;30631:1;30618:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;30672:1;30656:10;30667:1;30656:13;;;;;;;;:::i;:::-;;;;;;:17;;;;;30707:5;30692:9;30702:1;30692:12;;;;;;;;:::i;:::-;:20;;;:12;;;;;;;;;;;:20;30544:555;;;30771:5;:17;30777:7;;30785:1;30777:10;;;;;;;:::i;:::-;;;;;;;30771:17;;;;;;;;;;;:34;;;30753:12;30766:1;30753:15;;;;;;;;:::i;:::-;;;;;;:52;;;;;30868:5;:17;30874:7;;30882:1;30874:10;;;;;;;:::i;:::-;;;;;;;30868:17;;;;;;;;;;;:29;;;30850:12;30863:1;30850:15;;;;;;;;:::i;:::-;;;;;;:47;;;;;30948:5;:17;30954:7;;30962:1;30954:10;;;;;;;:::i;:::-;;;;;;;30948:17;;;;;;;;;;;:27;;;30932:10;30943:1;30932:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;31034:5;:17;31040:7;;31048:1;31040:10;;;;;;;:::i;:::-;;;;;;;31034:17;;;;;;;;;;;:26;;;;;;;;;;;;31019:9;31029:1;31019:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;30544:555;-1:-1:-1;31125:3:0;;30385:757;;;;30129:1020;29845:1304;;;;;;;;:::o;7752:260::-;7848:6;-1:-1:-1;;;;;1633:20:0;;1643:10;1633:20;1629:182;;1696:36;;-1:-1:-1;;;1696:36:0;;1721:10;1696:36;;;269:51:1;-1:-1:-1;;;;;;;;;;;1078:42:0;1696:24;;242:18:1;;1696:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1670:129;;;;-1:-1:-1;;;1670:129:0;;22645:2:1;1670:129:0;;;22627:21:1;22684:2;22664:18;;;22657:30;22723:33;22703:18;;;22696:61;22774:18;;1670:129:0;22443:355:1;1670:129:0;-1:-1:-1;;;;;;;;;;;;;;;;1892:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;1870:91;;;::::0;-1:-1:-1;;;1870:91:0;;23005:2:1;1870:91:0::1;::::0;::::1;22987:21:1::0;23044:2;23024:18;;;23017:30;-1:-1:-1;;;23063:18:1;;;23056:46;23119:18;;1870:91:0::1;22803:340:1::0;1870:91:0::1;7902:6:::2;::::0;::::2;;7901:7;7879:63;;;::::0;-1:-1:-1;;;7879:63:0;;23350:2:1;7879:63:0::2;::::0;::::2;23332:21:1::0;23389:1;23369:18;;;23362:29;-1:-1:-1;;;23407:18:1;;;23400:36;23453:18;;7879:63:0::2;23148:329:1::0;7879:63:0::2;7977:27;7987:6;7995:8;;7977:9;:27::i;:::-;7752:260:::0;;;;:::o;7534:105::-;7576:7;-1:-1:-1;;;;;;;;;;;;;;;;7608:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7603:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14194:60::-;14231:19;14145:1;14186;14231:19;:::i;:::-;:23;;14253:1;14231:23;:::i;:::-;14194:60;:::o;7350:172::-;-1:-1:-1;;;;;;;;;;;;;;;;7453:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7439:75;;-1:-1:-1;;;7439:75:0;;-1:-1:-1;;;;;23674:32:1;;;7439:75:0;;;23656:51:1;23743:32;;;23723:18;;;23716:60;7439:44:0;;;;;;;7491:9;;23629:18:1;;7439:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7188:154;-1:-1:-1;;;;;;;;;;;;;;;;7277:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7260:74;;-1:-1:-1;;;7260:74:0;;-1:-1:-1;;;;;24007:32:1;;;7260:74:0;;;23989:51:1;24056:18;;;24049:34;;;7326:7:0;24099:18:1;;;24092:34;7260:51:0;;;;;;;23962:18:1;;7260:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7188:154;;:::o;10417:778::-;10570:16;-1:-1:-1;;;;;;;;;;;;;;;;10594:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10589:33:0;;10630:11;:9;:11::i;:::-;10589:185;;-1:-1:-1;;;;;;10589:185:0;;;;;;;;;;24307:25:1;;;24380:4;24368:17;;24348:18;;;24341:45;24280:18;;10589:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10858:24:0;;;;;;:13;:24;;;;;;10570:204;;-1:-1:-1;10858:29:0;10836:95;;;;-1:-1:-1;;;10836:95:0;;24853:2:1;10836:95:0;;;24835:21:1;24892:2;24872:18;;;24865:30;-1:-1:-1;;;24911:18:1;;;24904:46;24967:18;;10836:95:0;24651:340:1;10836:95:0;-1:-1:-1;;;;;11002:24:0;;;;;;:13;:24;;;;;;;;;:33;;;11085:15;;-1:-1:-1;;;;;;11085:15:0;;;;-1:-1:-1;;;;;;;;;;;1078:42:0;11085:13;;:15;;;;;11002:24;;11085:15;;;;;1078:42;11085:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11078:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11160:27;11180:6;11160:27;;;;2526:25:1;;2514:2;2499:18;;2380:177;11203:224:0;-1:-1:-1;;;;;;;;;;;;;;;;11309:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11302:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;11395:24:0;;;;;:13;:24;;;;;11388:31;11203:224::o;26920:367::-;26984:17;27020:10;;27016:264;;-1:-1:-1;;;;;;;;;;;;;;;;27103:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27144:7;;27096:65;;-1:-1:-1;;;27096:65:0;;27127:7;27096:65;;;25198:25:1;-1:-1:-1;;;;;27144:7:0;;;25239:18:1;;;25232:60;25308:18;;;25301:34;;;27096:30:0;;;;;25171:18:1;;27096:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27231:7;;;;;;;;;-1:-1:-1;;;;;27231:7:0;-1:-1:-1;;;;;27231:13:0;;-1:-1:-1;;;;;;;;;;;;;;;;27245:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27231:37;;-1:-1:-1;;;;;;27231:37:0;;;;;;;-1:-1:-1;;;;;287:32:1;;;27231:37:0;;;269:51:1;242:18;;27231:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27016:264::-;26920:367;;;:::o;3505:449::-;3737:45;;;-1:-1:-1;;;;;25538:32:1;;;3737:45:0;;;25520:51:1;25587:18;;;;25580:34;;;3737:45:0;;;;;;;;;;25493:18:1;;;;3737:45:0;;;;;;;-1:-1:-1;;;;;3737:45:0;-1:-1:-1;;;3737:45:0;;;3726:57;;-1:-1:-1;;;;3726:10:0;;;;:57;;3737:45;3726:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3690:93;;;;3816:7;:57;;;;-1:-1:-1;3828:11:0;;:16;;:44;;;3859:4;3848:24;;;;;;;;;;;;:::i;:::-;3794:152;;;;-1:-1:-1;;;3794:152:0;;26119:2:1;3794:152:0;;;26101:21:1;26158:2;26138:18;;;26131:30;26197:34;26177:18;;;26170:62;-1:-1:-1;;;26248:18:1;;;26241:43;26301:19;;3794:152:0;25917:409:1;17787:2082:0;17908:14;17925:11;:9;:11::i;:::-;17908:28;-1:-1:-1;17993:14:0;;;;;18149:65;;;;18160:8;18149:65;:::i;:::-;17978:236;;;;;;;;;;18290:6;18277:9;:19;;18255:84;;;;-1:-1:-1;;;18255:84:0;;27225:2:1;18255:84:0;;;27207:21:1;27264:2;27244:18;;;27237:30;-1:-1:-1;;;27283:18:1;;;27276:45;27338:18;;18255:84:0;27023:339:1;18255:84:0;18372:21;18386:6;18372:13;:21::i;:::-;:29;;18397:4;18372:29;18350:94;;;;-1:-1:-1;;;18350:94:0;;27569:2:1;18350:94:0;;;27551:21:1;27608:2;27588:18;;;27581:30;-1:-1:-1;;;27627:18:1;;;27620:45;27682:18;;18350:94:0;27367:339:1;18350:94:0;18488:14;18524:13;;;:5;:13;;;;;:25;;;18505:45;;18488:14;;18505:15;:45::i;:::-;18488:62;;18596:8;18583:21;;:10;:21;;;18561:95;;;;-1:-1:-1;;;18561:95:0;;27913:2:1;18561:95:0;;;27895:21:1;27952:2;27932:18;;;27925:30;27991:26;27971:18;;;27964:54;28035:18;;18561:95:0;27711:348:1;18561:95:0;18708:22;18733:18;18745:6;18733:9;:18;:::i;:::-;18708:43;;18801:1;18784:14;:18;18762:86;;;;-1:-1:-1;;;18762:86:0;;28266:2:1;18762:86:0;;;28248:21:1;28305:2;28285:18;;;28278:30;-1:-1:-1;;;28324:18:1;;;28317:48;28382:18;;18762:86:0;28064:342:1;18762:86:0;18909:25;14492:6;18955:11;;18938:14;:28;;;;:::i;:::-;18937:42;;;;:::i;:::-;18909:70;;19056:43;19068:17;19087:3;19092:6;19056:11;:43::i;:::-;19141:13;;;;:5;:13;;;;;:27;;-1:-1:-1;;;;;;19141:27:0;-1:-1:-1;;;;;19141:27:0;;;;;19179:25;;;:39;;;19229:22;;;:30;;-1:-1:-1;;19229:30:0;;;19296:15;19270:23;;;;:41;19353:34;19370:17;19353:14;:34;:::i;:::-;19322:13;;;;:5;:13;;;;;;;:28;;;:65;;;;19398:24;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19450:13;;;:27;;;:44;;;19505:30;;:47;;;19594:31;19610:6;19328;19594:15;:31::i;:::-;19663:36;19676:6;19684:14;19663:12;:36::i;:::-;19760:6;-1:-1:-1;;;;;19748:27:0;;19768:6;19748:27;;;;2526:25:1;;2514:2;2499:18;;2380:177;19748:27:0;;;;;;;;19820:41;19835:6;19843:1;19846:14;19820;:41::i;:::-;17865:2004;;;;;;;;;17787:2082;;;:::o;10137:272::-;10245:40;;-1:-1:-1;;;10245:40:0;;-1:-1:-1;;;;;24007:32:1;;;10245:40:0;;;23989:51:1;10269:7:0;24056:18:1;;;24049:34;24099:18;;;24092:34;;;10245:7:0;:15;;;;23962:18:1;;10245:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10339:11:0;:24;;;;;;;;;;;;-1:-1:-1;10374:20:0;;;:12;10339:24;10374:20;;;;;:27;;-1:-1:-1;;10374:27:0;;;;;;;-1:-1:-1;;;10137:272:0:o;331:346:1:-;399:6;407;460:2;448:9;439:7;435:23;431:32;428:52;;;476:1;473;466:12;428:52;-1:-1:-1;;521:23:1;;;641:2;626:18;;;613:32;;-1:-1:-1;331:346:1:o;871:226::-;930:6;983:2;971:9;962:7;958:23;954:32;951:52;;;999:1;996;989:12;951:52;-1:-1:-1;1044:23:1;;871:226;-1:-1:-1;871:226:1:o;1918:156::-;1984:20;;2044:4;2033:16;;2023:27;;2013:55;;2064:1;2061;2054:12;2079:296;2145:6;2153;2206:2;2194:9;2185:7;2181:23;2177:32;2174:52;;;2222:1;2219;2212:12;2174:52;2245:27;2262:9;2245:27;:::i;:::-;2235:37;2341:2;2326:18;;;;2313:32;;-1:-1:-1;;;2079:296:1:o;2562:420::-;2615:3;2653:5;2647:12;2680:6;2675:3;2668:19;2712:4;2707:3;2703:14;2696:21;;2751:4;2744:5;2740:16;2774:1;2784:173;2798:6;2795:1;2792:13;2784:173;;;2859:13;;2847:26;;2902:4;2893:14;;;;2930:17;;;;2820:1;2813:9;2784:173;;;-1:-1:-1;2973:3:1;;2562:420;-1:-1:-1;;;;2562:420:1:o;2987:261::-;3166:2;3155:9;3148:21;3129:4;3186:56;3238:2;3227:9;3223:18;3215:6;3186:56;:::i;:::-;3178:64;2987:261;-1:-1:-1;;;2987:261:1:o;3253:182::-;3310:6;3363:2;3351:9;3342:7;3338:23;3334:32;3331:52;;;3379:1;3376;3369:12;3331:52;3402:27;3419:9;3402:27;:::i;3440:416::-;3515:6;3523;3531;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3645:23;;;-1:-1:-1;3711:36:1;3743:2;3728:18;;3711:36;:::i;:::-;3440:416;;3701:46;;-1:-1:-1;;;3820:2:1;3805:18;;;;3792:32;;3440:416::o;3861:131::-;-1:-1:-1;;;;;3936:31:1;;3926:42;;3916:70;;3982:1;3979;3972:12;3916:70;3861:131;:::o;3997:367::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4181:9;4168:23;4200:31;4225:5;4200:31;:::i;4369:429::-;4420:3;4458:5;4452:12;4485:6;4480:3;4473:19;4517:4;4512:3;4508:14;4501:21;;4556:4;4549:5;4545:16;4579:1;4589:184;4603:6;4600:1;4597:13;4589:184;;;4668:13;;4683:4;4664:24;4652:37;;4718:4;4709:14;;;;4746:17;;;;4625:1;4618:9;4589:184;;4803:1139;5004:2;4993:9;4986:21;5049:6;5043:13;5038:2;5027:9;5023:18;5016:41;5111:2;5103:6;5099:15;5093:22;5088:2;5077:9;5073:18;5066:50;4967:4;5163:2;5155:6;5151:15;5145:22;5176:52;5224:2;5213:9;5209:18;5195:12;-1:-1:-1;;;;;80:31:1;68:44;;14:104;5176:52;;5283:2;5275:6;5271:15;5265:22;5259:3;5248:9;5244:19;5237:51;5337:3;5329:6;5325:16;5319:23;5379:6;5373:3;5362:9;5358:19;5351:35;5409:63;5467:3;5456:9;5452:19;5436:14;5409:63;:::i;:::-;5395:77;;5521:3;5513:6;5509:16;5503:23;5595:2;5591:7;5579:9;5571:6;5567:22;5563:36;5557:3;5546:9;5542:19;5535:65;5623:50;5666:6;5650:14;5623:50;:::i;:::-;5609:64;;;5728:3;5720:6;5716:16;5710:23;5704:3;5693:9;5689:19;5682:52;5783:3;5775:6;5771:16;5765:23;5797:52;5844:3;5833:9;5829:19;5813:14;1172:13;1165:21;1153:34;;1102:91;5797:52;;5907:3;5899:6;5895:16;5889:23;5880:6;5869:9;5865:22;5858:55;5930:6;5922:14;;;4803:1139;;;;:::o;6372:129::-;-1:-1:-1;;;;;6450:5:1;6446:30;6439:5;6436:41;6426:69;;6491:1;6488;6481:12;6506:367;6569:8;6579:6;6633:3;6626:4;6618:6;6614:17;6610:27;6600:55;;6651:1;6648;6641:12;6600:55;-1:-1:-1;6674:20:1;;-1:-1:-1;;;;;6706:30:1;;6703:50;;;6749:1;6746;6739:12;6703:50;6786:4;6778:6;6774:17;6762:29;;6846:3;6839:4;6829:6;6826:1;6822:14;6814:6;6810:27;6806:38;6803:47;6800:67;;;6863:1;6860;6853:12;6800:67;6506:367;;;;;:::o;6878:570::-;6972:6;6980;6988;7041:2;7029:9;7020:7;7016:23;7012:32;7009:52;;;7057:1;7054;7047:12;7009:52;7096:9;7083:23;7115:30;7139:5;7115:30;:::i;:::-;7164:5;-1:-1:-1;7220:2:1;7205:18;;7192:32;-1:-1:-1;;;;;7236:30:1;;7233:50;;;7279:1;7276;7269:12;7233:50;7318:70;7380:7;7371:6;7360:9;7356:22;7318:70;:::i;:::-;6878:570;;7407:8;;-1:-1:-1;7292:96:1;;-1:-1:-1;;;;6878:570:1:o;7453:437::-;7539:6;7547;7600:2;7588:9;7579:7;7575:23;7571:32;7568:52;;;7616:1;7613;7606:12;7568:52;7656:9;7643:23;-1:-1:-1;;;;;7681:6:1;7678:30;7675:50;;;7721:1;7718;7711:12;7675:50;7760:70;7822:7;7813:6;7802:9;7798:22;7760:70;:::i;:::-;7849:8;;7734:96;;-1:-1:-1;7453:437:1;-1:-1:-1;;;;7453:437:1:o;7895:433::-;7945:3;7983:5;7977:12;8010:6;8005:3;7998:19;8042:4;8037:3;8033:14;8026:21;;8081:4;8074:5;8070:16;8104:1;8114:189;8128:6;8125:1;8122:13;8114:189;;;8203:13;;8196:21;8189:29;8177:42;;8248:4;8239:14;;;;8276:17;;;;8150:1;8143:9;8114:189;;8333:252;8506:2;8495:9;8488:21;8469:4;8526:53;8575:2;8564:9;8560:18;8552:6;8526:53;:::i;8590:250::-;8675:1;8685:113;8699:6;8696:1;8693:13;8685:113;;;8775:11;;;8769:18;8756:11;;;8749:39;8721:2;8714:10;8685:113;;;-1:-1:-1;;8832:1:1;8814:16;;8807:27;8590:250::o;8845:991::-;9005:4;9053:2;9042:9;9038:18;9083:2;9072:9;9065:21;9106:6;9141;9135:13;9172:6;9164;9157:22;9210:2;9199:9;9195:18;9188:25;;9272:2;9262:6;9259:1;9255:14;9244:9;9240:30;9236:39;9222:53;;9310:2;9302:6;9298:15;9331:1;9341:466;9355:6;9352:1;9349:13;9341:466;;;9448:2;9444:7;9432:9;9424:6;9420:22;9416:36;9411:3;9404:49;9482:6;9476:13;9524:2;9518:9;9555:8;9547:6;9540:24;9577:74;9642:8;9637:2;9629:6;9625:15;9620:2;9616;9612:11;9577:74;:::i;:::-;9717:2;9694:17;-1:-1:-1;;9690:31:1;9678:44;;;;9724:2;9674:53;;;;-1:-1:-1;9785:12:1;;;;9750:15;;;;;9377:1;9370:9;9341:466;;;-1:-1:-1;9824:6:1;;8845:991;-1:-1:-1;;;;;;8845:991:1:o;9841:551::-;9936:6;9944;9952;10005:2;9993:9;9984:7;9980:23;9976:32;9973:52;;;10021:1;10018;10011:12;9973:52;10061:9;10048:23;-1:-1:-1;;;;;10086:6:1;10083:30;10080:50;;;10126:1;10123;10116:12;10080:50;10165:70;10227:7;10218:6;10207:9;10203:22;10165:70;:::i;:::-;10254:8;;10139:96;;-1:-1:-1;10358:2:1;10343:18;;;;10330:32;;9841:551;-1:-1:-1;;;;9841:551:1:o;10397:255::-;10572:2;10561:9;10554:21;10535:4;10592:54;10642:2;10631:9;10627:18;10619:6;10592:54;:::i;10888:1424::-;11384:3;11397:22;;;11468:13;;11369:19;;;11490:22;;;11336:4;;11582;11570:17;;;11543:3;11528:19;;;11336:4;11615:199;11629:6;11626:1;11623:13;11615:199;;;11694:13;;-1:-1:-1;;;;;11690:39:1;11678:52;;11759:4;11787:17;;;;11750:14;;;;11726:1;11644:9;11615:199;;;11619:3;;11861:9;11856:3;11852:19;11845:4;11834:9;11830:20;11823:49;11895:41;11932:3;11924:6;11895:41;:::i;:::-;11881:55;;;11984:9;11976:6;11972:22;11967:2;11956:9;11952:18;11945:50;12018:44;12055:6;12047;12018:44;:::i;:::-;12004:58;;12110:9;12102:6;12098:22;12093:2;12082:9;12078:18;12071:50;12144:44;12181:6;12173;12144:44;:::i;:::-;12130:58;;12237:9;12229:6;12225:22;12219:3;12208:9;12204:19;12197:51;12265:41;12299:6;12291;12265:41;:::i;:::-;12257:49;10888:1424;-1:-1:-1;;;;;;;;10888:1424:1:o;12317:721::-;12396:6;12404;12412;12465:2;12453:9;12444:7;12440:23;12436:32;12433:52;;;12481:1;12478;12471:12;12433:52;12520:9;12507:23;12539:31;12564:5;12539:31;:::i;:::-;12589:5;-1:-1:-1;12645:2:1;12630:18;;12617:32;-1:-1:-1;;;;;12661:30:1;;12658:50;;;12704:1;12701;12694:12;12658:50;12727:22;;12780:4;12772:13;;12768:27;-1:-1:-1;12758:55:1;;12809:1;12806;12799:12;12758:55;12849:2;12836:16;-1:-1:-1;;;;;12867:6:1;12864:30;12861:50;;;12907:1;12904;12897:12;12861:50;12952:7;12947:2;12938:6;12934:2;12930:15;12926:24;12923:37;12920:57;;;12973:1;12970;12963:12;12920:57;12317:721;;13004:2;12996:11;;;;;-1:-1:-1;13026:6:1;;-1:-1:-1;;;12317:721:1:o;13275:251::-;13345:6;13398:2;13386:9;13377:7;13373:23;13369:32;13366:52;;;13414:1;13411;13404:12;13366:52;13446:9;13440:16;13465:31;13490:5;13465:31;:::i;13531:334::-;13733:2;13715:21;;;13772:2;13752:18;;;13745:30;-1:-1:-1;;;13806:2:1;13791:18;;13784:40;13856:2;13841:18;;13531:334::o;13870:127::-;13931:10;13926:3;13922:20;13919:1;13912:31;13962:4;13959:1;13952:15;13986:4;13983:1;13976:15;14002:112;14034:1;14060;14050:35;;14065:18;;:::i;:::-;-1:-1:-1;14099:9:1;;14002:112::o;14119:127::-;14180:10;14175:3;14171:20;14168:1;14161:31;14211:4;14208:1;14201:15;14235:4;14232:1;14225:15;14251:151;14341:4;14334:12;;;14320;;;14316:31;;14359:14;;14356:40;;;14376:18;;:::i;14659:148::-;14747:4;14726:12;;;14740;;;14722:31;;14765:13;;14762:39;;;14781:18;;:::i;14812:125::-;14877:9;;;14898:10;;;14895:36;;;14911:18;;:::i;15625:128::-;15692:9;;;15713:11;;;15710:37;;;15727:18;;:::i;15758:127::-;15819:10;15814:3;15810:20;15807:1;15800:31;15850:4;15847:1;15840:15;15874:4;15871:1;15864:15;15890:127;15951:10;15946:3;15942:20;15939:1;15932:31;15982:4;15979:1;15972:15;16006:4;16003:1;15996:15;17423:398;17625:2;17607:21;;;17664:2;17644:18;;;17637:30;17703:34;17698:2;17683:18;;17676:62;-1:-1:-1;;;17769:2:1;17754:18;;17747:32;17811:3;17796:19;;17423:398::o;18173:168::-;18246:9;;;18277;;18294:15;;;18288:22;;18274:37;18264:71;;18315:18;;:::i;18346:120::-;18386:1;18412;18402:35;;18417:18;;:::i;:::-;-1:-1:-1;18451:9:1;;18346:120::o;20675:611::-;-1:-1:-1;;;;;20919:31:1;;20901:50;;20982:2;20967:18;;20960:34;;;21030:2;21025;21010:18;;21003:30;;;21049:18;;21042:34;;;-1:-1:-1;;;;;;21088:31:1;;21085:51;;;21132:1;21129;21122:12;21085:51;21166:6;21163:1;21159:14;21224:6;21216;21210:3;21199:9;21195:19;21182:49;21252:22;;;;21276:3;21248:32;;20675:611;-1:-1:-1;;;;;20675:611:1:o;21623:184::-;21693:6;21746:2;21734:9;21725:7;21721:23;21717:32;21714:52;;;21762:1;21759;21752:12;21714:52;-1:-1:-1;21785:16:1;;21623:184;-1:-1:-1;21623:184:1:o;22161:277::-;22228:6;22281:2;22269:9;22260:7;22256:23;22252:32;22249:52;;;22297:1;22294;22287:12;22249:52;22329:9;22323:16;22382:5;22375:13;22368:21;22361:5;22358:32;22348:60;;22404:1;22401;22394:12;24397:249;24466:6;24519:2;24507:9;24498:7;24494:23;24490:32;24487:52;;;24535:1;24532;24525:12;24487:52;24567:9;24561:16;24586:30;24610:5;24586:30;:::i;25625:287::-;25754:3;25792:6;25786:13;25808:66;25867:6;25862:3;25855:4;25847:6;25843:17;25808:66;:::i;:::-;25890:16;;;;;25625:287;-1:-1:-1;;25625:287:1:o;26331:687::-;26432:6;26440;26448;26456;26464;26517:3;26505:9;26496:7;26492:23;26488:33;26485:53;;;26534:1;26531;26524:12;26485:53;26579:23;;;-1:-1:-1;26699:2:1;26684:18;;26671:32;;-1:-1:-1;26748:36:1;26780:2;26765:18;;26748:36;:::i;:::-;26738:46;;26836:2;26825:9;26821:18;26808:32;26849:33;26874:7;26849:33;:::i;:::-;26331:687;;;;-1:-1:-1;26331:687:1;;26981:3;26966:19;26953:33;;26331:687;-1:-1:-1;;26331:687:1:o
Swarm Source
ipfs://9d3dcfa10808d923c6427b4fae63609b7edac37cce12a2317ed57a753ada9c95
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.