// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
/// @title Nottingham Bank
/// @notice A last-depositor-standing game themed on the Robin Hood story,
/// deployed on the Robinhood Chain network (native gas token, not ETH —
/// all "ether"/wei units below just denote the chain's 18-decimal
/// native currency, the same way they would on any EVM chain).
///
/// Every deposit is a "tribute" to the Sheriff of Nottingham's vault:
/// - 50% to the pot (the "Sheriff's Hoard")
/// - 10% protocol fee (the "Crown's Tax")
/// - 40% split pro-rata among everyone who deposited earlier this
/// round (the "Merry Men's Cut" — rob from the new, give to the old)
///
/// The qualifying deposit floor rises 1% per entry. The round clock
/// starts at 2 hours and shortens by 5 seconds per qualifying entry,
/// floored at 15 minutes — an accelerating endgame rather than a
/// fixed reset window.
///
/// BULLS EYE: a 7-day backstop. Every deposit also earns "arrows"
/// (1 per 0.001 native token deposited). If the round is still
/// unclaimed 7 days after its first deposit, both new deposits and
/// the normal finalize() win path stop — resolution shifts entirely
/// to a weighted random draw among arrow-holders. 10 winners are
/// drawn without replacement, weighted by arrow count, paying out
/// 40/20/15/10/5/2/2/2/2/2% of the Hoard. If there aren't enough
/// unique arrow-holders to fill all 10 places, the unallocated tier
/// percentages are queued (`pendingPotRollover`) and seeded into the
/// very next round's pot rather than being permanently stranded.
///
/// @dev Rewards use a MasterChef-style accumulator (accRewardPerShare) so
/// payouts don't require iterating over depositors. Reward claims
/// are pull-based. Rounds are namespaced by roundId so most state
/// resets cheaply between rounds (no storage-clearing loops needed).
/// Arrows are the deliberate EXCEPTION: they're namespaced by a
/// separate `ticketEpoch` counter that only advances when a Bulls
/// Eye draw actually completes, so a wallet's ticket count persists
/// across any number of rounds that end normally (leader wins) and
/// only resets to 0 once a jackpot has actually been drawn.
/// Confirm the Robinhood Chain's native token actually uses 18
/// decimals before deploying — if it doesn't, INITIAL_FLOOR,
/// ARROW_UNIT, and the `ether`-unit constants below need rescaling.
///
/// RANDOMNESS: Bulls Eye currently uses a future-blockhash commit
/// scheme (see triggerBullsEye/drawBullsEye) rather than Chainlink
/// VRF. This works on any EVM chain with no external dependency,
/// but has a narrower trust assumption than VRF: an Arbitrum
/// sequencer (Robinhood Chain is an Arbitrum Orbit chain) has some
/// theoretical influence over block production and so, in
/// principle, could try to bias a draw. If/when Chainlink VRF is
/// confirmed live on Robinhood Chain, swap _bullsEyeSeed()'s
/// implementation for a VRF request/callback — the rest of the
/// draw logic (weighted selection, tiers, payouts) doesn't need to
/// change.
contract NottinghamBank {
// ------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------
uint256 public constant INITIAL_FLOOR = 0.001 ether;
uint256 public constant FLOOR_RATCHET_BPS = 10100; // x1.01 per qualifying deposit
uint256 public constant BPS_DENOMINATOR = 10000;
uint256 public constant INITIAL_ROUND_DURATION = 2 hours; // 7200s
uint256 public constant MIN_ROUND_DURATION = 900; // seconds (15 minutes)
uint256 public constant CLOCK_DECAY_PER_ENTRY = 5; // seconds
uint256 public constant MAX_DEPOSIT_MULTIPLIER = 20; // cap = 20x current floor
uint256 public constant POT_BPS = 5000; // 50% Sheriff's Hoard
uint256 public constant FEE_BPS = 1000; // 10% Crown's Tax
uint256 public constant REWARD_BPS = 4000; // 40% Merry Men's Cut
address public constant PROTOCOL_FEE_WALLET =
0xB8f0c931F4E4684B5Cdd2E9db84e57bC41c57413;
uint256 private constant ACC_PRECISION = 1e18;
// --- Bulls Eye constants ---
uint256 public constant BULLSEYE_WINDOW = 7 days;
uint256 public constant ARROW_UNIT = 0.001 ether; // 1 arrow per this much deposited
uint256 public constant NUM_BULLSEYE_WINNERS = 10;
uint256 public constant BULLSEYE_BLOCK_DELAY = 5; // blocks to wait for an unpredictable future blockhash
uint256 public constant MAX_DRAW_RETRIES = 40; // per placement, if a draw keeps hitting already-won addresses
// ------------------------------------------------------------------
// Round state
// ------------------------------------------------------------------
struct Depositor {
uint256 amount; // total qualifying native-token deposited this round (= reward shares)
uint256 rewardDebt; // accounting checkpoint, scaled by ACC_PRECISION
uint256 claimable; // settled, unclaimed rewards
}
// A running cumulative-sum checkpoint of arrows, appended on every
// deposit that earns at least 1 arrow. Enables O(log n) weighted
// random selection via binary search, without iterating depositors.
struct ArrowCheckpoint {
address holder;
uint256 cumulativeArrows; // cumulative sum INCLUSIVE through this checkpoint
}
uint256 public roundId;
uint256 public ticketEpoch; // advances ONLY on a completed Bulls Eye
// draw — normal round endings leave it
// untouched, so arrows persist across
// consecutive normally-ending rounds
uint256 public floor; // current minimum qualifying deposit
uint256 public roundDuration; // current reset duration, shrinks each entry
uint256 public deadline; // timestamp the round expires (normal win path)
address public leader; // last qualifying depositor
uint256 public pot; // accumulated Sheriff's Hoard for this round
// Round-indexed (not a single running total) so that a round's reward
// math is never diluted or contaminated by earlier or later rounds'
// deposits, and so a round's accumulator snapshot stays valid forever --
// this is what makes historical claim(rid) calls both isolated per
// round AND safe to compute at any point in the future.
mapping(uint256 => uint256) public totalShares; // sum of qualifying deposits, per round
mapping(uint256 => uint256) public accRewardPerShare; // per round
bool public finalized;
uint256 public totalPlayers;
// Unallocated Bulls Eye tier payouts (when there aren't enough unique
// arrow-holders to fill all 10 places) accumulate here instead of
// being stranded, and are seeded into the very next round's starting
// pot by _startNewRound(). The funds were never sent anywhere, so
// this is purely an accounting reassignment — the contract's actual
// balance already covers it.
uint256 public pendingPotRollover;
mapping(uint256 => mapping(address => Depositor)) public depositors;
mapping(uint256 => mapping(address => bool)) private hasEnteredRound;
// --- Bulls Eye state, namespaced by roundId like `depositors` so past
// rounds' draws remain permanently queryable ---
mapping(uint256 => uint256) public bullsEyeDeadline; // 0 until the round's first deposit
mapping(uint256 => bool) public bullsEyeTriggered;
mapping(uint256 => uint256) public bullsEyeTargetBlock;
mapping(uint256 => bool) public bullsEyeDrawn;
// --- Arrow tracking, namespaced by ticketEpoch (NOT roundId) — arrows
// persist across consecutive normal-ending rounds within the same
// epoch, and only reset when a Bulls Eye draw advances the epoch ---
mapping(uint256 => uint256) public totalArrows;
mapping(uint256 => mapping(address => uint256)) public arrows;
mapping(uint256 => ArrowCheckpoint[]) private arrowCheckpoints;
mapping(uint256 => mapping(address => bool)) public bullsEyeHasWon;
mapping(uint256 => mapping(address => uint256)) public bullsEyeClaimable;
mapping(uint256 => address[10]) private bullsEyeWinners;
// ------------------------------------------------------------------
// Events
// ------------------------------------------------------------------
event Deposit(uint256 indexed roundId, address indexed player, uint256 amount, uint256 newFloor, uint256 newDeadline);
event Claimed(uint256 indexed roundId, address indexed player, uint256 amount);
event Finalized(uint256 indexed roundId, address indexed winner, uint256 potAmount);
event NewRound(uint256 indexed roundId, uint256 floor, uint256 roundDuration);
event BullsEyeArmed(uint256 indexed roundId, uint256 targetBlock);
event BullsEyeRearmed(uint256 indexed roundId, uint256 newTargetBlock);
event BullsEyeWinner(uint256 indexed roundId, uint256 place, address indexed winner, uint256 payout);
event BullsEyeResolved(uint256 indexed roundId, uint256 winnersFound, uint256 potDistributed);
event BullsEyeClaimed(uint256 indexed roundId, address indexed player, uint256 amount);
event TicketEpochAdvanced(uint256 indexed newEpoch, uint256 indexed endedInRound);
event PotRolloverQueued(uint256 indexed roundId, uint256 amount);
// ------------------------------------------------------------------
// Errors
// ------------------------------------------------------------------
error RoundFinalizedAlready();
error RoundExpired();
error RoundNotExpired();
error RoundStillLive();
error BelowFloor();
error AboveCap();
error NothingToClaim();
error NoLeader();
error TransferFailed();
error BullsEyeWindowElapsed(); // deposit()/finalize() called after the 7-day backstop passed
error BullsEyeWindowNotReached(); // triggerBullsEye() called before the 7-day mark
error BullsEyeAlreadyTriggered();
error BullsEyeNotTriggered();
error BullsEyeAlreadyDrawn();
error BullsEyeBlockNotReached();
constructor() {
ticketEpoch = 1;
_startNewRound();
}
// ------------------------------------------------------------------
// Core actions
// ------------------------------------------------------------------
/// @notice Pay tribute (in the Robinhood Chain's native token) to defend
/// the pot. Must be between floor and cap.
function deposit() external payable {
if (finalized) revert RoundFinalizedAlready();
if (bullsEyeDrawn[roundId]) revert RoundFinalizedAlready();
uint256 rid = roundId;
uint256 beDeadline = bullsEyeDeadline[rid];
if (beDeadline != 0 && block.timestamp >= beDeadline) revert BullsEyeWindowElapsed();
if (block.timestamp >= deadline) revert RoundExpired();
uint256 value = msg.value;
uint256 currentFloor = floor;
if (value < currentFloor) revert BelowFloor();
uint256 cap = currentFloor * MAX_DEPOSIT_MULTIPLIER;
if (value > cap) revert AboveCap();
if (!hasEnteredRound[rid][msg.sender]) {
hasEnteredRound[rid][msg.sender] = true;
totalPlayers += 1;
}
// arm the 7-day Bulls Eye backstop on this round's first deposit
if (beDeadline == 0) {
bullsEyeDeadline[rid] = block.timestamp + BULLSEYE_WINDOW;
}
// award arrows for this deposit — namespaced by ticketEpoch so they
// persist across rounds that end normally, only resetting when a
// Bulls Eye draw advances the epoch (see ticketEpoch declaration)
uint256 newArrows = value / ARROW_UNIT;
if (newArrows > 0) {
uint256 epoch = ticketEpoch;
arrows[epoch][msg.sender] += newArrows;
uint256 newTotalArrows = totalArrows[epoch] + newArrows;
totalArrows[epoch] = newTotalArrows;
arrowCheckpoints[epoch].push(ArrowCheckpoint({holder: msg.sender, cumulativeArrows: newTotalArrows}));
}
// split the tribute
uint256 rewardCut = (value * REWARD_BPS) / BPS_DENOMINATOR;
uint256 feeCut = (value * FEE_BPS) / BPS_DENOMINATOR;
uint256 potCut = value - rewardCut - feeCut; // remainder absorbs rounding dust
if (totalShares[rid] > 0) {
accRewardPerShare[rid] += (rewardCut * ACC_PRECISION) / totalShares[rid];
} else {
// no earlier players yet to reward — the Merry Men's Cut rolls into the pot
potCut += rewardCut;
}
pot += potCut;
// Settle AFTER accRewardPerShare is updated, using the depositor's
// OLD (pre-this-deposit) amount. This matters when someone deposits
// more than once in a round: their earlier shares are entitled to a
// slice of THIS deposit's own reward cut (they were "earlier
// depositors" relative to this new deposit), so settling must
// happen against the just-updated accumulator, not before it.
_settle(rid, msg.sender);
Depositor storage d = depositors[rid][msg.sender];
d.amount += value;
totalShares[rid] += value;
d.rewardDebt = (d.amount * accRewardPerShare[rid]) / ACC_PRECISION;
// ratchet the floor up 1%
floor = (currentFloor * FLOOR_RATCHET_BPS) / BPS_DENOMINATOR;
// shrink the clock, floored at MIN_ROUND_DURATION
if (roundDuration > MIN_ROUND_DURATION) {
uint256 next = roundDuration - CLOCK_DECAY_PER_ENTRY;
roundDuration = next < MIN_ROUND_DURATION ? MIN_ROUND_DURATION : next;
}
deadline = block.timestamp + roundDuration;
leader = msg.sender;
(bool sent, ) = PROTOCOL_FEE_WALLET.call{value: feeCut}("");
if (!sent) revert TransferFailed();
emit Deposit(rid, msg.sender, value, floor, deadline);
}
/// @notice Claim your Merry Men's Cut. Available immediately, mid-round,
/// AND after the round has ended -- `rid` is explicit, unlike most
/// other functions which implicitly use the current round. Because
/// accRewardPerShare[rid] and totalShares[rid] are permanent
/// per-round snapshots (see state variable declarations), this is
/// safe and correct for any round, no matter how many rounds have
/// started since.
function claim(uint256 rid) external {
_settle(rid, msg.sender);
Depositor storage d = depositors[rid][msg.sender];
uint256 amount = d.claimable;
if (amount == 0) revert NothingToClaim();
d.claimable = 0;
(bool sent, ) = msg.sender.call{value: amount}("");
if (!sent) revert TransferFailed();
emit Claimed(rid, msg.sender, amount);
}
/// @notice Anyone can finalize once the clock runs out. The leader takes the Hoard.
function finalize() external {
if (finalized) revert RoundFinalizedAlready();
if (bullsEyeDrawn[roundId]) revert RoundFinalizedAlready();
uint256 beDeadline = bullsEyeDeadline[roundId];
if (beDeadline != 0 && block.timestamp >= beDeadline) revert BullsEyeWindowElapsed();
if (block.timestamp < deadline) revert RoundNotExpired();
if (leader == address(0)) revert NoLeader();
// Cache roundId locally, same as winner/winnings below — it must NOT
// be read from storage after the external call. If `winner` is a
// contract, its receive()/fallback can reenter newRound() (allowed,
// since `finalized` is already true at that point), which would
// bump the real `roundId` in storage mid-call. Reading storage for
// the emit below would then report the WRONG round as finalized —
// harmless to funds (winnings are already computed and pot already
// zeroed before the call), but it would corrupt the event data
// anything indexing off it (e.g. the Past Winners indexer) relies on.
uint256 rid = roundId;
finalized = true;
address winner = leader;
uint256 winnings = pot;
pot = 0;
(bool sent, ) = winner.call{value: winnings}("");
if (!sent) revert TransferFailed();
emit Finalized(rid, winner, winnings);
}
/// @notice Start a fresh round after the previous one is finalized (either
/// via normal finalize() or via a completed Bulls Eye draw).
function newRound() external {
if (!finalized && !bullsEyeDrawn[roundId]) revert RoundStillLive();
_startNewRound();
}
// ------------------------------------------------------------------
// Bulls Eye
// ------------------------------------------------------------------
/// @notice Callable by anyone once 7 days have passed since the round's
/// first deposit with the round still unclaimed. Locks in a
/// future block whose hash will seed the draw.
function triggerBullsEye() external {
uint256 rid = roundId;
if (finalized) revert RoundFinalizedAlready();
if (bullsEyeTriggered[rid]) revert BullsEyeAlreadyTriggered();
uint256 beDeadline = bullsEyeDeadline[rid];
if (beDeadline == 0 || block.timestamp < beDeadline) revert BullsEyeWindowNotReached();
bullsEyeTriggered[rid] = true;
uint256 target = block.number + BULLSEYE_BLOCK_DELAY;
bullsEyeTargetBlock[rid] = target;
emit BullsEyeArmed(rid, target);
}
/// @notice Callable by anyone once the target block has passed. Draws
/// 10 arrow-weighted winners without replacement and credits
/// their tiered payouts as claimable. If the target block's
/// hash is no longer available (>256 blocks passed with nobody
/// calling), re-arms with a fresh target instead of stalling.
/// Any tier that can't find an eligible (not-yet-won) holder
/// within the retry budget is left unpaid for THIS round — its
/// share is queued in `pendingPotRollover` and seeded into the
/// next round's starting pot by _startNewRound(), instead of
/// being permanently stranded in the contract.
function drawBullsEye() external {
uint256 rid = roundId;
if (!bullsEyeTriggered[rid]) revert BullsEyeNotTriggered();
if (bullsEyeDrawn[rid]) revert BullsEyeAlreadyDrawn();
uint256 targetBlock = bullsEyeTargetBlock[rid];
if (block.number <= targetBlock) revert BullsEyeBlockNotReached();
bytes32 bh = blockhash(targetBlock);
if (bh == bytes32(0)) {
// window expired before anyone called this — re-arm rather than
// permanently strand the pot
uint256 newTarget = block.number + BULLSEYE_BLOCK_DELAY;
bullsEyeTargetBlock[rid] = newTarget;
emit BullsEyeRearmed(rid, newTarget);
return;
}
uint256 epoch = ticketEpoch;
uint256 totalArrowsSnapshot = totalArrows[epoch];
bytes32 baseSeed = keccak256(abi.encodePacked(bh, address(this), rid, epoch, totalArrowsSnapshot));
finalized = true;
bullsEyeDrawn[rid] = true;
uint256 potSnapshot = pot;
pot = 0;
// Split into a helper call (rather than one large function body) to
// keep each function's local-variable count under the EVM's stack
// depth limit -- the combined loop bodies plus this function's own
// locals were tripping a "stack too deep" compiler error.
(uint256 winnersFound, uint256 totalPayout) =
_runBullsEyeDraw(rid, epoch, baseSeed, totalArrowsSnapshot, potSnapshot);
// Whatever wasn't claimed by a winning tier stays in the contract's
// actual balance (it was never sent anywhere) — queue it so the
// NEXT round starts with it already in the pot, instead of leaving
// it permanently unaccounted for.
uint256 unallocated = potSnapshot - totalPayout;
if (unallocated > 0) {
pendingPotRollover += unallocated;
emit PotRolloverQueued(rid, unallocated);
}
// the ticket pool is fully consumed by this draw — advance the
// epoch so the next round's arrows start clean at 0. Rounds that
// end normally (without ever reaching this function) never do
// this, which is exactly what lets arrows persist across them.
ticketEpoch = epoch + 1;
emit BullsEyeResolved(rid, winnersFound, potSnapshot);
emit TicketEpochAdvanced(epoch + 1, rid);
}
/// @dev Runs the 10-place weighted draw loop and credits payouts.
/// Split out of drawBullsEye() to keep stack depth manageable.
function _runBullsEyeDraw(
uint256 rid,
uint256 epoch,
bytes32 baseSeed,
uint256 totalArrowsSnapshot,
uint256 potSnapshot
) internal returns (uint256 winnersFound, uint256 totalPayout) {
for (uint256 place = 0; place < NUM_BULLSEYE_WINNERS; place++) {
if (totalArrowsSnapshot == 0) break;
address winner = _findEligibleWinner(rid, epoch, baseSeed, place, totalArrowsSnapshot);
// couldn't find a not-yet-won holder within the retry budget
// (only realistically happens with very few unique holders) --
// stop rather than pay a repeat winner. Remaining tier
// percentages are handled by the caller (rolled forward), not lost.
if (winner == address(0)) break;
bullsEyeHasWon[rid][winner] = true;
bullsEyeWinners[rid][place] = winner;
uint256 payout = (potSnapshot * _tierBps(place)) / BPS_DENOMINATOR;
bullsEyeClaimable[rid][winner] += payout;
totalPayout += payout;
winnersFound += 1;
emit BullsEyeWinner(rid, place, winner, payout);
}
}
/// @dev Retry loop for a single placement: repeatedly reseeds and picks
/// a ticket until it lands on a holder who hasn't already won this
/// round, or gives up (returns address(0)) after MAX_DRAW_RETRIES.
/// Split out of drawBullsEye() to keep stack depth manageable.
function _findEligibleWinner(
uint256 rid,
uint256 epoch,
bytes32 baseSeed,
uint256 place,
uint256 totalArrowsSnapshot
) internal view returns (address) {
for (uint256 attempt = 0; attempt < MAX_DRAW_RETRIES; attempt++) {
bytes32 drawSeed = keccak256(abi.encodePacked(baseSeed, place, attempt));
uint256 pick = uint256(drawSeed) % totalArrowsSnapshot;
address candidate = _resolveTicket(epoch, pick);
if (!bullsEyeHasWon[rid][candidate]) {
return candidate;
}
}
return address(0);
}
/// @notice Claim Bulls Eye winnings for a given round (pull-based, same
/// pattern as claim(), so one bad recipient can't block the draw).
function claimBullsEye(uint256 rid) external {
uint256 amount = bullsEyeClaimable[rid][msg.sender];
if (amount == 0) revert NothingToClaim();
bullsEyeClaimable[rid][msg.sender] = 0;
(bool sent, ) = msg.sender.call{value: amount}("");
if (!sent) revert TransferFailed();
emit BullsEyeClaimed(rid, msg.sender, amount);
}
function getBullsEyeWinners(uint256 rid) external view returns (address[10] memory) {
return bullsEyeWinners[rid];
}
/// @dev Binary search over the cumulative-arrow checkpoints for the
/// holder whose range contains `pick`. O(log n) in checkpoint count.
function _resolveTicket(uint256 epoch, uint256 pick) internal view returns (address) {
ArrowCheckpoint[] storage checkpoints = arrowCheckpoints[epoch];
uint256 lo = 0;
uint256 hi = checkpoints.length - 1;
while (lo < hi) {
uint256 mid = (lo + hi) / 2;
if (checkpoints[mid].cumulativeArrows > pick) {
hi = mid;
} else {
lo = mid + 1;
}
}
return checkpoints[lo].holder;
}
/// @dev Prize tiers: 40/20/15/10/5/2/2/2/2/2% (place is 0-indexed).
function _tierBps(uint256 place) internal pure returns (uint256) {
if (place == 0) return 4000;
if (place == 1) return 2000;
if (place == 2) return 1500;
if (place == 3) return 1000;
if (place == 4) return 500;
return 200; // places 5-9 (6th through 10th)
}
// ------------------------------------------------------------------
// Views
// ------------------------------------------------------------------
function pendingRewards(uint256 rid, address player) external view returns (uint256) {
Depositor storage d = depositors[rid][player];
uint256 accumulated = (d.amount * accRewardPerShare[rid]) / ACC_PRECISION;
return d.claimable + accumulated - d.rewardDebt;
}
function currentCap() external view returns (uint256) {
return floor * MAX_DEPOSIT_MULTIPLIER;
}
function timeLeft() external view returns (uint256) {
if (deadline == type(uint256).max || block.timestamp >= deadline) return 0;
return deadline - block.timestamp;
}
function gameStarted() external view returns (bool) {
return deadline != type(uint256).max;
}
function bullsEyeTimeLeft() external view returns (uint256) {
uint256 beDeadline = bullsEyeDeadline[roundId];
if (beDeadline == 0 || block.timestamp >= beDeadline) return 0;
return beDeadline - block.timestamp;
}
/// @notice Convenience view: a player's arrow count in the CURRENT
/// ticket epoch (spans back across any rounds that ended
/// normally since the last Bulls Eye draw).
function currentArrows(address player) external view returns (uint256) {
return arrows[ticketEpoch][player];
}
/// @notice Convenience view: total arrows in the CURRENT ticket epoch.
function currentTotalArrows() external view returns (uint256) {
return totalArrows[ticketEpoch];
}
// ------------------------------------------------------------------
// Internal
// ------------------------------------------------------------------
function _settle(uint256 rid, address player) internal {
Depositor storage d = depositors[rid][player];
if (d.amount > 0) {
uint256 accumulated = (d.amount * accRewardPerShare[rid]) / ACC_PRECISION;
uint256 pending = accumulated - d.rewardDebt;
if (pending > 0) {
d.claimable += pending;
}
d.rewardDebt = accumulated;
}
}
function _startNewRound() internal {
roundId += 1;
floor = INITIAL_FLOOR;
roundDuration = INITIAL_ROUND_DURATION;
deadline = type(uint256).max; // no expiry until the first deposit starts the clock
leader = address(0);
// Seed this round's pot with any unallocated Bulls Eye rollover from
// the previous round instead of always starting at zero. The funds
// were never transferred out, so this is purely a bookkeeping move.
pot = pendingPotRollover;
pendingPotRollover = 0;
// totalShares[roundId] and accRewardPerShare[roundId] need no explicit
// reset here -- as mappings, a fresh roundId key already reads as 0
// by default. This is also precisely why they were changed from bare
// state variables to per-round mappings: a bare variable had to be
// zeroed here, which destroyed the just-ended round's final value the
// moment a new round started, making late claims for that round
// impossible to compute correctly (see claim(uint256 rid)).
finalized = false;
totalPlayers = 0;
// Bulls Eye per-round state (deadline/trigger/target/drawn/winners)
// resets implicitly for the new roundId — mappings default-init.
// ticketEpoch is deliberately NOT touched here: arrows persist
// across rounds that end normally and only reset when a Bulls
// Eye draw explicitly advances the epoch (see drawBullsEye()).
emit NewRound(roundId, floor, roundDuration);
}
receive() external payable {
revert("use deposit()");
}
}[
{
"type": "constructor",
"inputs": [],
"stateMutability": "nonpayable"
},
{
"name": "AboveCap",
"type": "error",
"inputs": []
},
{
"name": "BelowFloor",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeAlreadyDrawn",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeAlreadyTriggered",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeBlockNotReached",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeNotTriggered",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeWindowElapsed",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeWindowNotReached",
"type": "error",
"inputs": []
},
{
"name": "NoLeader",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "RoundExpired",
"type": "error",
"inputs": []
},
{
"name": "RoundFinalizedAlready",
"type": "error",
"inputs": []
},
{
"name": "RoundNotExpired",
"type": "error",
"inputs": []
},
{
"name": "RoundStillLive",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "BullsEyeArmed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "targetBlock",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BullsEyeClaimed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BullsEyeRearmed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "newTargetBlock",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BullsEyeResolved",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winnersFound",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "potDistributed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BullsEyeWinner",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "place",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "winner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "payout",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Deposit",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFloor",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newDeadline",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Finalized",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "potAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "NewRound",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "floor",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "roundDuration",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PotRolloverQueued",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TicketEpochAdvanced",
"type": "event",
"inputs": [
{
"name": "newEpoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "endedInRound",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ARROW_UNIT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "BULLSEYE_BLOCK_DELAY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "BULLSEYE_WINDOW",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "CLOCK_DECAY_PER_ENTRY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "FLOOR_RATCHET_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "INITIAL_FLOOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "INITIAL_ROUND_DURATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_DEPOSIT_MULTIPLIER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_DRAW_RETRIES",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_ROUND_DURATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "NUM_BULLSEYE_WINNERS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "POT_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "PROTOCOL_FEE_WALLET",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "REWARD_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "accRewardPerShare",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "arrows",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeClaimable",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeDeadline",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeDrawn",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeHasWon",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeTargetBlock",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeTimeLeft",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bullsEyeTriggered",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "rid",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimBullsEye",
"type": "function",
"inputs": [
{
"name": "rid",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "currentArrows",
"type": "function",
"inputs": [
{
"name": "player",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentCap",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentTotalArrows",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "deadline",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "deposit",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "depositors",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "rewardDebt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "claimable",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "drawBullsEye",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "finalize",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "finalized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "floor",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "gameStarted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "getBullsEyeWinners",
"type": "function",
"inputs": [
{
"name": "rid",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address[10]",
"internalType": "address[10]"
}
],
"stateMutability": "view"
},
{
"name": "leader",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "newRound",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "pendingPotRollover",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingRewards",
"type": "function",
"inputs": [
{
"name": "rid",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "player",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pot",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "roundDuration",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "roundId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ticketEpoch",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "timeLeft",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalArrows",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalPlayers",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalShares",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "triggerBullsEye",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608060405234801561000f575f5ffd5b506001808190555061002561002a60201b60201c565b6101d0565b60015f5f82825461003b9190610167565b9250508190555066038d7ea4c68000600281905550611c206003819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004819055505f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b546006819055505f600b819055505f60095f6101000a81548160ff0219169083151502179055505f600a819055505f547f5aec57d81928b24d30b1a2aec0d23d693412c37d7ec106b5d8259413716bb1f46002546003546040516101279291906101a9565b60405180910390a2565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61017182610131565b915061017c83610131565b92508282019050808211156101945761019361013a565b5b92915050565b6101a381610131565b82525050565b5f6040820190506101bc5f83018561019a565b6101c9602083018461019a565b9392505050565b613110806101dd5f395ff3fe608060405260043610610302575f3560e01c806383e9ee2b1161018f578063bf333f2c116100db578063d433160e11610094578063f60cdcf61161006e578063f60cdcf614610bc4578063f6809e0a14610bee578063f7cb789a14610c18578063f879147c14610c4257610342565b8063d433160e14610b48578063dc854ea814610b84578063e1a4521814610b9a57610342565b8063bf333f2c14610a4a578063c194efbf14610a74578063c20d409e14610ab0578063c5b1d9aa14610aec578063d0e30db014610b02578063d18df53c14610b0c57610342565b80639b349b9f11610148578063ac27a2f311610122578063ac27a2f314610990578063af027296146109ba578063b3f05b97146109f6578063b91c213c14610a2057610342565b80639b349b9f146108ec5780639c13ca6014610928578063ab5669ad1461096657610342565b806383e9ee2b146107e0578063856ed7031461080a5780638a6e00bd146108345780638c29b9b31461085e5780638cd221c9146108865780639699ac22146108b057610342565b806347b12bfc1161024e57806357680940116102075780636d8b3175116101e15780636d8b31751461071457806377a64fd5146107505780637b4f02bd1461077a57806380a50cfb146107a457610342565b806357680940146106725780635946cfa4146106ae5780635e123ce4146106ea57610342565b806347b12bfc1461058a5780634ba2363a146105b45780634bb278f3146105de57806350e6a439146105f4578063524904e01461061e57806356daa1551461064857610342565b80632750beaa116102bb578063370e716911610295578063370e7169146104e4578063379607f51461050e578063406953631461053657806340eedabb1461056057610342565b80632750beaa1461046657806329dcb0cf146104905780633098eb2e146104ba57610342565b806308874c0f146103465780630930214d146103705780631300a6d1146103ac57806313f2dad0146103d6578063186e8464146104125780631a1852111461043c57610342565b36610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990612b02565b60405180910390fd5b5f5ffd5b348015610351575f5ffd5b5061035a610c58565b6040516103679190612b38565b60405180910390f35b34801561037b575f5ffd5b5061039660048036038101906103919190612bd9565b610c5e565b6040516103a39190612b38565b60405180910390f35b3480156103b7575f5ffd5b506103c0610c7e565b6040516103cd9190612b38565b60405180910390f35b3480156103e1575f5ffd5b506103fc60048036038101906103f79190612c17565b610cd2565b6040516104099190612b38565b60405180910390f35b34801561041d575f5ffd5b50610426610ce7565b6040516104339190612b38565b60405180910390f35b348015610447575f5ffd5b50610450610ced565b60405161045d9190612b38565b60405180910390f35b348015610471575f5ffd5b5061047a610cf3565b6040516104879190612b38565b60405180910390f35b34801561049b575f5ffd5b506104a4610cf8565b6040516104b19190612b38565b60405180910390f35b3480156104c5575f5ffd5b506104ce610cfe565b6040516104db9190612b38565b60405180910390f35b3480156104ef575f5ffd5b506104f8610d03565b6040516105059190612b38565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f9190612c17565b610d0e565b005b348015610541575f5ffd5b5061054a610ea5565b6040516105579190612b38565b60405180910390f35b34801561056b575f5ffd5b50610574610eab565b6040516105819190612c51565b60405180910390f35b348015610595575f5ffd5b5061059e610ed0565b6040516105ab9190612b38565b60405180910390f35b3480156105bf575f5ffd5b506105c8610ed6565b6040516105d59190612b38565b60405180910390f35b3480156105e9575f5ffd5b506105f2610edc565b005b3480156105ff575f5ffd5b506106086111dc565b6040516106159190612b38565b60405180910390f35b348015610629575f5ffd5b506106326111e1565b60405161063f9190612c51565b60405180910390f35b348015610653575f5ffd5b5061065c6111f9565b6040516106699190612b38565b60405180910390f35b34801561067d575f5ffd5b5061069860048036038101906106939190612c17565b611213565b6040516106a59190612b38565b60405180910390f35b3480156106b9575f5ffd5b506106d460048036038101906106cf9190612bd9565b611228565b6040516106e19190612b38565b60405180910390f35b3480156106f5575f5ffd5b506106fe611248565b60405161070b9190612c84565b60405180910390f35b34801561071f575f5ffd5b5061073a60048036038101906107359190612c17565b611274565b6040516107479190612c84565b60405180910390f35b34801561075b575f5ffd5b50610764611291565b6040516107719190612b38565b60405180910390f35b348015610785575f5ffd5b5061078e611297565b60405161079b9190612b38565b60405180910390f35b3480156107af575f5ffd5b506107ca60048036038101906107c59190612bd9565b61129c565b6040516107d79190612c84565b60405180910390f35b3480156107eb575f5ffd5b506107f46112c6565b6040516108019190612b38565b60405180910390f35b348015610815575f5ffd5b5061081e6112cd565b60405161082b9190612b38565b60405180910390f35b34801561083f575f5ffd5b506108486112e2565b6040516108559190612b38565b60405180910390f35b348015610869575f5ffd5b50610884600480360381019061087f9190612c17565b6112e8565b005b348015610891575f5ffd5b5061089a6114b5565b6040516108a79190612b38565b60405180910390f35b3480156108bb575f5ffd5b506108d660048036038101906108d19190612c17565b6114ba565b6040516108e39190612c84565b60405180910390f35b3480156108f7575f5ffd5b50610912600480360381019061090d9190612c17565b6114d7565b60405161091f9190612d42565b60405180910390f35b348015610933575f5ffd5b5061094e60048036038101906109499190612bd9565b611568565b60405161095d93929190612d5c565b60405180910390f35b348015610971575f5ffd5b5061097a611599565b6040516109879190612b38565b60405180910390f35b34801561099b575f5ffd5b506109a461159f565b6040516109b19190612b38565b60405180910390f35b3480156109c5575f5ffd5b506109e060048036038101906109db9190612c17565b6115e5565b6040516109ed9190612b38565b60405180910390f35b348015610a01575f5ffd5b50610a0a6115fa565b604051610a179190612c84565b60405180910390f35b348015610a2b575f5ffd5b50610a3461160c565b604051610a419190612b38565b60405180910390f35b348015610a55575f5ffd5b50610a5e611611565b604051610a6b9190612b38565b60405180910390f35b348015610a7f575f5ffd5b50610a9a6004803603810190610a959190612c17565b611617565b604051610aa79190612b38565b60405180910390f35b348015610abb575f5ffd5b50610ad66004803603810190610ad19190612c17565b61162c565b604051610ae39190612b38565b60405180910390f35b348015610af7575f5ffd5b50610b00611641565b005b610b0a6116ba565b005b348015610b17575f5ffd5b50610b326004803603810190610b2d9190612bd9565b611e82565b604051610b3f9190612b38565b60405180910390f35b348015610b53575f5ffd5b50610b6e6004803603810190610b699190612d91565b611f31565b604051610b7b9190612b38565b60405180910390f35b348015610b8f575f5ffd5b50610b98611f88565b005b348015610ba5575f5ffd5b50610bae61210d565b604051610bbb9190612b38565b60405180910390f35b348015610bcf575f5ffd5b50610bd8612113565b604051610be59190612b38565b60405180910390f35b348015610bf9575f5ffd5b50610c02612119565b604051610c0f9190612b38565b60405180910390f35b348015610c23575f5ffd5b50610c2c612124565b604051610c399190612b38565b60405180910390f35b348015610c4d575f5ffd5b50610c5661212a565b005b61277481565b6016602052815f5260405f20602052805f5260405f205f91509150505481565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004541480610cb157506004544210155b15610cbe575f9050610ccf565b42600454610ccc9190612de9565b90505b90565b6007602052805f5260405f205f915090505481565b60015481565b611c2081565b601481565b60045481565b602881565b66038d7ea4c6800081565b610d188133612447565b5f600c5f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816002015490505f8103610da8576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82600201819055505f3373ffffffffffffffffffffffffffffffffffffffff1682604051610dd690612e49565b5f6040518083038185875af1925050503d805f8114610e10576040519150601f19603f3d011682016040523d82523d5f602084013e610e15565b606091505b5050905080610e50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16847f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610e979190612b38565b60405180910390a350505050565b60025481565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fa081565b60065481565b60095f9054906101000a900460ff1615610f22576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f5f5481526020019081526020015f205f9054906101000a900460ff1615610f78576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f5f5481526020019081526020015f205490505f8114158015610f9e5750804210155b15610fd5576040517f397160ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454421015611010576040517e2900a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611096576040517fef96c6dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f549050600160095f6101000a81548160ff0219169083151502179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60065490505f6006819055505f8273ffffffffffffffffffffffffffffffffffffffff168260405161110c90612e49565b5f6040518083038185875af1925050503d805f8114611146576040519150601f19603f3d011682016040523d82523d5f602084013e61114b565b606091505b5050905080611186576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16847f48f30422ceddef46ded34f69ebff2c090f0804e80938b8f2447e769f204ff8f3846040516111cd9190612b38565b60405180910390a35050505050565b600581565b73b8f0c931f4e4684b5cdd2e9db84e57bc41c5741381565b5f60125f60015481526020019081526020015f2054905090565b6012602052805f5260405f205f915090505481565b6013602052815f5260405f20602052805f5260405f205f91509150505481565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004541415905090565b600f602052805f5260405f205f915054906101000a900460ff1681565b61138881565b600a81565b6015602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b62093a8081565b5f60146002546112dd9190612e5d565b905090565b600b5481565b5f60165f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611371576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60165f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3373ffffffffffffffffffffffffffffffffffffffff16826040516113e790612e49565b5f6040518083038185875af1925050503d805f8114611421576040519150601f19603f3d011682016040523d82523d5f602084013e611426565b606091505b5050905080611461576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16837f2728985f641963d6ebba7367e3044d0d40539bfb8753b30acc9ecc3a60ef322c846040516114a89190612b38565b60405180910390a3505050565b5f5481565b6011602052805f5260405f205f915054906101000a900460ff1681565b6114df612a85565b60175f8381526020019081526020015f20600a806020026040519081016040528092919082600a801561155c576020028201915b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611513575b50505050509050919050565b600c602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154905083565b61038481565b5f5f600e5f5f5481526020019081526020015f205490505f8114806115c45750804210155b156115d2575f9150506115e2565b42816115de9190612de9565b9150505b90565b6010602052805f5260405f205f915090505481565b60095f9054906101000a900460ff1681565b600581565b6103e881565b6008602052805f5260405f205f915090505481565b600e602052805f5260405f205f915090505481565b60095f9054906101000a900460ff16158015611679575060115f5f5481526020019081526020015f205f9054906101000a900460ff16155b156116b0576040517fc413a2f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b861251e565b565b60095f9054906101000a900460ff1615611700576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f5f5481526020019081526020015f205f9054906101000a900460ff1615611756576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5490505f600e5f8381526020019081526020015f205490505f81141580156117805750804210155b156117b7576040517f397160ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045442106117f2576040517f9e6d804f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f600254905080821015611836576040517f4e7e291600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6014826118449190612e5d565b905080831115611880576040517f4d1dd38900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5f8681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661195b576001600d5f8781526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f8282546119539190612e9e565b925050819055505b5f84036119875762093a80426119719190612e9e565b600e5f8781526020019081526020015f20819055505b5f66038d7ea4c680008461199b9190612efe565b90505f811115611af8575f60015490508160135f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611a069190612e9e565b925050819055505f8260125f8481526020019081526020015f2054611a2b9190612e9e565b90508060125f8481526020019081526020015f208190555060145f8381526020019081526020015f2060405180604001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505050505b5f612710610fa086611b0a9190612e5d565b611b149190612efe565b90505f6127106103e887611b289190612e5d565b611b329190612efe565b90505f818388611b429190612de9565b611b4c9190612de9565b90505f60075f8b81526020019081526020015f20541115611bc25760075f8a81526020019081526020015f2054670de0b6b3a764000084611b8d9190612e5d565b611b979190612efe565b60085f8b81526020019081526020015f205f828254611bb69190612e9e565b92505081905550611bd1565b8281611bce9190612e9e565b90505b8060065f828254611be29190612e9e565b92505081905550611bf38933612447565b5f600c5f8b81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905087815f015f828254611c549190612e9e565b925050819055508760075f8c81526020019081526020015f205f828254611c7b9190612e9e565b92505081905550670de0b6b3a764000060085f8c81526020019081526020015f2054825f0154611cab9190612e5d565b611cb59190612efe565b816001018190555061271061277488611cce9190612e5d565b611cd89190612efe565b6002819055506103846003541115611d17575f6005600354611cfa9190612de9565b90506103848110611d0b5780611d0f565b6103845b600381905550505b60035442611d259190612e9e565b6004819055503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73b8f0c931f4e4684b5cdd2e9db84e57bc41c5741373ffffffffffffffffffffffffffffffffffffffff1684604051611da490612e49565b5f6040518083038185875af1925050503d805f8114611dde576040519150601f19603f3d011682016040523d82523d5f602084013e611de3565b606091505b5050905080611e1e576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168b7f996a417e6461fc8f287ec9a6c2e9afb764a1d6fbdaa6570826ae99855b453aff8b600254600454604051611e6d93929190612d5c565b60405180910390a35050505050505050505050565b5f5f600c5f8581526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f670de0b6b3a764000060085f8781526020019081526020015f2054835f0154611efc9190612e5d565b611f069190612efe565b90508160010154818360020154611f1d9190612e9e565b611f279190612de9565b9250505092915050565b5f60135f60015481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f5f54905060095f9054906101000a900460ff1615611fd3576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5f8281526020019081526020015f205f9054906101000a900460ff1615612028576040517f7c0e13e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f8381526020019081526020015f205490505f81148061204a57508042105b15612081576040517f06eb619000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f5f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505f6005436120b89190612e9e565b90508060105f8581526020019081526020015f2081905550827f4461811d45d3170b71e8217bd82945d352e200efde2f104573ac30137675cbcf826040516121009190612b38565b60405180910390a2505050565b61271081565b600a5481565b66038d7ea4c6800081565b60035481565b5f5f549050600f5f8281526020019081526020015f205f9054906101000a900460ff16612183576040517f325d56b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8281526020019081526020015f205f9054906101000a900460ff16156121d8576040517f73ba940000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60105f8381526020019081526020015f20549050804311612226576040517f4e9e108900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f814090505f5f1b810361229b575f6005436122429190612e9e565b90508060105f8681526020019081526020015f2081905550837f47da63561651a51f90d1c277834a77dddc7e3159e7f5805ffa7e282cac59accd8260405161228a9190612b38565b60405180910390a250505050612445565b5f60015490505f60125f8381526020019081526020015f205490505f83308785856040516020016122d0959493929190612fbc565b604051602081830303815290604052805190602001209050600160095f6101000a81548160ff021916908315150217905550600160115f8881526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60065490505f6006819055505f5f6123478987868887612625565b915091505f81846123589190612de9565b90505f8111156123b35780600b5f8282546123739190612e9e565b92505081905550897f9f13e0c56f9fd59cec9ead90b5d02e3aa45e77367809b6d6771c32c4eafc37e7826040516123aa9190612b38565b60405180910390a25b6001876123c09190612e9e565b600181905550897fdcefbfb90c7aba4fa4b392c84220156b797a1f831786ef622828ebf94cc1123684866040516123f892919061301a565b60405180910390a28960018861240e9190612e9e565b7f764a84e6bfc0d2db391c0b3cb7265b80668ec5342febb74a1560de2c629c36b960405160405180910390a3505050505050505050505b565b5f600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f01541115612519575f670de0b6b3a764000060085f8681526020019081526020015f2054835f01546124cb9190612e5d565b6124d59190612efe565b90505f8260010154826124e89190612de9565b90505f81111561250d5780836002015f8282546125059190612e9e565b925050819055505b81836001018190555050505b505050565b60015f5f82825461252f9190612e9e565b9250508190555066038d7ea4c68000600281905550611c206003819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004819055505f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b546006819055505f600b819055505f60095f6101000a81548160ff0219169083151502179055505f600a819055505f547f5aec57d81928b24d30b1a2aec0d23d693412c37d7ec106b5d8259413716bb1f460025460035460405161261b92919061301a565b60405180910390a2565b5f5f5f5f90505b600a81101561284f575f85031561284f575f61264b898989858a61285a565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612686575061284f565b600160155f8b81526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060175f8b81526020019081526020015f2083600a811061270e5761270d613041565b5b015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6127106127598461293c565b876127649190612e5d565b61276e9190612efe565b90508060165f8c81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546127cb9190612e9e565b9250508190555080846127de9190612e9e565b93506001856127ed9190612e9e565b94508173ffffffffffffffffffffffffffffffffffffffff168a7fa23b5b49b590aafde4ed0964e2fe0cd0ba509cc1189f6861173f616cb1e3133c858460405161283892919061301a565b60405180910390a35050808060010191505061262c565b509550959350505050565b5f5f5f90505b602881101561292e575f85858360405160200161287f9392919061306e565b6040516020818303038152906040528051906020012090505f84825f1c6128a691906130aa565b90505f6128b389836129a0565b905060155f8b81526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661291e5780945050505050612933565b5050508080600101915050612860565b505f90505b95945050505050565b5f5f820361294e57610fa0905061299b565b60018203612960576107d0905061299b565b60028203612972576105dc905061299b565b60038203612984576103e8905061299b565b60048203612996576101f4905061299b565b60c890505b919050565b5f5f60145f8581526020019081526020015f2090505f5f90505f600183805490506129cb9190612de9565b90505b80821015612a39575f600282846129e59190612e9e565b6129ef9190612efe565b905085848281548110612a0557612a04613041565b5b905f5260205f209060020201600101541115612a2357809150612a33565b600181612a309190612e9e565b92505b506129ce565b828281548110612a4c57612a4b613041565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935050505092915050565b604051806101400160405280600a90602082028036833780820191505090505090565b5f82825260208201905092915050565b7f757365206465706f7369742829000000000000000000000000000000000000005f82015250565b5f612aec600d83612aa8565b9150612af782612ab8565b602082019050919050565b5f6020820190508181035f830152612b1981612ae0565b9050919050565b5f819050919050565b612b3281612b20565b82525050565b5f602082019050612b4b5f830184612b29565b92915050565b5f5ffd5b612b5e81612b20565b8114612b68575f5ffd5b50565b5f81359050612b7981612b55565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ba882612b7f565b9050919050565b612bb881612b9e565b8114612bc2575f5ffd5b50565b5f81359050612bd381612baf565b92915050565b5f5f60408385031215612bef57612bee612b51565b5b5f612bfc85828601612b6b565b9250506020612c0d85828601612bc5565b9150509250929050565b5f60208284031215612c2c57612c2b612b51565b5b5f612c3984828501612b6b565b91505092915050565b612c4b81612b9e565b82525050565b5f602082019050612c645f830184612c42565b92915050565b5f8115159050919050565b612c7e81612c6a565b82525050565b5f602082019050612c975f830184612c75565b92915050565b5f600a9050919050565b5f81905092915050565b5f819050919050565b612cc381612b9e565b82525050565b5f612cd48383612cba565b60208301905092915050565b5f602082019050919050565b612cf581612c9d565b612cff8184612ca7565b9250612d0a82612cb1565b805f5b83811015612d3a578151612d218782612cc9565b9650612d2c83612ce0565b925050600181019050612d0d565b505050505050565b5f61014082019050612d565f830184612cec565b92915050565b5f606082019050612d6f5f830186612b29565b612d7c6020830185612b29565b612d896040830184612b29565b949350505050565b5f60208284031215612da657612da5612b51565b5b5f612db384828501612bc5565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612df382612b20565b9150612dfe83612b20565b9250828203905081811115612e1657612e15612dbc565b5b92915050565b5f81905092915050565b50565b5f612e345f83612e1c565b9150612e3f82612e26565b5f82019050919050565b5f612e5382612e29565b9150819050919050565b5f612e6782612b20565b9150612e7283612b20565b9250828202612e8081612b20565b91508282048414831517612e9757612e96612dbc565b5b5092915050565b5f612ea882612b20565b9150612eb383612b20565b9250828201905080821115612ecb57612eca612dbc565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f0882612b20565b9150612f1383612b20565b925082612f2357612f22612ed1565b5b828204905092915050565b5f819050919050565b5f819050919050565b612f51612f4c82612f2e565b612f37565b82525050565b5f8160601b9050919050565b5f612f6d82612f57565b9050919050565b5f612f7e82612f63565b9050919050565b612f96612f9182612b9e565b612f74565b82525050565b5f819050919050565b612fb6612fb182612b20565b612f9c565b82525050565b5f612fc78288612f40565b602082019150612fd78287612f85565b601482019150612fe78286612fa5565b602082019150612ff78285612fa5565b6020820191506130078284612fa5565b6020820191508190509695505050505050565b5f60408201905061302d5f830185612b29565b61303a6020830184612b29565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6130798286612f40565b6020820191506130898285612fa5565b6020820191506130998284612fa5565b602082019150819050949350505050565b5f6130b482612b20565b91506130bf83612b20565b9250826130cf576130ce612ed1565b5b82820690509291505056fea264697066735822122045a8885ab66611448aadcf8efcb56dacb1e485f8ec3c650bda38e4f393280b8264736f6c63430008230033
0x608060405260043610610302575f3560e01c806383e9ee2b1161018f578063bf333f2c116100db578063d433160e11610094578063f60cdcf61161006e578063f60cdcf614610bc4578063f6809e0a14610bee578063f7cb789a14610c18578063f879147c14610c4257610342565b8063d433160e14610b48578063dc854ea814610b84578063e1a4521814610b9a57610342565b8063bf333f2c14610a4a578063c194efbf14610a74578063c20d409e14610ab0578063c5b1d9aa14610aec578063d0e30db014610b02578063d18df53c14610b0c57610342565b80639b349b9f11610148578063ac27a2f311610122578063ac27a2f314610990578063af027296146109ba578063b3f05b97146109f6578063b91c213c14610a2057610342565b80639b349b9f146108ec5780639c13ca6014610928578063ab5669ad1461096657610342565b806383e9ee2b146107e0578063856ed7031461080a5780638a6e00bd146108345780638c29b9b31461085e5780638cd221c9146108865780639699ac22146108b057610342565b806347b12bfc1161024e57806357680940116102075780636d8b3175116101e15780636d8b31751461071457806377a64fd5146107505780637b4f02bd1461077a57806380a50cfb146107a457610342565b806357680940146106725780635946cfa4146106ae5780635e123ce4146106ea57610342565b806347b12bfc1461058a5780634ba2363a146105b45780634bb278f3146105de57806350e6a439146105f4578063524904e01461061e57806356daa1551461064857610342565b80632750beaa116102bb578063370e716911610295578063370e7169146104e4578063379607f51461050e578063406953631461053657806340eedabb1461056057610342565b80632750beaa1461046657806329dcb0cf146104905780633098eb2e146104ba57610342565b806308874c0f146103465780630930214d146103705780631300a6d1146103ac57806313f2dad0146103d6578063186e8464146104125780631a1852111461043c57610342565b36610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990612b02565b60405180910390fd5b5f5ffd5b348015610351575f5ffd5b5061035a610c58565b6040516103679190612b38565b60405180910390f35b34801561037b575f5ffd5b5061039660048036038101906103919190612bd9565b610c5e565b6040516103a39190612b38565b60405180910390f35b3480156103b7575f5ffd5b506103c0610c7e565b6040516103cd9190612b38565b60405180910390f35b3480156103e1575f5ffd5b506103fc60048036038101906103f79190612c17565b610cd2565b6040516104099190612b38565b60405180910390f35b34801561041d575f5ffd5b50610426610ce7565b6040516104339190612b38565b60405180910390f35b348015610447575f5ffd5b50610450610ced565b60405161045d9190612b38565b60405180910390f35b348015610471575f5ffd5b5061047a610cf3565b6040516104879190612b38565b60405180910390f35b34801561049b575f5ffd5b506104a4610cf8565b6040516104b19190612b38565b60405180910390f35b3480156104c5575f5ffd5b506104ce610cfe565b6040516104db9190612b38565b60405180910390f35b3480156104ef575f5ffd5b506104f8610d03565b6040516105059190612b38565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f9190612c17565b610d0e565b005b348015610541575f5ffd5b5061054a610ea5565b6040516105579190612b38565b60405180910390f35b34801561056b575f5ffd5b50610574610eab565b6040516105819190612c51565b60405180910390f35b348015610595575f5ffd5b5061059e610ed0565b6040516105ab9190612b38565b60405180910390f35b3480156105bf575f5ffd5b506105c8610ed6565b6040516105d59190612b38565b60405180910390f35b3480156105e9575f5ffd5b506105f2610edc565b005b3480156105ff575f5ffd5b506106086111dc565b6040516106159190612b38565b60405180910390f35b348015610629575f5ffd5b506106326111e1565b60405161063f9190612c51565b60405180910390f35b348015610653575f5ffd5b5061065c6111f9565b6040516106699190612b38565b60405180910390f35b34801561067d575f5ffd5b5061069860048036038101906106939190612c17565b611213565b6040516106a59190612b38565b60405180910390f35b3480156106b9575f5ffd5b506106d460048036038101906106cf9190612bd9565b611228565b6040516106e19190612b38565b60405180910390f35b3480156106f5575f5ffd5b506106fe611248565b60405161070b9190612c84565b60405180910390f35b34801561071f575f5ffd5b5061073a60048036038101906107359190612c17565b611274565b6040516107479190612c84565b60405180910390f35b34801561075b575f5ffd5b50610764611291565b6040516107719190612b38565b60405180910390f35b348015610785575f5ffd5b5061078e611297565b60405161079b9190612b38565b60405180910390f35b3480156107af575f5ffd5b506107ca60048036038101906107c59190612bd9565b61129c565b6040516107d79190612c84565b60405180910390f35b3480156107eb575f5ffd5b506107f46112c6565b6040516108019190612b38565b60405180910390f35b348015610815575f5ffd5b5061081e6112cd565b60405161082b9190612b38565b60405180910390f35b34801561083f575f5ffd5b506108486112e2565b6040516108559190612b38565b60405180910390f35b348015610869575f5ffd5b50610884600480360381019061087f9190612c17565b6112e8565b005b348015610891575f5ffd5b5061089a6114b5565b6040516108a79190612b38565b60405180910390f35b3480156108bb575f5ffd5b506108d660048036038101906108d19190612c17565b6114ba565b6040516108e39190612c84565b60405180910390f35b3480156108f7575f5ffd5b50610912600480360381019061090d9190612c17565b6114d7565b60405161091f9190612d42565b60405180910390f35b348015610933575f5ffd5b5061094e60048036038101906109499190612bd9565b611568565b60405161095d93929190612d5c565b60405180910390f35b348015610971575f5ffd5b5061097a611599565b6040516109879190612b38565b60405180910390f35b34801561099b575f5ffd5b506109a461159f565b6040516109b19190612b38565b60405180910390f35b3480156109c5575f5ffd5b506109e060048036038101906109db9190612c17565b6115e5565b6040516109ed9190612b38565b60405180910390f35b348015610a01575f5ffd5b50610a0a6115fa565b604051610a179190612c84565b60405180910390f35b348015610a2b575f5ffd5b50610a3461160c565b604051610a419190612b38565b60405180910390f35b348015610a55575f5ffd5b50610a5e611611565b604051610a6b9190612b38565b60405180910390f35b348015610a7f575f5ffd5b50610a9a6004803603810190610a959190612c17565b611617565b604051610aa79190612b38565b60405180910390f35b348015610abb575f5ffd5b50610ad66004803603810190610ad19190612c17565b61162c565b604051610ae39190612b38565b60405180910390f35b348015610af7575f5ffd5b50610b00611641565b005b610b0a6116ba565b005b348015610b17575f5ffd5b50610b326004803603810190610b2d9190612bd9565b611e82565b604051610b3f9190612b38565b60405180910390f35b348015610b53575f5ffd5b50610b6e6004803603810190610b699190612d91565b611f31565b604051610b7b9190612b38565b60405180910390f35b348015610b8f575f5ffd5b50610b98611f88565b005b348015610ba5575f5ffd5b50610bae61210d565b604051610bbb9190612b38565b60405180910390f35b348015610bcf575f5ffd5b50610bd8612113565b604051610be59190612b38565b60405180910390f35b348015610bf9575f5ffd5b50610c02612119565b604051610c0f9190612b38565b60405180910390f35b348015610c23575f5ffd5b50610c2c612124565b604051610c399190612b38565b60405180910390f35b348015610c4d575f5ffd5b50610c5661212a565b005b61277481565b6016602052815f5260405f20602052805f5260405f205f91509150505481565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004541480610cb157506004544210155b15610cbe575f9050610ccf565b42600454610ccc9190612de9565b90505b90565b6007602052805f5260405f205f915090505481565b60015481565b611c2081565b601481565b60045481565b602881565b66038d7ea4c6800081565b610d188133612447565b5f600c5f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816002015490505f8103610da8576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82600201819055505f3373ffffffffffffffffffffffffffffffffffffffff1682604051610dd690612e49565b5f6040518083038185875af1925050503d805f8114610e10576040519150601f19603f3d011682016040523d82523d5f602084013e610e15565b606091505b5050905080610e50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16847f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610e979190612b38565b60405180910390a350505050565b60025481565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fa081565b60065481565b60095f9054906101000a900460ff1615610f22576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f5f5481526020019081526020015f205f9054906101000a900460ff1615610f78576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f5f5481526020019081526020015f205490505f8114158015610f9e5750804210155b15610fd5576040517f397160ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454421015611010576040517e2900a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611096576040517fef96c6dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f549050600160095f6101000a81548160ff0219169083151502179055505f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60065490505f6006819055505f8273ffffffffffffffffffffffffffffffffffffffff168260405161110c90612e49565b5f6040518083038185875af1925050503d805f8114611146576040519150601f19603f3d011682016040523d82523d5f602084013e61114b565b606091505b5050905080611186576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16847f48f30422ceddef46ded34f69ebff2c090f0804e80938b8f2447e769f204ff8f3846040516111cd9190612b38565b60405180910390a35050505050565b600581565b73b8f0c931f4e4684b5cdd2e9db84e57bc41c5741381565b5f60125f60015481526020019081526020015f2054905090565b6012602052805f5260405f205f915090505481565b6013602052815f5260405f20602052805f5260405f205f91509150505481565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004541415905090565b600f602052805f5260405f205f915054906101000a900460ff1681565b61138881565b600a81565b6015602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b62093a8081565b5f60146002546112dd9190612e5d565b905090565b600b5481565b5f60165f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611371576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60165f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3373ffffffffffffffffffffffffffffffffffffffff16826040516113e790612e49565b5f6040518083038185875af1925050503d805f8114611421576040519150601f19603f3d011682016040523d82523d5f602084013e611426565b606091505b5050905080611461576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16837f2728985f641963d6ebba7367e3044d0d40539bfb8753b30acc9ecc3a60ef322c846040516114a89190612b38565b60405180910390a3505050565b5f5481565b6011602052805f5260405f205f915054906101000a900460ff1681565b6114df612a85565b60175f8381526020019081526020015f20600a806020026040519081016040528092919082600a801561155c576020028201915b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611513575b50505050509050919050565b600c602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154905083565b61038481565b5f5f600e5f5f5481526020019081526020015f205490505f8114806115c45750804210155b156115d2575f9150506115e2565b42816115de9190612de9565b9150505b90565b6010602052805f5260405f205f915090505481565b60095f9054906101000a900460ff1681565b600581565b6103e881565b6008602052805f5260405f205f915090505481565b600e602052805f5260405f205f915090505481565b60095f9054906101000a900460ff16158015611679575060115f5f5481526020019081526020015f205f9054906101000a900460ff16155b156116b0576040517fc413a2f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116b861251e565b565b60095f9054906101000a900460ff1615611700576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f5f5481526020019081526020015f205f9054906101000a900460ff1615611756576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5490505f600e5f8381526020019081526020015f205490505f81141580156117805750804210155b156117b7576040517f397160ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045442106117f2576040517f9e6d804f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f600254905080821015611836576040517f4e7e291600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6014826118449190612e5d565b905080831115611880576040517f4d1dd38900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5f8681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661195b576001600d5f8781526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f8282546119539190612e9e565b925050819055505b5f84036119875762093a80426119719190612e9e565b600e5f8781526020019081526020015f20819055505b5f66038d7ea4c680008461199b9190612efe565b90505f811115611af8575f60015490508160135f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611a069190612e9e565b925050819055505f8260125f8481526020019081526020015f2054611a2b9190612e9e565b90508060125f8481526020019081526020015f208190555060145f8381526020019081526020015f2060405180604001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003905f5260205f2090600202015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505050505b5f612710610fa086611b0a9190612e5d565b611b149190612efe565b90505f6127106103e887611b289190612e5d565b611b329190612efe565b90505f818388611b429190612de9565b611b4c9190612de9565b90505f60075f8b81526020019081526020015f20541115611bc25760075f8a81526020019081526020015f2054670de0b6b3a764000084611b8d9190612e5d565b611b979190612efe565b60085f8b81526020019081526020015f205f828254611bb69190612e9e565b92505081905550611bd1565b8281611bce9190612e9e565b90505b8060065f828254611be29190612e9e565b92505081905550611bf38933612447565b5f600c5f8b81526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905087815f015f828254611c549190612e9e565b925050819055508760075f8c81526020019081526020015f205f828254611c7b9190612e9e565b92505081905550670de0b6b3a764000060085f8c81526020019081526020015f2054825f0154611cab9190612e5d565b611cb59190612efe565b816001018190555061271061277488611cce9190612e5d565b611cd89190612efe565b6002819055506103846003541115611d17575f6005600354611cfa9190612de9565b90506103848110611d0b5780611d0f565b6103845b600381905550505b60035442611d259190612e9e565b6004819055503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73b8f0c931f4e4684b5cdd2e9db84e57bc41c5741373ffffffffffffffffffffffffffffffffffffffff1684604051611da490612e49565b5f6040518083038185875af1925050503d805f8114611dde576040519150601f19603f3d011682016040523d82523d5f602084013e611de3565b606091505b5050905080611e1e576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168b7f996a417e6461fc8f287ec9a6c2e9afb764a1d6fbdaa6570826ae99855b453aff8b600254600454604051611e6d93929190612d5c565b60405180910390a35050505050505050505050565b5f5f600c5f8581526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f670de0b6b3a764000060085f8781526020019081526020015f2054835f0154611efc9190612e5d565b611f069190612efe565b90508160010154818360020154611f1d9190612e9e565b611f279190612de9565b9250505092915050565b5f60135f60015481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f5f54905060095f9054906101000a900460ff1615611fd3576040517f1294b84000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5f8281526020019081526020015f205f9054906101000a900460ff1615612028576040517f7c0e13e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600e5f8381526020019081526020015f205490505f81148061204a57508042105b15612081576040517f06eb619000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f5f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505f6005436120b89190612e9e565b90508060105f8581526020019081526020015f2081905550827f4461811d45d3170b71e8217bd82945d352e200efde2f104573ac30137675cbcf826040516121009190612b38565b60405180910390a2505050565b61271081565b600a5481565b66038d7ea4c6800081565b60035481565b5f5f549050600f5f8281526020019081526020015f205f9054906101000a900460ff16612183576040517f325d56b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8281526020019081526020015f205f9054906101000a900460ff16156121d8576040517f73ba940000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60105f8381526020019081526020015f20549050804311612226576040517f4e9e108900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f814090505f5f1b810361229b575f6005436122429190612e9e565b90508060105f8681526020019081526020015f2081905550837f47da63561651a51f90d1c277834a77dddc7e3159e7f5805ffa7e282cac59accd8260405161228a9190612b38565b60405180910390a250505050612445565b5f60015490505f60125f8381526020019081526020015f205490505f83308785856040516020016122d0959493929190612fbc565b604051602081830303815290604052805190602001209050600160095f6101000a81548160ff021916908315150217905550600160115f8881526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60065490505f6006819055505f5f6123478987868887612625565b915091505f81846123589190612de9565b90505f8111156123b35780600b5f8282546123739190612e9e565b92505081905550897f9f13e0c56f9fd59cec9ead90b5d02e3aa45e77367809b6d6771c32c4eafc37e7826040516123aa9190612b38565b60405180910390a25b6001876123c09190612e9e565b600181905550897fdcefbfb90c7aba4fa4b392c84220156b797a1f831786ef622828ebf94cc1123684866040516123f892919061301a565b60405180910390a28960018861240e9190612e9e565b7f764a84e6bfc0d2db391c0b3cb7265b80668ec5342febb74a1560de2c629c36b960405160405180910390a3505050505050505050505b565b5f600c5f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f01541115612519575f670de0b6b3a764000060085f8681526020019081526020015f2054835f01546124cb9190612e5d565b6124d59190612efe565b90505f8260010154826124e89190612de9565b90505f81111561250d5780836002015f8282546125059190612e9e565b925050819055505b81836001018190555050505b505050565b60015f5f82825461252f9190612e9e565b9250508190555066038d7ea4c68000600281905550611c206003819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004819055505f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b546006819055505f600b819055505f60095f6101000a81548160ff0219169083151502179055505f600a819055505f547f5aec57d81928b24d30b1a2aec0d23d693412c37d7ec106b5d8259413716bb1f460025460035460405161261b92919061301a565b60405180910390a2565b5f5f5f5f90505b600a81101561284f575f85031561284f575f61264b898989858a61285a565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612686575061284f565b600160155f8b81526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060175f8b81526020019081526020015f2083600a811061270e5761270d613041565b5b015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6127106127598461293c565b876127649190612e5d565b61276e9190612efe565b90508060165f8c81526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546127cb9190612e9e565b9250508190555080846127de9190612e9e565b93506001856127ed9190612e9e565b94508173ffffffffffffffffffffffffffffffffffffffff168a7fa23b5b49b590aafde4ed0964e2fe0cd0ba509cc1189f6861173f616cb1e3133c858460405161283892919061301a565b60405180910390a35050808060010191505061262c565b509550959350505050565b5f5f5f90505b602881101561292e575f85858360405160200161287f9392919061306e565b6040516020818303038152906040528051906020012090505f84825f1c6128a691906130aa565b90505f6128b389836129a0565b905060155f8b81526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661291e5780945050505050612933565b5050508080600101915050612860565b505f90505b95945050505050565b5f5f820361294e57610fa0905061299b565b60018203612960576107d0905061299b565b60028203612972576105dc905061299b565b60038203612984576103e8905061299b565b60048203612996576101f4905061299b565b60c890505b919050565b5f5f60145f8581526020019081526020015f2090505f5f90505f600183805490506129cb9190612de9565b90505b80821015612a39575f600282846129e59190612e9e565b6129ef9190612efe565b905085848281548110612a0557612a04613041565b5b905f5260205f209060020201600101541115612a2357809150612a33565b600181612a309190612e9e565b92505b506129ce565b828281548110612a4c57612a4b613041565b5b905f5260205f2090600202015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935050505092915050565b604051806101400160405280600a90602082028036833780820191505090505090565b5f82825260208201905092915050565b7f757365206465706f7369742829000000000000000000000000000000000000005f82015250565b5f612aec600d83612aa8565b9150612af782612ab8565b602082019050919050565b5f6020820190508181035f830152612b1981612ae0565b9050919050565b5f819050919050565b612b3281612b20565b82525050565b5f602082019050612b4b5f830184612b29565b92915050565b5f5ffd5b612b5e81612b20565b8114612b68575f5ffd5b50565b5f81359050612b7981612b55565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ba882612b7f565b9050919050565b612bb881612b9e565b8114612bc2575f5ffd5b50565b5f81359050612bd381612baf565b92915050565b5f5f60408385031215612bef57612bee612b51565b5b5f612bfc85828601612b6b565b9250506020612c0d85828601612bc5565b9150509250929050565b5f60208284031215612c2c57612c2b612b51565b5b5f612c3984828501612b6b565b91505092915050565b612c4b81612b9e565b82525050565b5f602082019050612c645f830184612c42565b92915050565b5f8115159050919050565b612c7e81612c6a565b82525050565b5f602082019050612c975f830184612c75565b92915050565b5f600a9050919050565b5f81905092915050565b5f819050919050565b612cc381612b9e565b82525050565b5f612cd48383612cba565b60208301905092915050565b5f602082019050919050565b612cf581612c9d565b612cff8184612ca7565b9250612d0a82612cb1565b805f5b83811015612d3a578151612d218782612cc9565b9650612d2c83612ce0565b925050600181019050612d0d565b505050505050565b5f61014082019050612d565f830184612cec565b92915050565b5f606082019050612d6f5f830186612b29565b612d7c6020830185612b29565b612d896040830184612b29565b949350505050565b5f60208284031215612da657612da5612b51565b5b5f612db384828501612bc5565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612df382612b20565b9150612dfe83612b20565b9250828203905081811115612e1657612e15612dbc565b5b92915050565b5f81905092915050565b50565b5f612e345f83612e1c565b9150612e3f82612e26565b5f82019050919050565b5f612e5382612e29565b9150819050919050565b5f612e6782612b20565b9150612e7283612b20565b9250828202612e8081612b20565b91508282048414831517612e9757612e96612dbc565b5b5092915050565b5f612ea882612b20565b9150612eb383612b20565b9250828201905080821115612ecb57612eca612dbc565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f0882612b20565b9150612f1383612b20565b925082612f2357612f22612ed1565b5b828204905092915050565b5f819050919050565b5f819050919050565b612f51612f4c82612f2e565b612f37565b82525050565b5f8160601b9050919050565b5f612f6d82612f57565b9050919050565b5f612f7e82612f63565b9050919050565b612f96612f9182612b9e565b612f74565b82525050565b5f819050919050565b612fb6612fb182612b20565b612f9c565b82525050565b5f612fc78288612f40565b602082019150612fd78287612f85565b601482019150612fe78286612fa5565b602082019150612ff78285612fa5565b6020820191506130078284612fa5565b6020820191508190509695505050505050565b5f60408201905061302d5f830185612b29565b61303a6020830184612b29565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6130798286612f40565b6020820191506130898285612fa5565b6020820191506130998284612fa5565b602082019150819050949350505050565b5f6130b482612b20565b91506130bf83612b20565b9250826130cf576130ce612ed1565b5b82820690509291505056fea264697066735822122045a8885ab66611448aadcf8efcb56dacb1e485f8ec3c650bda38e4f393280b8264736f6c63430008230033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xe918d6…ccd92b | 56 mins agoTue, 18 Aug 2026 03:19:48 UTC | 0x4ec90e…d026 | [0] 0x000000000000…00000001 [1] 0x000000000000…41c57413 data: 0x000000000000000000…880b02a5 |
| 0xcda8a7…504bcd | 57 mins agoTue, 18 Aug 2026 03:18:58 UTC | 0x4ec90e…d026 | [0] 0x000000000000…00000001 [1] 0x000000000000…46b60413 data: 0x000000000000000000…2cbdd96c |
| 0x4dac29…a2967a | 58 mins agoTue, 18 Aug 2026 03:18:03 UTC | 0x4ec90e…d026 | [0] 0x000000000000…00000001 [1] 0x000000000000…054b869a data: 0x000000000000000000…2a9c32eb |
| 0x5833b0…1ec1f1 | 2 days agoSat, 15 Aug 2026 15:20:52 UTC | 0x5aec57…b1f4 | [0] 0x000000000000…00000002 data: 0x000000000000000000…00001c20 |
| 0xdaa864…1b5a08 | 2 days agoSat, 15 Aug 2026 10:48:23 UTC | 0x48f304…f8f3 | [0] 0x000000000000…00000001 [1] 0x000000000000…054b869a data: 0x000000000000000000…0c4c8000 |
| 0x7a7a78…e32cd5 | 2 days agoSat, 15 Aug 2026 06:26:40 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…054b869a data: 0x000000000000000000…6a80229d |
| 0x64855c…134403 | 2 days agoSat, 15 Aug 2026 06:01:11 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…e1c1d124 data: 0x000000000000000000…6a801ca9 |
| 0x49e88e…3d0c5a | 2 days agoSat, 15 Aug 2026 05:59:52 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…41c57413 data: 0x000000000000000000…6a801c5f |
| 0x2907dc…a7e892 | 2 days agoSat, 15 Aug 2026 05:59:07 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…41c57413 data: 0x000000000000000000…6a801c37 |
| 0x842d55…ee46bf | 2 days agoSat, 15 Aug 2026 05:49:11 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…46b60413 data: 0x000000000000000000…6a8019e8 |
| 0xb6f0cf…a048b7 | 2 days agoSat, 15 Aug 2026 05:48:26 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…41c57413 data: 0x000000000000000000…6a8019c0 |
| 0x02bfd4…b721ac | 2 days agoSat, 15 Aug 2026 05:46:43 UTC | 0x996a41…3aff | [0] 0x000000000000…00000001 [1] 0x000000000000…054b869a data: 0x000000000000000000…6a80195e |
| 0xed6b29…b5827b | 3 days agoSat, 15 Aug 2026 01:53:26 UTC | 0x5aec57…b1f4 | [0] 0x000000000000…00000001 data: 0x000000000000000000…00001c20 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe918d6…ccd92b | claim | 39,370,231 | 56 mins agoTue, 18 Aug 2026 03:19:48 UTC | 0xb8f0…7413 | IN | NottinghamBank | $0.000 ETH | 0.00000084 | |
| 0xcda8a7…504bcd | claim | 39,369,733 | 57 mins agoTue, 18 Aug 2026 03:18:58 UTC | 0xc3cb…0413 | IN | NottinghamBank | $0.000 ETH | 0.00000102 | |
| 0x4dac29…a2967a | claim | 39,369,188 | 58 mins agoTue, 18 Aug 2026 03:18:03 UTC | 0xbd87…869a | IN | NottinghamBank | $0.000 ETH | 0.00000078 | |
| 0x5833b0…1ec1f1 | newRound | 37,217,782 | 2 days agoSat, 15 Aug 2026 15:20:52 UTC | 0xbd87…869a | IN | NottinghamBank | $0.000 ETH | 0.00000154 | |
| 0xdaa864…1b5a08 | finalize | 37,054,762 | 2 days agoSat, 15 Aug 2026 10:48:23 UTC | 0xbd87…869a | IN | NottinghamBank | $0.000 ETH | 0.00000206 | |
| 0x7a7a78…e32cd5 | Deposit | 36,898,350 | 2 days agoSat, 15 Aug 2026 06:26:40 UTC | 0xbd87…869a | IN | NottinghamBank | $2.210.00116 ETH | 0.00000703 | |
| 0x64855c…134403 | Deposit | 36,883,119 | 2 days agoSat, 15 Aug 2026 06:01:11 UTC | 0xfa27…d124 | IN | NottinghamBank | $2.190.00115 ETH | 0.00000839 | |
| 0x49e88e…3d0c5a | Deposit | 36,882,334 | 2 days agoSat, 15 Aug 2026 05:59:52 UTC | 0xb8f0…7413 | IN | NottinghamBank | $12.220.00645 ETH | 0.00000569 | |
| 0x2907dc…a7e892 | Deposit | 36,881,887 | 2 days agoSat, 15 Aug 2026 05:59:07 UTC | 0xb8f0…7413 | IN | NottinghamBank | $38.630.0204 ETH | 0.00000640 | |
| 0x842d55…ee46bf | Deposit | 36,875,942 | 2 days agoSat, 15 Aug 2026 05:49:11 UTC | 0xc3cb…0413 | IN | NottinghamBank | $25.370.0134 ETH | 0.00000845 | |
| 0xb6f0cf…a048b7 | Deposit | 36,875,497 | 2 days agoSat, 15 Aug 2026 05:48:26 UTC | 0xb8f0…7413 | IN | NottinghamBank | $38.060.0201 ETH | 0.00000898 | |
| 0x02bfd4…b721ac | Deposit | 36,874,474 | 2 days agoSat, 15 Aug 2026 05:46:43 UTC | 0xbd87…869a | IN | NottinghamBank | $2.080.0011 ETH | 0.00001205 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 39,370,231 | 56 mins agoTue, 18 Aug 2026 03:19:48 UTC | 0xe918d6…ccd92b | CALL | claim | 0x171e…58dd | OUT | 0xb8f0…7413 | 0.01242 ETH |
| 39,369,733 | 57 mins agoTue, 18 Aug 2026 03:18:58 UTC | 0xcda8a7…504bcd | CALL | claim | 0x171e…58dd | OUT | 0xc3cb…0413 | 0.00398 ETH |
| 39,369,188 | 58 mins agoTue, 18 Aug 2026 03:18:03 UTC | 0x4dac29…a2967a | CALL | claim | 0x171e…58dd | OUT | 0xbd87…869a | 0.00864 ETH |
| 37,054,762 | 2 days agoSat, 15 Aug 2026 10:48:23 UTC | 0xdaa864…1b5a08 | CALL | finalize | 0x171e…58dd | OUT | 0xbd87…869a | 0.03232 ETH |
| 36,881,887 | 2 days agoSat, 15 Aug 2026 05:59:07 UTC | 0x2907dc…a7e892 | CALL | Deposit | 0x171e…58dd | OUT | 0xb8f0…7413 | 0.00204 ETH |
| 36,875,942 | 2 days agoSat, 15 Aug 2026 05:49:11 UTC | 0x842d55…ee46bf | CALL | Deposit | 0x171e…58dd | OUT | 0xb8f0…7413 | 0.00134 ETH |
| 36,875,497 | 2 days agoSat, 15 Aug 2026 05:48:26 UTC | 0xb6f0cf…a048b7 | CALL | Deposit | 0x171e…58dd | OUT | 0xb8f0…7413 | 0.00201 ETH |
| 36,874,474 | 2 days agoSat, 15 Aug 2026 05:46:43 UTC | 0x02bfd4…b721ac | CALL | Deposit | 0x171e…58dd | OUT | 0xb8f0…7413 | 0.00011 ETH |