ETH Price: $2,172.38 (+5.71%)

Contract

0x38914a8907C15569819F9683b46969E4f4d5B96e
 

Overview

ETH Balance

0.01 ETH

Eth Value

$21.72 (@ $2,172.38/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
Withdraw Funds181267982023-09-13 10:29:23538 days ago1694600963IN
0x38914a89...4f4d5B96e
0 ETH0.0011508520.47557524
Withdraw Funds181267812023-09-13 10:25:59538 days ago1694600759IN
0x38914a89...4f4d5B96e
0 ETH0.0005254921.09301394
Withdraw Funds181267222023-09-13 10:14:11538 days ago1694600051IN
0x38914a89...4f4d5B96e
0 ETH0.0005357721.50600146
Settle Bet181072362023-09-10 16:42:23541 days ago1694364143IN
0x38914a89...4f4d5B96e
0 ETH0.0020106518.54608663
Place Bet181072332023-09-10 16:41:47541 days ago1694364107IN
0x38914a89...4f4d5B96e
0.01 ETH0.002491411.24670743
Settle Bet181048992023-09-10 8:51:59541 days ago1694335919IN
0x38914a89...4f4d5B96e
0 ETH0.0026825316.98679044
Place Bet181048932023-09-10 8:50:47541 days ago1694335847IN
0x38914a89...4f4d5B96e
0.01 ETH0.00275712.4463409
Settle Bet179239402023-08-16 0:52:59567 days ago1692147179IN
0x38914a89...4f4d5B96e
0 ETH0.0044574341.1103998
Place Bet179239382023-08-16 0:52:35567 days ago1692147155IN
0x38914a89...4f4d5B96e
0.05059 ETH0.0052240523.58242935
Settle Bet179239142023-08-16 0:47:47567 days ago1692146867IN
0x38914a89...4f4d5B96e
0 ETH0.005555135.17693831
Place Bet179239122023-08-16 0:47:23567 days ago1692146843IN
0x38914a89...4f4d5B96e
0.04047 ETH0.0044667320.16375918
Settle Bet179238982023-08-16 0:44:35567 days ago1692146675IN
0x38914a89...4f4d5B96e
0 ETH0.0037686234.76141101
Place Bet179238922023-08-16 0:43:23567 days ago1692146603IN
0x38914a89...4f4d5B96e
0.03038 ETH0.0044548620.11016075
Settle Bet179238872023-08-16 0:42:23567 days ago1692146543IN
0x38914a89...4f4d5B96e
0 ETH0.005822736.87143638
Place Bet179238842023-08-16 0:41:47567 days ago1692146507IN
0x38914a89...4f4d5B96e
0.03032 ETH0.0046526321.0040784
Settle Bet179238712023-08-16 0:39:11567 days ago1692146351IN
0x38914a89...4f4d5B96e
0 ETH0.0057747241.9028981
Place Bet179238632023-08-16 0:37:35567 days ago1692146255IN
0x38914a89...4f4d5B96e
0.03004 ETH0.0047677121.52360484
Settle Bet178768742023-08-09 10:53:11573 days ago1691578391IN
0x38914a89...4f4d5B96e
0 ETH0.003920436.157424
Settle Bet178768682023-08-09 10:51:59573 days ago1691578319IN
0x38914a89...4f4d5B96e
0 ETH0.0040523135.7895888
Place Bet178768652023-08-09 10:51:23573 days ago1691578283IN
0x38914a89...4f4d5B96e
0.01 ETH0.0043605621.33232885
Place Bet178768622023-08-09 10:50:47573 days ago1691578247IN
0x38914a89...4f4d5B96e
0.01 ETH0.0050716122.89554395
Settle Bet178405542023-08-04 8:53:59578 days ago1691139239IN
0x38914a89...4f4d5B96e
0 ETH0.0031684629.3896516
Place Bet178405482023-08-04 8:52:47578 days ago1691139167IN
0x38914a89...4f4d5B96e
0.0302 ETH0.0041563918.61248195
Settle Bet178405432023-08-04 8:51:47578 days ago1691139107IN
0x38914a89...4f4d5B96e
0 ETH0.005485534.8268028
Place Bet178405392023-08-04 8:50:59578 days ago1691139059IN
0x38914a89...4f4d5B96e
0.02023 ETH0.0054123222.23003266
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
181267982023-09-13 10:29:23538 days ago1694600963
0x38914a89...4f4d5B96e
27.6622438 ETH
181048992023-09-10 8:51:59541 days ago1694335919
0x38914a89...4f4d5B96e
0.01188 ETH
179239142023-08-16 0:47:47567 days ago1692146867
0x38914a89...4f4d5B96e
0.060097 ETH
179238872023-08-16 0:42:23567 days ago1692146543
0x38914a89...4f4d5B96e
0.045025 ETH
179238712023-08-16 0:39:11567 days ago1692146351
0x38914a89...4f4d5B96e
0.059479 ETH
178405432023-08-04 8:51:47578 days ago1691139107
0x38914a89...4f4d5B96e
0.041724 ETH
178405362023-08-04 8:50:23578 days ago1691139023
0x38914a89...4f4d5B96e
0.025304 ETH
178013652023-07-29 21:25:47584 days ago1690665947
0x38914a89...4f4d5B96e
0.104167 ETH
177557942023-07-23 12:23:59590 days ago1690115039
0x38914a89...4f4d5B96e
0.0198 ETH
177555462023-07-23 11:33:47590 days ago1690112027
0x38914a89...4f4d5B96e
0.019411 ETH
177555102023-07-23 11:26:35590 days ago1690111595
0x38914a89...4f4d5B96e
0.0594 ETH
177120452023-07-17 9:20:35596 days ago1689585635
0x38914a89...4f4d5B96e
2.020408 ETH
177120352023-07-17 9:18:23596 days ago1689585503
0x38914a89...4f4d5B96e
6.061224 ETH
177120062023-07-17 9:12:11596 days ago1689585131
0x38914a89...4f4d5B96e
2.020408 ETH
177119952023-07-17 9:09:59596 days ago1689584999
0x38914a89...4f4d5B96e
6.061224 ETH
177119702023-07-17 9:04:47596 days ago1689584687
0x38914a89...4f4d5B96e
2.020408 ETH
177119592023-07-17 9:02:35596 days ago1689584555
0x38914a89...4f4d5B96e
6.061224 ETH
177059752023-07-16 12:53:59597 days ago1689512039
0x38914a89...4f4d5B96e
3.030612 ETH
177059652023-07-16 12:51:59597 days ago1689511919
0x38914a89...4f4d5B96e
6.061224 ETH
177059352023-07-16 12:45:35597 days ago1689511535
0x38914a89...4f4d5B96e
6.061224 ETH
177058992023-07-16 12:38:23597 days ago1689511103
0x38914a89...4f4d5B96e
6.061224 ETH
176757662023-07-12 6:40:59601 days ago1689144059
0x38914a89...4f4d5B96e
0.0198 ETH
176447822023-07-07 22:05:59606 days ago1688767559
0x38914a89...4f4d5B96e
0.0594 ETH
176447712023-07-07 22:03:47606 days ago1688767427
0x38914a89...4f4d5B96e
0.019411 ETH
176330742023-07-06 6:38:47607 days ago1688625527
0x38914a89...4f4d5B96e
4.141836 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HashBet

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-15
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/HashBet.sol



pragma solidity ^0.8.0;






contract HashBet is Ownable, ReentrancyGuard {
    // Modulo is the number of equiprobable outcomes in a game:
    //  2 for coin flip
    //  6 for dice roll
    //  6*6 = 36 for double dice
    //  37 for roulette
    //  100 for hashroll
    uint constant MAX_MODULO = 100;

    // Modulos below MAX_MASK_MODULO are checked against a bit mask, allowing betting on specific outcomes. 
    // For example in a dice roll (modolo = 6), 
    // 000001 mask means betting on 1. 000001 converted from binary to decimal becomes 1.
    // 101000 mask means betting on 4 and 6. 101000 converted from binary to decimal becomes 40.
    // The specific value is dictated by the fact that 256-bit intermediate
    // multiplication result allows implementing population count efficiently
    // for numbers that are up to 42 bits, and 40 is the highest multiple of
    // eight below 42.
    uint constant MAX_MASK_MODULO = 40;
    
    // EVM BLOCKHASH opcode can query no further than 256 blocks into the
    // past. Given that settleBet uses block hash of placeBet as one of
    // complementary entropy sources, we cannot process bets older than this
    // threshold. On rare occasions dice2.win croupier may fail to invoke
    // settleBet in this timespan due to technical issues or extreme Ethereum
    // congestion; such bets can be refunded via invoking refundBet.
    uint constant BET_EXPIRATION_BLOCKS = 250;

     // This is a check on bet mask overflow. Maximum mask is equivalent to number of possible binary outcomes for maximum modulo.
    uint constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO;

    // These are constants taht make O(1) population count in placeBet possible.
    uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001;
    uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041;
    uint constant POPCNT_MODULO = 0x3F;

    // Sum of all historical deposits and withdrawals. Used for calculating profitability. Profit = Balance - cumulativeDeposit + cumulativeWithdrawal
    uint public cumulativeDeposit;
    uint public cumulativeWithdrawal;

    // In addition to house edge, wealth tax is added every time the bet amount exceeds a multiple of a threshold.
    // For example, if wealthTaxIncrementThreshold = 3000 ether,
    // A bet amount of 3000 ether will have a wealth tax of 1% in addition to house edge.
    // A bet amount of 6000 ether will have a wealth tax of 2% in addition to house edge.
    uint public wealthTaxIncrementThreshold = 3000 ether;
    uint public wealthTaxIncrementPercent = 1;

    // The minimum and maximum bets.
    uint public minBetAmount = 0.01 ether;
    uint public maxBetAmount = 10000 ether;

    // max bet profit. Used to cap bets against dynamic odds.
    uint public maxProfit = 300000 ether;

    // Funds that are locked in potentially winning bets. Prevents contract from committing to new bets that it cannot pay out.
    uint public lockedInBets;

    // The minimum larger comparison value.
    uint public minOverValue = 50;

    // The maximum smaller comparison value.
    uint public maxUnderValue = 50;

    struct BetItem {
        // Wager amount in wei.
        uint amount;
        // Modulo of a game.
        uint8 modulo;
    }

    // Info of each bet.
    struct Bet {
        BetItem item;
        // Number of winning outcomes, used to compute winning payment (* modulo/rollEdge),
        // and used instead of mask for games with modulo > MAX_MASK_MODULO.
        uint8 rollEdge;
        // Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment).
        uint40 mask;
        // Block number of placeBet tx.
        uint placeBlockNumber;
        // Address of a gambler, used to pay out winning bets.
        address payable gambler;
        // Status of bet settlement.
        bool isSettled;
        // Outcome of bet.
        uint outcome;
        // Win amount.
        uint winAmount;
        // Final Win amount.
        uint finalWinAmount;
        // Random number used to settle bet.
        uint randomNumber;
        // Keccak256 hash of some secret "reveal" random number.
        uint commit;
        // Comparison method.
        bool isLarger;
    }
    
    // Each bet is deducted dynamic
    uint public houseEdgePercent = 2;

    // Mapping from commits to all currently active & processed bets.
    mapping (uint => Bet) public bets;

    // Events
    event BetPlaced(address indexed gambler, uint amount, uint8 indexed modulo, uint8 rollEdge, uint40 mask, uint commit, bool isLarger);
    event BetSettled(address indexed gambler, uint amount, uint8 indexed modulo, uint8 rollEdge, uint40 mask, uint outcome, uint winAmount, uint finalWinAmount);
    event BetRefunded(address indexed gambler, uint amount);

    // Fallback payable function used to top up the bank roll.
    fallback() external payable {
        cumulativeDeposit += msg.value;
    }
    receive() external payable {
        cumulativeDeposit += msg.value;
    }

    // See ETH balance.
    function getBalance() external view returns (uint) {
        return address(this).balance;
    }

    // Set minimum larger comparison value.
    function setMinOverValue(uint value) external onlyOwner {
        minOverValue = value;
    }

    // Set maximum smaller comparison value.
    function setMaxUnderValue(uint value) external onlyOwner {
        maxUnderValue = value;
    }
    
    // Set min house edge percent
    function setHouseEdgePercent(uint _houseEdgePercent) external onlyOwner {
        require ( _houseEdgePercent >= 1 && _houseEdgePercent <= 100, "houseEdgePercent must be a sane number");
        houseEdgePercent = _houseEdgePercent;
    }

    // Set min bet amount. minBetAmount should be large enough such that its house edge fee can cover the Chainlink oracle fee.
    function setMinBetAmount(uint _minBetAmount) external onlyOwner {
        minBetAmount = _minBetAmount * 1 gwei;
    }

    // Set max bet amount.
    function setMaxBetAmount(uint _maxBetAmount) external onlyOwner {
        require (_maxBetAmount < 5000000 ether, "maxBetAmount must be a sane number");
        maxBetAmount = _maxBetAmount;
    }

    // Set max bet reward. Setting this to zero effectively disables betting.
    function setMaxProfit(uint _maxProfit) external onlyOwner {
        require (_maxProfit < 50000000 ether, "maxProfit must be a sane number");
        maxProfit = _maxProfit;
    }

    // Set wealth tax percentage to be added to house edge percent. Setting this to zero effectively disables wealth tax.
    function setWealthTaxIncrementPercent(uint _wealthTaxIncrementPercent) external onlyOwner {
        wealthTaxIncrementPercent = _wealthTaxIncrementPercent;
    }

    // Set threshold to trigger wealth tax.
    function setWealthTaxIncrementThreshold(uint _wealthTaxIncrementThreshold) external onlyOwner {
        wealthTaxIncrementThreshold = _wealthTaxIncrementThreshold;
    }

    // Owner can withdraw funds not exceeding balance minus potential win prizes by open bets
    function withdrawFunds(address payable beneficiary, uint withdrawAmount) external onlyOwner {
        require (withdrawAmount <= address(this).balance, "Withdrawal amount larger than balance.");
        require (withdrawAmount <= address(this).balance - lockedInBets, "Withdrawal amount larger than balance minus lockedInBets");
        beneficiary.transfer(withdrawAmount);
        cumulativeWithdrawal += withdrawAmount;
    }

    function emitBetPlacedEvent(address gambler, uint amount, uint8 modulo, uint8 rollEdge, uint40 mask, uint commit, bool isLarger) private
    {
        // Record bet in event logs
        emit BetPlaced(gambler, amount, uint8(modulo), uint8(rollEdge), uint40(mask), commit, isLarger);
    }

    // Place bet
    function placeBet(uint betMask, uint modulo, uint commitLastBlock, uint commit, bool isLarger, bytes32 r, bytes32 s) external payable nonReentrant {

        Bet storage bet = bets[commit];
        require (bet.gambler == address(0), "Bet should be in a 'clean' state.");

        uint amount = msg.value;

        validateArguments(amount, betMask, modulo, commitLastBlock, commit, isLarger, r, s);

        uint rollEdge;
        uint mask;

        if (modulo <= MAX_MASK_MODULO) {
            // Small modulo games can specify exact bet outcomes via bit mask.
            // rollEdge is a number of 1 bits in this mask (population count).
            // This magic looking formula is an efficient way to compute population
            // count on EVM for numbers below 2**40. 
            rollEdge = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
            mask = betMask;
        } else {
            // Larger modulos games specify the right edge of half-open interval of winning bet outcomes.
            require (betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo.");
            rollEdge = betMask;
        }

        // Winning amount.
        uint possibleWinAmount = getDiceWinAmount(amount, modulo, rollEdge, isLarger);

        // Enforce max profit limit. Bet will not be placed if condition is not met.
        require (possibleWinAmount <= amount + maxProfit, "maxProfit limit violation.");

        // Check whether contract has enough funds to accept this bet.
        require (lockedInBets + possibleWinAmount <= address(this).balance, "Unable to accept bet due to insufficient funds");

        // Update lock funds.
        lockedInBets += possibleWinAmount;

        // Store bet
        bet.item.amount=amount;
        bet.item.modulo=uint8(modulo);
        bet.rollEdge=uint8(rollEdge);
        bet.mask=uint40(mask);
        bet.placeBlockNumber=block.number;
        bet.gambler=payable(msg.sender);
        bet.isSettled=false;
        bet.outcome=0;
        bet.winAmount=0;
        bet.finalWinAmount=0;
        bet.randomNumber=0;
        bet.commit=commit;
        bet.isLarger=isLarger;

        // Record bet in event logs
        emitBetPlacedEvent(bet.gambler, amount, uint8(modulo), uint8(rollEdge), uint40(mask), commit, isLarger);
    }

    // Get the expected win amount after house edge is subtracted.
    function getDiceWinAmount(uint amount, uint modulo, uint rollEdge, bool isLarger) private view returns (uint winAmount) {
        require (0 < rollEdge && rollEdge <= modulo, "Win probability out of range.");
        uint houseEdge = amount * (houseEdgePercent + getWealthTax(amount)) / 100;
        uint realRollEdge = rollEdge;
        if (modulo == MAX_MODULO && isLarger) {
            realRollEdge = MAX_MODULO - rollEdge;
        }
        winAmount = (amount - houseEdge) * modulo / realRollEdge;

        uint maxWinAmount = amount + maxProfit;

        if(winAmount > maxWinAmount) {
            winAmount = maxWinAmount;
        }
    }

    // Get wealth tax 
    function getWealthTax(uint amount) private view returns (uint wealthTax) {
        wealthTax = amount / wealthTaxIncrementThreshold * wealthTaxIncrementPercent;
    }
    
    // This is the method used to settle 99% of bets. To process a bet with a specific
    // "commit", settleBet should supply a "reveal" number that would Keccak256-hash to
    // "commit". "transactionHash" is the block hash of placeBet block as seen by croupier; it
    // is additionally asserted to prevent changing the bet outcomes on Ethereum reorgs.
    function settleBet(uint reveal, bytes32 transactionHash, uint finalWinAmount) external onlyOwner {
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        Bet storage bet = bets[commit];
        uint placeBlockNumber = bet.placeBlockNumber;

        require (bet.gambler != address(0), "Bet should be in a 'bet' state.");

        // Check that bet has not expired yet (see comment to BET_EXPIRATION_BLOCKS).
        require (block.number >= placeBlockNumber, "settleBet before placeBet");

        // Set final win amount
        bet.finalWinAmount = finalWinAmount;

        // Settle bet using reveal and blockHash as entropy sources.
        settleBetCommon(bet, reveal, transactionHash);
    }

    // This method is used to settle a bet that was mined into an uncle block. At this
    // point the player was shown some bet outcome, but the blockhash at placeBet height
    // is different because of Ethereum chain reorg. We supply a full merkle proof of the
    // placeBet transaction receipt to provide untamperable evidence that uncle block hash
    // indeed was present on-chain at some point.
    function settleBetUncleMerkleProof(uint reveal, uint40 canonicalBlockNumber) external onlyOwner {
        // "commit" for bet settlement can only be obtained by hashing a "reveal".
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        Bet storage bet = bets[commit];

        // Check that canonical block hash can still be verified.
        require (block.number <= canonicalBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");

        // Verify placeBet receipt.
        requireCorrectReceipt(4 + 32 + 32 + 4);

        // Reconstruct canonical & uncle block hashes from a receipt merkle proof, verify them.
        bytes32 canonicalHash;
        bytes32 uncleHash;
        (canonicalHash, uncleHash) = verifyMerkleProof(commit, 4 + 32 + 32);
        require (blockhash(canonicalBlockNumber) == canonicalHash);

        // Settle bet using reveal and uncleHash as entropy sources.
        settleBetCommon(bet, reveal, uncleHash);
    }

    // Common settlement code for settleBet & settleBetUncleMerkleProof.
    function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash) private {
        // Fetch bet parameters into local variables (to save gas).
        uint amount = bet.item.amount;
        
        // Validation check
        require (amount > 0, "Bet does not exist."); // Check that bet exists
        require(bet.isSettled == false, "Bet is settled already"); // Check that bet is not settled yet

        // Fetch bet parameters into local variables (to save gas).
        uint modulo = bet.item.modulo;
        uint rollEdge = bet.rollEdge;
        address payable gambler = bet.gambler;
        bool isLarger = bet.isLarger;
        
        // The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners
        // are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256
        // preimage is intractable), and house is unable to alter the "reveal" after
        // placeBet have been mined (as Keccak256 collision finding is also intractable).
        bytes32 entropy = keccak256(abi.encodePacked(reveal, entropyBlockHash));

        // Do a roll by taking a modulo of entropy. Compute winning amount.
        uint outcome = uint(entropy) % modulo;

        // Win amount if gambler wins this bet
        uint possibleWinAmount = getDiceWinAmount(amount, modulo, rollEdge, isLarger);

        // Actual win amount by gambler
        uint winAmount = 0;

        // Determine dice outcome.
        if (modulo <= MAX_MASK_MODULO) {
            // For small modulo games, check the outcome against a bit mask.
            if ((2 ** outcome) & bet.mask != 0) {
                winAmount = possibleWinAmount;
            }
        } else {
            // For larger modulos, check inclusion into half-open interval.
            if (isLarger){
                if (outcome > rollEdge) {
                    winAmount = possibleWinAmount;
                }
            }
            else{
                if (outcome < rollEdge) {
                    winAmount = possibleWinAmount;
                }
            }
            
        }

        // Unlock possibleWinAmount from lockedInBets, regardless of the outcome.
        lockedInBets -= possibleWinAmount;

        // Update bet records
        bet.isSettled = true;
        bet.winAmount = winAmount;
        bet.randomNumber = uint(entropy);
        bet.outcome = outcome;

        if (bet.finalWinAmount == 0 || bet.finalWinAmount > bet.winAmount)
        {
            bet.finalWinAmount = winAmount;
        }

        // Send win amount to gambler.
        if (bet.finalWinAmount > 0) {
            gambler.transfer(bet.finalWinAmount);
        }

        emitSettledEvent(bet);
    }

    function emitSettledEvent(Bet storage bet) private
    {
        uint amount = bet.item.amount;
        uint outcome = bet.outcome;
        uint winAmount = bet.winAmount;
        uint finalWinAmount = bet.finalWinAmount;
        // Fetch bet parameters into local variables (to save gas).
        uint modulo = bet.item.modulo;
        uint rollEdge = bet.rollEdge;
        address payable gambler = bet.gambler;
        // Record bet settlement in event log.
        emit BetSettled(gambler, amount, uint8(modulo), uint8(rollEdge), bet.mask, outcome, winAmount, finalWinAmount);
    }

    // Return the bet in extremely unlikely scenario it was not settled by Chainlink VRF. 
    // In case you ever find yourself in a situation like this, just contact hashbet support.
    // However, nothing precludes you from calling this method yourself.
    function refundBet(uint commit) external nonReentrant payable {
        
        Bet storage bet = bets[commit];
        uint amount = bet.item.amount;
        bool isLarger = bet.isLarger;

        // Validation check
        require (amount > 0, "Bet does not exist."); // Check that bet exists
        require (bet.isSettled == false, "Bet is settled already."); // Check that bet is still open
        require (block.number > bet.placeBlockNumber + 43200, "Wait after placing bet before requesting refund.");

        uint possibleWinAmount = getDiceWinAmount(amount, bet.item.modulo, bet.rollEdge, isLarger);

        // Unlock possibleWinAmount from lockedInBets, regardless of the outcome.
        lockedInBets -= possibleWinAmount;

        // Update bet records
        bet.isSettled = true;
        bet.winAmount = amount;

        // Send the refund.
        bet.gambler.transfer(amount);

        // Record refund in event logs
        emit BetRefunded(bet.gambler, amount);
    }

    // This helpers are used to verify cryptographic proofs of placeBet inclusion into
    // uncle blocks. They are used to prevent bet outcome changing on Ethereum reorgs without
    // compromising the security of the smart contract. Proof data is appended to the input data
    // in a simple prefix length format and does not adhere to the ABI.
    // Invariants checked:
    //  - receipt trie entry contains a (1) successful transaction (2) directed at this smart
    //    contract (3) containing commit as a payload.
    //  - receipt trie entry is a part of a valid merkle proof of a block header
    //  - the block header is a part of uncle list of some block on canonical chain
    // The implementation is optimized for gas cost and relies on the specifics of Ethereum internal data structures.
    // Read the whitepaper for details.

    // Helper to verify a full merkle proof starting from some seedHash (usually commit). "offset" is the location of the proof
    // beginning in the calldata.
    function verifyMerkleProof(uint seedHash, uint offset) pure private returns (bytes32 blockHash, bytes32 uncleHash) {
        // (Safe) assumption - nobody will write into RAM during this method invocation.
        uint scratchBuf1;  assembly { scratchBuf1 := mload(0x40) }

        uint uncleHeaderLength; uint blobLength; uint shift; uint hashSlot;

        // Verify merkle proofs up to uncle block header. Calldata layout is:
        //  - 2 byte big-endian slice length
        //  - 2 byte big-endian offset to the beginning of previous slice hash within the current slice (should be zeroed)
        //  - followed by the current slice verbatim
        for (;; offset += blobLength) {
            assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) }
            if (blobLength == 0) {
                // Zero slice length marks the end of uncle proof.
                break;
            }

            assembly { shift := and(calldataload(sub(offset, 28)), 0xffff) }
            require (shift + 32 <= blobLength, "Shift bounds check.");

            offset += 4;
            assembly { hashSlot := calldataload(add(offset, shift)) }
            require (hashSlot == 0, "Non-empty hash slot.");

            assembly {
                calldatacopy(scratchBuf1, offset, blobLength)
                mstore(add(scratchBuf1, shift), seedHash)
                seedHash := keccak256(scratchBuf1, blobLength)
                uncleHeaderLength := blobLength
            }
        }

        // At this moment the uncle hash is known.
        uncleHash = bytes32(seedHash);

        // Construct the uncle list of a canonical block.
        uint scratchBuf2 = scratchBuf1 + uncleHeaderLength;
        uint unclesLength; assembly { unclesLength := and(calldataload(sub(offset, 28)), 0xffff) }
        uint unclesShift;  assembly { unclesShift := and(calldataload(sub(offset, 26)), 0xffff) }
        require (unclesShift + uncleHeaderLength <= unclesLength, "Shift bounds check.");

        offset += 6;
        assembly { calldatacopy(scratchBuf2, offset, unclesLength) }
        memcpy(scratchBuf2 + unclesShift, scratchBuf1, uncleHeaderLength);

        assembly { seedHash := keccak256(scratchBuf2, unclesLength) }

        offset += unclesLength;

        // Verify the canonical block header using the computed sha3Uncles.
        assembly {
            blobLength := and(calldataload(sub(offset, 30)), 0xffff)
            shift := and(calldataload(sub(offset, 28)), 0xffff)
        }
        require (shift + 32 <= blobLength, "Shift bounds check.");

        offset += 4;
        assembly { hashSlot := calldataload(add(offset, shift)) }
        require (hashSlot == 0, "Non-empty hash slot.");

        assembly {
            calldatacopy(scratchBuf1, offset, blobLength)
            mstore(add(scratchBuf1, shift), seedHash)

            // At this moment the canonical block hash is known.
            blockHash := keccak256(scratchBuf1, blobLength)
        }
    }


    // Helper to check the placeBet receipt. "offset" is the location of the proof beginning in the calldata.
    // RLP layout: [triePath, str([status, cumGasUsed, bloomFilter, [[address, [topics], data]])]
    function requireCorrectReceipt(uint offset) view private {
        uint leafHeaderByte; assembly { leafHeaderByte := byte(0, calldataload(offset)) }

        require (leafHeaderByte >= 0xf7, "Receipt leaf longer than 55 bytes.");
        offset += leafHeaderByte - 0xf6;

        uint pathHeaderByte; assembly { pathHeaderByte := byte(0, calldataload(offset)) }

        if (pathHeaderByte <= 0x7f) {
            offset += 1;

        } else {
            require (pathHeaderByte >= 0x80 && pathHeaderByte <= 0xb7, "Path is an RLP string.");
            offset += pathHeaderByte - 0x7f;
        }

        uint receiptStringHeaderByte; assembly { receiptStringHeaderByte := byte(0, calldataload(offset)) }
        require (receiptStringHeaderByte == 0xb9, "Receipt string is always at least 256 bytes long, but less than 64k.");
        offset += 3;

        uint receiptHeaderByte; assembly { receiptHeaderByte := byte(0, calldataload(offset)) }
        require (receiptHeaderByte == 0xf9, "Receipt is always at least 256 bytes long, but less than 64k.");
        offset += 3;

        uint statusByte; assembly { statusByte := byte(0, calldataload(offset)) }
        require (statusByte == 0x1, "Status should be success.");
        offset += 1;

        uint cumGasHeaderByte; assembly { cumGasHeaderByte := byte(0, calldataload(offset)) }
        if (cumGasHeaderByte <= 0x7f) {
            offset += 1;

        } else {
            require (cumGasHeaderByte >= 0x80 && cumGasHeaderByte <= 0xb7, "Cumulative gas is an RLP string.");
            offset += cumGasHeaderByte - 0x7f;
        }

        uint bloomHeaderByte; assembly { bloomHeaderByte := byte(0, calldataload(offset)) }
        require (bloomHeaderByte == 0xb9, "Bloom filter is always 256 bytes long.");
        offset += 256 + 3;

        uint logsListHeaderByte; assembly { logsListHeaderByte := byte(0, calldataload(offset)) }
        require (logsListHeaderByte == 0xf8, "Logs list is less than 256 bytes long.");
        offset += 2;

        uint logEntryHeaderByte; assembly { logEntryHeaderByte := byte(0, calldataload(offset)) }
        require (logEntryHeaderByte == 0xf8, "Log entry is less than 256 bytes long.");
        offset += 2;

        uint addressHeaderByte; assembly { addressHeaderByte := byte(0, calldataload(offset)) }
        require (addressHeaderByte == 0x94, "Address is 20 bytes long.");

        uint logAddress; assembly { logAddress := and(calldataload(sub(offset, 11)), 0xffffffffffffffffffffffffffffffffffffffff) }
        require (logAddress == uint(uint160(address(this))));
    }

    // Memory copy.
    function memcpy(uint dest, uint src, uint len) pure private {
        // Full 32 byte words
        for(; len >= 32; len -= 32) {
            assembly { mstore(dest, mload(src)) }
            dest += 32; src += 32;
        }

        // Remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    // Check arguments
    function validateArguments(uint amount, uint betMask, uint modulo, uint commitLastBlock, uint commit, bool isLarger, bytes32 r, bytes32 s) view private {
        // Validate input data.
        require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range.");
        require (amount >= minBetAmount && amount <= maxBetAmount, "Bet amount should be within range.");
        require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range.");
        
        // Check that commit is valid - it has not expired and its signature is valid.
        require (block.number <= commitLastBlock, "Commit has expired.");
        bytes32 signatureHash = keccak256(abi.encodePacked(betMask, modulo, commitLastBlock, commit, isLarger));
        require (owner() == ecrecover(signatureHash, 27, r, s), "ECDSA signature is not valid.");

        if (modulo > MAX_MASK_MODULO) {
            if (isLarger){
                require (betMask >= minOverValue && betMask <= modulo, "High modulo range, betMask must larger than minimum larger comparison value.");
            }
            else{
                require (betMask > 0 && betMask <= maxUnderValue, "High modulo range, betMask must smaller than maximum smaller comparison value.");
            }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollEdge","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"commit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLarger","type":"bool"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollEdge","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalWinAmount","type":"uint256"}],"name":"BetSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"}],"internalType":"struct HashBet.BetItem","name":"item","type":"tuple"},{"internalType":"uint8","name":"rollEdge","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"address payable","name":"gambler","type":"address"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"},{"internalType":"uint256","name":"finalWinAmount","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"},{"internalType":"uint256","name":"commit","type":"uint256"},{"internalType":"bool","name":"isLarger","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseEdgePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedInBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUnderValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minOverValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betMask","type":"uint256"},{"internalType":"uint256","name":"modulo","type":"uint256"},{"internalType":"uint256","name":"commitLastBlock","type":"uint256"},{"internalType":"uint256","name":"commit","type":"uint256"},{"internalType":"bool","name":"isLarger","type":"bool"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_houseEdgePercent","type":"uint256"}],"name":"setHouseEdgePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBetAmount","type":"uint256"}],"name":"setMaxBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxUnderValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinOverValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wealthTaxIncrementPercent","type":"uint256"}],"name":"setWealthTaxIncrementPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wealthTaxIncrementThreshold","type":"uint256"}],"name":"setWealthTaxIncrementThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reveal","type":"uint256"},{"internalType":"bytes32","name":"transactionHash","type":"bytes32"},{"internalType":"uint256","name":"finalWinAmount","type":"uint256"}],"name":"settleBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reveal","type":"uint256"},{"internalType":"uint40","name":"canonicalBlockNumber","type":"uint40"}],"name":"settleBetUncleMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wealthTaxIncrementPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wealthTaxIncrementThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405268a2a15d09519be000006004556001600555662386f26fc1000060065569021e19e0c9bab2400000600755693f870857a3e0e38000006008556032600a556032600b556002600c553480156200005957600080fd5b506200007a6200006e6200008760201b60201c565b6200008f60201b60201c565b6001808190555062000153565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61437b80620001636000396000f3fe6080604052600436106101c65760003560e01c80638eb12c20116100f7578063cab11d5d11610095578063e1fdb4b411610064578063e1fdb4b41461061a578063f2fde38b14610636578063fa968eea1461065f578063fbd668a91461068a576101e6565b8063cab11d5d14610570578063cf96ce031461059b578063d98e6ae6146105c4578063df88126f146105ef576101e6565b8063b539cd55116100d1578063b539cd55146104d7578063bd7fd78d14610502578063c10753291461052b578063c6d1d5aa14610554576101e6565b80638eb12c201461045c5780638fedadf114610485578063af3dc07f146104ae576101e6565b806370d8c5781161016457806374e048d51161013e57806374e048d5146103b657806377010f70146103df5780637cfbc7a5146104085780638da5cb5b14610431576101e6565b806370d8c57814610349578063715018a61461037457806372318cf91461038b576101e6565b80631f9d3a2b116101a05780631f9d3a2b1461028257806322af00fa146102ad578063386d5fe6146102f55780636c18859314610320576101e6565b80630c531f271461020157806312065fe01461022c578063177c55c814610257576101e6565b366101e65734600260008282546101dd9190612520565b92505081905550005b34600260008282546101f89190612520565b92505081905550005b34801561020d57600080fd5b506102166106b3565b6040516102239190612585565b60405180910390f35b34801561023857600080fd5b506102416106b9565b60405161024e9190612585565b60405180910390f35b34801561026357600080fd5b5061026c6106c1565b6040516102799190612585565b60405180910390f35b34801561028e57600080fd5b506102976106c7565b6040516102a49190612585565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906125d1565b6106cd565b6040516102ec9c9b9a999897969594939291906126e3565b60405180910390f35b34801561030157600080fd5b5061030a6107b6565b6040516103179190612585565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906125d1565b6107bc565b005b34801561035557600080fd5b5061035e6107dd565b60405161036b9190612585565b60405180910390f35b34801561038057600080fd5b506103896107e3565b005b34801561039757600080fd5b506103a06107f7565b6040516103ad9190612585565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906127ca565b6107fd565b005b3480156103eb57600080fd5b50610406600480360381019061040191906125d1565b6108e7565b005b34801561041457600080fd5b5061042f600480360381019061042a91906125d1565b6108f9565b005b34801561043d57600080fd5b50610446610958565b604051610453919061282b565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061287c565b610981565b005b34801561049157600080fd5b506104ac60048036038101906104a791906125d1565b610aca565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906125d1565b610adc565b005b3480156104e357600080fd5b506104ec610aee565b6040516104f99190612585565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906125d1565b610af4565b005b34801561053757600080fd5b50610552600480360381019061054d91906128fb565b610b06565b005b61056e60048036038101906105699190612967565b610c05565b005b34801561057c57600080fd5b50610585610fbd565b6040516105929190612585565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906125d1565b610fc3565b005b3480156105d057600080fd5b506105d9611026565b6040516105e69190612585565b60405180910390f35b3480156105fb57600080fd5b5061060461102c565b6040516106119190612585565b60405180910390f35b610634600480360381019061062f91906125d1565b611032565b005b34801561064257600080fd5b5061065d60048036038101906106589190612a35565b6112c7565b005b34801561066b57600080fd5b5061067461134b565b6040516106819190612585565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906125d1565b611351565b005b60025481565b600047905090565b600b5481565b600c5481565b600d60205280600052604060002060009150905080600001604051806040016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681525050908060020160009054906101000a900460ff16908060020160019054906101000a900464ffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460ff169080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff1690508c565b60055481565b6107c46113b0565b633b9aca00816107d49190612a62565b60068190555050565b60045481565b6107eb6113b0565b6107f5600061142e565b565b60035481565b6108056113b0565b6000826040516020016108189190612add565b6040516020818303038152906040528051906020012060001c90506000600d6000838152602001908152602001600020905060fa8364ffffffffff1661085e9190612520565b4311156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612b7b565b60405180910390fd5b6108aa60486114f2565b6000806108b8846044611939565b8092508193505050818564ffffffffff1640146108d457600080fd5b6108df838783611bcd565b505050505050565b6108ef6113b0565b80600b8190555050565b6109016113b0565b6a0422ca8b0a00a425000000811061094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612c0d565b60405180910390fd5b8060078190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109896113b0565b60008360405160200161099c9190612add565b6040516020818303038152906040528051906020012060001c90506000600d60008381526020019081526020016000209050600081600301549050600073ffffffffffffffffffffffffffffffffffffffff168260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612c79565b60405180910390fd5b80431015610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590612ce5565b60405180910390fd5b838260070181905550610ac2828787611bcd565b505050505050565b610ad26113b0565b80600a8190555050565b610ae46113b0565b8060048190555050565b60085481565b610afc6113b0565b8060058190555050565b610b0e6113b0565b47811115610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612d77565b60405180910390fd5b60095447610b5f9190612d97565b811115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612e3d565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b508060036000828254610bfa9190612520565b925050819055505050565b610c0d611e8f565b6000600d60008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612ecf565b60405180910390fd5b6000349050610ccc818a8a8a8a8a8a8a611edf565b60008060288a11610d3457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018d610d1f9190612a62565b16610d2a9190612f1e565b91508a9050610d87565b60008b118015610d445750898b11155b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612fc1565b60405180910390fd5b8a91505b6000610d95848c858b6121da565b905060085484610da59190612520565b811115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061302d565b60405180910390fd5b4781600954610df69190612520565b1115610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906130bf565b60405180910390fd5b8060096000828254610e499190612520565b925050819055508385600001600001819055508a8560000160010160006101000a81548160ff021916908360ff160217905550828560020160006101000a81548160ff021916908360ff160217905550818560020160016101000a81548164ffffffffff021916908364ffffffffff160217905550438560030181905550338560040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008560040160146101000a81548160ff021916908315150217905550600085600501819055506000856006018190555060008560070181905550600085600801819055508885600901819055508785600a0160006101000a81548160ff021916908315150217905550610fa78560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858d86868e8e6122d0565b5050505050610fb4612333565b50505050505050565b60075481565b610fcb6113b0565b60018110158015610fdd575060648111155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390613151565b60405180910390fd5b80600c8190555050565b600a5481565b60095481565b61103a611e8f565b6000600d60008381526020019081526020016000209050600081600001600001549050600082600a0160009054906101000a900460ff169050600082116110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906131bd565b60405180910390fd5b600015158360040160149054906101000a900460ff1615151461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613229565b60405180910390fd5b61a8c083600301546111209190612520565b4311611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906132bb565b60405180910390fd5b600061119a838560000160010160009054906101000a900460ff1660ff168660020160009054906101000a900460ff1660ff16856121da565b905080600960008282546111ae9190612d97565b9250508190555060018460040160146101000a81548160ff0219169083151502179055508284600601819055508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611245573d6000803e3d6000fd5b508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95a7aa5c378b3f64e4945d7b72f659200d9fa121b2fabc0a521125f46267ab22846040516112b09190612585565b60405180910390a2505050506112c4612333565b50565b6112cf6113b0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061334d565b60405180910390fd5b6113488161142e565b50565b60065481565b6113596113b0565b6a295be96e6406697200000081106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906133b9565b60405180910390fd5b8060088190555050565b6113b861233c565b73ffffffffffffffffffffffffffffffffffffffff166113d6610958565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613425565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813560001a905060f781101561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906134b7565b60405180910390fd5b60f68161154c9190612d97565b826115579190612520565b91506000823560001a9050607f811161157e576001836115779190612520565b92506115ea565b60808110158015611590575060b78111155b6115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613523565b60405180910390fd5b607f816115dc9190612d97565b836115e79190612520565b92505b6000833560001a905060b98114611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906135db565b60405180910390fd5b6003846116439190612520565b93506000843560001a905060f98114611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061366d565b60405180910390fd5b60038561169e9190612520565b94506000853560001a9050600181146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e3906136d9565b60405180910390fd5b6001866116f99190612520565b95506000863560001a9050607f8111611720576001876117199190612520565b965061178c565b60808110158015611732575060b78111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613745565b60405180910390fd5b607f8161177e9190612d97565b876117899190612520565b96505b6000873560001a905060b981146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906137d7565b60405180910390fd5b610103886117e69190612520565b97506000883560001a905060f88114611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613869565b60405180910390fd5b6002896118419190612520565b98506000893560001a905060f8811461188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906138fb565b60405180910390fd5b60028a61189c9190612520565b995060008a3560001a9050609481146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613967565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff16811461192b57600080fd5b505050505050505050505050565b600080600060405190506000806000805b61ffff601e890335169250600083141561196357611a39565b61ffff601c8903351691508260208361197c9190612520565b11156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906139d3565b60405180910390fd5b6004886119ca9190612520565b975081880135905060008114611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613a3f565b60405180910390fd5b82888637888286015282852098508293508288611a329190612520565b975061194a565b8860001b955060008486611a4d9190612520565b9050600061ffff601c8b0335169050600061ffff601a8c0335169050818782611a769190612520565b1115611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906139d3565b60405180910390fd5b60068b611ac49190612520565b9a50818b8437611ae08184611ad99190612520565b8989612344565b8183209b50818b611af19190612520565b9a5061ffff601e8c033516955061ffff601c8c033516945085602086611b179190612520565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906139d3565b60405180910390fd5b60048b611b659190612520565b9a50848b0135935060008414611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790613a3f565b60405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008360000160000154905060008111611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906131bd565b60405180910390fd5b600015158460040160149054906101000a900460ff16151514611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613aab565b60405180910390fd5b60008460000160010160009054906101000a900460ff1660ff16905060008560020160009054906101000a900460ff1660ff16905060008660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600087600a0160009054906101000a900460ff16905060008787604051602001611cfd929190613aec565b6040516020818303038152906040528051906020012090506000858260001c611d269190612f1e565b90506000611d36888888876121da565b9050600060288811611d7d5760008c60020160019054906101000a900464ffffffffff1664ffffffffff16846002611d6e9190613c4b565b1614611d78578190505b611da2565b8415611d945786831115611d8f578190505b611da1565b86831015611da0578190505b5b5b8160096000828254611db49190612d97565b9250508190555060018c60040160146101000a81548160ff021916908315150217905550808c600601819055508360001c8c60080181905550828c6005018190555060008c600701541480611e1057508b600601548c60070154115b15611e1f57808c600701819055505b60008c600701541115611e78578573ffffffffffffffffffffffffffffffffffffffff166108fc8d600701549081150290604051600060405180830381858888f19350505050158015611e76573d6000803e3d6000fd5b505b611e818c6123c3565b505050505050505050505050565b60026001541415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613ce2565b60405180910390fd5b6002600181905550565b600186118015611ef0575060648611155b611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690613d4e565b60405180910390fd5b6006548810158015611f4357506007548811155b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613de0565b60405180910390fd5b600087118015611f9e575060286002611f9b9190613c4b565b87105b611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613e4c565b60405180910390fd5b84431115612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790613eb8565b60405180910390fd5b6000878787878760405160200161203b959493929190613f20565b604051602081830303815290604052805190602001209050600181601b8585604051600081526020016040526040516120779493929190613fd3565b6020604051602081039080840390855afa158015612099573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166120c1610958565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614064565b60405180910390fd5b60288711156121cf57831561217c57600a5488101580156121385750868811155b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061411c565b60405180910390fd5b6121ce565b60008811801561218e5750600b548811155b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906141d4565b60405180910390fd5b5b5b505050505050505050565b60008260001080156121ec5750838311155b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614240565b60405180910390fd5b60006064612238876124c3565b600c546122459190612520565b876122509190612a62565b61225a9190614260565b9050600084905060648614801561226e5750835b15612283578460646122809190612d97565b90505b808683896122919190612d97565b61229b9190612a62565b6122a59190614260565b92506000600854886122b79190612520565b9050808411156122c5578093505b505050949350505050565b8460ff168773ffffffffffffffffffffffffffffffffffffffff167fe49dc342a2664c9376180e6cd7e3e53ba5d52541c470911b4b8f8a2fcb1b2c618887878787604051612322959493929190614291565b60405180910390a350505050505050565b60018081905550565b600033905090565b5b60208110612383578151835260208361235e9190612520565b925060208261236d9190612520565b915060208161237c9190612d97565b9050612345565b600060018260206123949190612d97565b6101006123a19190613c4b565b6123ab9190612d97565b90508019835116818551168181178652505050505050565b60008160000160000154905060008260050154905060008360060154905060008460070154905060008560000160010160009054906101000a900460ff1660ff16905060008660020160009054906101000a900460ff1660ff16905060008760040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508260ff168173ffffffffffffffffffffffffffffffffffffffff167f6e66a5f78adb6dee2af6a518dc7a979c4ed4794fa1056b8bf6ac19280e81d19489858c60020160019054906101000a900464ffffffffff168b8b8b6040516124b1969594939291906142e4565b60405180910390a35050505050505050565b6000600554600454836124d69190614260565b6124e09190612a62565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061252b826124e7565b9150612536836124e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256b5761256a6124f1565b5b828201905092915050565b61257f816124e7565b82525050565b600060208201905061259a6000830184612576565b92915050565b600080fd5b6125ae816124e7565b81146125b957600080fd5b50565b6000813590506125cb816125a5565b92915050565b6000602082840312156125e7576125e66125a0565b5b60006125f5848285016125bc565b91505092915050565b612607816124e7565b82525050565b600060ff82169050919050565b6126238161260d565b82525050565b60408201600082015161263f60008501826125fe565b506020820151612652602085018261261a565b50505050565b6126618161260d565b82525050565b600064ffffffffff82169050919050565b61268181612667565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126b282612687565b9050919050565b6126c2816126a7565b82525050565b60008115159050919050565b6126dd816126c8565b82525050565b60006101a0820190506126f9600083018f612629565b612706604083018e612658565b612713606083018d612678565b612720608083018c612576565b61272d60a083018b6126b9565b61273a60c083018a6126d4565b61274760e0830189612576565b612755610100830188612576565b612763610120830187612576565b612771610140830186612576565b61277f610160830185612576565b61278d6101808301846126d4565b9d9c50505050505050505050505050565b6127a781612667565b81146127b257600080fd5b50565b6000813590506127c48161279e565b92915050565b600080604083850312156127e1576127e06125a0565b5b60006127ef858286016125bc565b9250506020612800858286016127b5565b9150509250929050565b600061281582612687565b9050919050565b6128258161280a565b82525050565b6000602082019050612840600083018461281c565b92915050565b6000819050919050565b61285981612846565b811461286457600080fd5b50565b60008135905061287681612850565b92915050565b600080600060608486031215612895576128946125a0565b5b60006128a3868287016125bc565b93505060206128b486828701612867565b92505060406128c5868287016125bc565b9150509250925092565b6128d8816126a7565b81146128e357600080fd5b50565b6000813590506128f5816128cf565b92915050565b60008060408385031215612912576129116125a0565b5b6000612920858286016128e6565b9250506020612931858286016125bc565b9150509250929050565b612944816126c8565b811461294f57600080fd5b50565b6000813590506129618161293b565b92915050565b600080600080600080600060e0888a031215612986576129856125a0565b5b60006129948a828b016125bc565b97505060206129a58a828b016125bc565b96505060406129b68a828b016125bc565b95505060606129c78a828b016125bc565b94505060806129d88a828b01612952565b93505060a06129e98a828b01612867565b92505060c06129fa8a828b01612867565b91505092959891949750929550565b612a128161280a565b8114612a1d57600080fd5b50565b600081359050612a2f81612a09565b92915050565b600060208284031215612a4b57612a4a6125a0565b5b6000612a5984828501612a20565b91505092915050565b6000612a6d826124e7565b9150612a78836124e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ab157612ab06124f1565b5b828202905092915050565b6000819050919050565b612ad7612ad2826124e7565b612abc565b82525050565b6000612ae98284612ac6565b60208201915081905092915050565b600082825260208201905092915050565b7f426c6f636b686173682063616e2774206265207175657269656420627920455660008201527f4d2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b65602283612af8565b9150612b7082612b09565b604082019050919050565b60006020820190508181036000830152612b9481612b58565b9050919050565b7f6d6178426574416d6f756e74206d75737420626520612073616e65206e756d6260008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bf7602283612af8565b9150612c0282612b9b565b604082019050919050565b60006020820190508181036000830152612c2681612bea565b9050919050565b7f4265742073686f756c6420626520696e20612027626574272073746174652e00600082015250565b6000612c63601f83612af8565b9150612c6e82612c2d565b602082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f736574746c65426574206265666f726520706c61636542657400000000000000600082015250565b6000612ccf601983612af8565b9150612cda82612c99565b602082019050919050565b60006020820190508181036000830152612cfe81612cc2565b9050919050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e63652e0000000000000000000000000000000000000000000000000000602082015250565b6000612d61602683612af8565b9150612d6c82612d05565b604082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b6000612da2826124e7565b9150612dad836124e7565b925082821015612dc057612dbf6124f1565b5b828203905092915050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e6365206d696e7573206c6f636b6564496e426574730000000000000000602082015250565b6000612e27603883612af8565b9150612e3282612dcb565b604082019050919050565b60006020820190508181036000830152612e5681612e1a565b9050919050565b7f4265742073686f756c6420626520696e20612027636c65616e2720737461746560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eb9602183612af8565b9150612ec482612e5d565b604082019050919050565b60006020820190508181036000830152612ee881612eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f29826124e7565b9150612f34836124e7565b925082612f4457612f43612eef565b5b828206905092915050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560008201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000602082015250565b6000612fab602e83612af8565b9150612fb682612f4f565b604082019050919050565b60006020820190508181036000830152612fda81612f9e565b9050919050565b7f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000600082015250565b6000613017601a83612af8565b915061302282612fe1565b602082019050919050565b600060208201905081810360008301526130468161300a565b9050919050565b7f556e61626c6520746f20616363657074206265742064756520746f20696e737560008201527f6666696369656e742066756e6473000000000000000000000000000000000000602082015250565b60006130a9602e83612af8565b91506130b48261304d565b604082019050919050565b600060208201905081810360008301526130d88161309c565b9050919050565b7f686f7573654564676550657263656e74206d75737420626520612073616e652060008201527f6e756d6265720000000000000000000000000000000000000000000000000000602082015250565b600061313b602683612af8565b9150613146826130df565b604082019050919050565b6000602082019050818103600083015261316a8161312e565b9050919050565b7f42657420646f6573206e6f742065786973742e00000000000000000000000000600082015250565b60006131a7601383612af8565b91506131b282613171565b602082019050919050565b600060208201905081810360008301526131d68161319a565b9050919050565b7f42657420697320736574746c656420616c72656164792e000000000000000000600082015250565b6000613213601783612af8565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b9050919050565b7f5761697420616674657220706c6163696e6720626574206265666f726520726560008201527f7175657374696e6720726566756e642e00000000000000000000000000000000602082015250565b60006132a5603083612af8565b91506132b082613249565b604082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613337602683612af8565b9150613342826132db565b604082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f6d617850726f666974206d75737420626520612073616e65206e756d62657200600082015250565b60006133a3601f83612af8565b91506133ae8261336d565b602082019050919050565b600060208201905081810360008301526133d281613396565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061340f602083612af8565b915061341a826133d9565b602082019050919050565b6000602082019050818103600083015261343e81613402565b9050919050565b7f52656365697074206c656166206c6f6e676572207468616e203535206279746560008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a1602283612af8565b91506134ac82613445565b604082019050919050565b600060208201905081810360008301526134d081613494565b9050919050565b7f5061746820697320616e20524c5020737472696e672e00000000000000000000600082015250565b600061350d601683612af8565b9150613518826134d7565b602082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f5265636569707420737472696e6720697320616c77617973206174206c65617360008201527f7420323536206279746573206c6f6e672c20627574206c657373207468616e2060208201527f36346b2e00000000000000000000000000000000000000000000000000000000604082015250565b60006135c5604483612af8565b91506135d082613543565b606082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f5265636569707420697320616c77617973206174206c6561737420323536206260008201527f79746573206c6f6e672c20627574206c657373207468616e2036346b2e000000602082015250565b6000613657603d83612af8565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5374617475732073686f756c6420626520737563636573732e00000000000000600082015250565b60006136c3601983612af8565b91506136ce8261368d565b602082019050919050565b600060208201905081810360008301526136f2816136b6565b9050919050565b7f43756d756c61746976652067617320697320616e20524c5020737472696e672e600082015250565b600061372f602083612af8565b915061373a826136f9565b602082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b7f426c6f6f6d2066696c74657220697320616c776179732032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006137c1602683612af8565b91506137cc82613765565b604082019050919050565b600060208201905081810360008301526137f0816137b4565b9050919050565b7f4c6f6773206c697374206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b6000613853602683612af8565b915061385e826137f7565b604082019050919050565b6000602082019050818103600083015261388281613846565b9050919050565b7f4c6f6720656e747279206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006138e5602683612af8565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f41646472657373206973203230206279746573206c6f6e672e00000000000000600082015250565b6000613951601983612af8565b915061395c8261391b565b602082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f536869667420626f756e647320636865636b2e00000000000000000000000000600082015250565b60006139bd601383612af8565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000600082015250565b6000613a29601483612af8565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b7f42657420697320736574746c656420616c726561647900000000000000000000600082015250565b6000613a95601683612af8565b9150613aa082613a5f565b602082019050919050565b60006020820190508181036000830152613ac481613a88565b9050919050565b6000819050919050565b613ae6613ae182612846565b613acb565b82525050565b6000613af88285612ac6565b602082019150613b088284613ad5565b6020820191508190509392505050565b60008160011c9050919050565b6000808291508390505b6001851115613b6f57808604811115613b4b57613b4a6124f1565b5b6001851615613b5a5780820291505b8081029050613b6885613b18565b9450613b2f565b94509492505050565b600082613b885760019050613c44565b81613b965760009050613c44565b8160018114613bac5760028114613bb657613be5565b6001915050613c44565b60ff841115613bc857613bc76124f1565b5b8360020a915084821115613bdf57613bde6124f1565b5b50613c44565b5060208310610133831016604e8410600b8410161715613c1a5782820a905083811115613c1557613c146124f1565b5b613c44565b613c278484846001613b25565b92509050818404811115613c3e57613c3d6124f1565b5b81810290505b9392505050565b6000613c56826124e7565b9150613c61836124e7565b9250613c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b78565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ccc601f83612af8565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000600082015250565b6000613d38601e83612af8565b9150613d4382613d02565b602082019050919050565b60006020820190508181036000830152613d6781613d2b565b9050919050565b7f42657420616d6f756e742073686f756c642062652077697468696e2072616e6760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dca602283612af8565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000600082015250565b6000613e36601c83612af8565b9150613e4182613e00565b602082019050919050565b60006020820190508181036000830152613e6581613e29565b9050919050565b7f436f6d6d69742068617320657870697265642e00000000000000000000000000600082015250565b6000613ea2601383612af8565b9150613ead82613e6c565b602082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b60008160f81b9050919050565b6000613ef082613ed8565b9050919050565b6000613f0282613ee5565b9050919050565b613f1a613f15826126c8565b613ef7565b82525050565b6000613f2c8288612ac6565b602082019150613f3c8287612ac6565b602082019150613f4c8286612ac6565b602082019150613f5c8285612ac6565b602082019150613f6c8284613f09565b6001820191508190509695505050505050565b613f8881612846565b82525050565b6000819050919050565b6000819050919050565b6000613fbd613fb8613fb384613f8e565b613f98565b61260d565b9050919050565b613fcd81613fa2565b82525050565b6000608082019050613fe86000830187613f7f565b613ff56020830186613fc4565b6140026040830185613f7f565b61400f6060830184613f7f565b95945050505050565b7f4543445341207369676e6174757265206973206e6f742076616c69642e000000600082015250565b600061404e601d83612af8565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f6c6172676572207468616e206d696e696d756d206c617267657220636f6d706160208201527f7269736f6e2076616c75652e0000000000000000000000000000000000000000604082015250565b6000614106604c83612af8565b915061411182614084565b606082019050919050565b60006020820190508181036000830152614135816140f9565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f736d616c6c6572207468616e206d6178696d756d20736d616c6c657220636f6d60208201527f70617269736f6e2076616c75652e000000000000000000000000000000000000604082015250565b60006141be604e83612af8565b91506141c98261413c565b606082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f57696e2070726f626162696c697479206f7574206f662072616e67652e000000600082015250565b600061422a601d83612af8565b9150614235826141f4565b602082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b826124e7565b9150614276836124e7565b92508261428657614285612eef565b5b828204905092915050565b600060a0820190506142a66000830188612576565b6142b36020830187612658565b6142c06040830186612678565b6142cd6060830185612576565b6142da60808301846126d4565b9695505050505050565b600060c0820190506142f96000830189612576565b6143066020830188612658565b6143136040830187612678565b6143206060830186612576565b61432d6080830185612576565b61433a60a0830184612576565b97965050505050505056fea2646970667358221220209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a475764736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c80638eb12c20116100f7578063cab11d5d11610095578063e1fdb4b411610064578063e1fdb4b41461061a578063f2fde38b14610636578063fa968eea1461065f578063fbd668a91461068a576101e6565b8063cab11d5d14610570578063cf96ce031461059b578063d98e6ae6146105c4578063df88126f146105ef576101e6565b8063b539cd55116100d1578063b539cd55146104d7578063bd7fd78d14610502578063c10753291461052b578063c6d1d5aa14610554576101e6565b80638eb12c201461045c5780638fedadf114610485578063af3dc07f146104ae576101e6565b806370d8c5781161016457806374e048d51161013e57806374e048d5146103b657806377010f70146103df5780637cfbc7a5146104085780638da5cb5b14610431576101e6565b806370d8c57814610349578063715018a61461037457806372318cf91461038b576101e6565b80631f9d3a2b116101a05780631f9d3a2b1461028257806322af00fa146102ad578063386d5fe6146102f55780636c18859314610320576101e6565b80630c531f271461020157806312065fe01461022c578063177c55c814610257576101e6565b366101e65734600260008282546101dd9190612520565b92505081905550005b34600260008282546101f89190612520565b92505081905550005b34801561020d57600080fd5b506102166106b3565b6040516102239190612585565b60405180910390f35b34801561023857600080fd5b506102416106b9565b60405161024e9190612585565b60405180910390f35b34801561026357600080fd5b5061026c6106c1565b6040516102799190612585565b60405180910390f35b34801561028e57600080fd5b506102976106c7565b6040516102a49190612585565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf91906125d1565b6106cd565b6040516102ec9c9b9a999897969594939291906126e3565b60405180910390f35b34801561030157600080fd5b5061030a6107b6565b6040516103179190612585565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906125d1565b6107bc565b005b34801561035557600080fd5b5061035e6107dd565b60405161036b9190612585565b60405180910390f35b34801561038057600080fd5b506103896107e3565b005b34801561039757600080fd5b506103a06107f7565b6040516103ad9190612585565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906127ca565b6107fd565b005b3480156103eb57600080fd5b50610406600480360381019061040191906125d1565b6108e7565b005b34801561041457600080fd5b5061042f600480360381019061042a91906125d1565b6108f9565b005b34801561043d57600080fd5b50610446610958565b604051610453919061282b565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061287c565b610981565b005b34801561049157600080fd5b506104ac60048036038101906104a791906125d1565b610aca565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906125d1565b610adc565b005b3480156104e357600080fd5b506104ec610aee565b6040516104f99190612585565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906125d1565b610af4565b005b34801561053757600080fd5b50610552600480360381019061054d91906128fb565b610b06565b005b61056e60048036038101906105699190612967565b610c05565b005b34801561057c57600080fd5b50610585610fbd565b6040516105929190612585565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906125d1565b610fc3565b005b3480156105d057600080fd5b506105d9611026565b6040516105e69190612585565b60405180910390f35b3480156105fb57600080fd5b5061060461102c565b6040516106119190612585565b60405180910390f35b610634600480360381019061062f91906125d1565b611032565b005b34801561064257600080fd5b5061065d60048036038101906106589190612a35565b6112c7565b005b34801561066b57600080fd5b5061067461134b565b6040516106819190612585565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac91906125d1565b611351565b005b60025481565b600047905090565b600b5481565b600c5481565b600d60205280600052604060002060009150905080600001604051806040016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681525050908060020160009054906101000a900460ff16908060020160019054906101000a900464ffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460ff169080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff1690508c565b60055481565b6107c46113b0565b633b9aca00816107d49190612a62565b60068190555050565b60045481565b6107eb6113b0565b6107f5600061142e565b565b60035481565b6108056113b0565b6000826040516020016108189190612add565b6040516020818303038152906040528051906020012060001c90506000600d6000838152602001908152602001600020905060fa8364ffffffffff1661085e9190612520565b4311156108a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089790612b7b565b60405180910390fd5b6108aa60486114f2565b6000806108b8846044611939565b8092508193505050818564ffffffffff1640146108d457600080fd5b6108df838783611bcd565b505050505050565b6108ef6113b0565b80600b8190555050565b6109016113b0565b6a0422ca8b0a00a425000000811061094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612c0d565b60405180910390fd5b8060078190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109896113b0565b60008360405160200161099c9190612add565b6040516020818303038152906040528051906020012060001c90506000600d60008381526020019081526020016000209050600081600301549050600073ffffffffffffffffffffffffffffffffffffffff168260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290612c79565b60405180910390fd5b80431015610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590612ce5565b60405180910390fd5b838260070181905550610ac2828787611bcd565b505050505050565b610ad26113b0565b80600a8190555050565b610ae46113b0565b8060048190555050565b60085481565b610afc6113b0565b8060058190555050565b610b0e6113b0565b47811115610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890612d77565b60405180910390fd5b60095447610b5f9190612d97565b811115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612e3d565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be7573d6000803e3d6000fd5b508060036000828254610bfa9190612520565b925050819055505050565b610c0d611e8f565b6000600d60008681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612ecf565b60405180910390fd5b6000349050610ccc818a8a8a8a8a8a8a611edf565b60008060288a11610d3457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018d610d1f9190612a62565b16610d2a9190612f1e565b91508a9050610d87565b60008b118015610d445750898b11155b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612fc1565b60405180910390fd5b8a91505b6000610d95848c858b6121da565b905060085484610da59190612520565b811115610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde9061302d565b60405180910390fd5b4781600954610df69190612520565b1115610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906130bf565b60405180910390fd5b8060096000828254610e499190612520565b925050819055508385600001600001819055508a8560000160010160006101000a81548160ff021916908360ff160217905550828560020160006101000a81548160ff021916908360ff160217905550818560020160016101000a81548164ffffffffff021916908364ffffffffff160217905550438560030181905550338560040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008560040160146101000a81548160ff021916908315150217905550600085600501819055506000856006018190555060008560070181905550600085600801819055508885600901819055508785600a0160006101000a81548160ff021916908315150217905550610fa78560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858d86868e8e6122d0565b5050505050610fb4612333565b50505050505050565b60075481565b610fcb6113b0565b60018110158015610fdd575060648111155b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390613151565b60405180910390fd5b80600c8190555050565b600a5481565b60095481565b61103a611e8f565b6000600d60008381526020019081526020016000209050600081600001600001549050600082600a0160009054906101000a900460ff169050600082116110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad906131bd565b60405180910390fd5b600015158360040160149054906101000a900460ff1615151461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613229565b60405180910390fd5b61a8c083600301546111209190612520565b4311611161576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611158906132bb565b60405180910390fd5b600061119a838560000160010160009054906101000a900460ff1660ff168660020160009054906101000a900460ff1660ff16856121da565b905080600960008282546111ae9190612d97565b9250508190555060018460040160146101000a81548160ff0219169083151502179055508284600601819055508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611245573d6000803e3d6000fd5b508360040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95a7aa5c378b3f64e4945d7b72f659200d9fa121b2fabc0a521125f46267ab22846040516112b09190612585565b60405180910390a2505050506112c4612333565b50565b6112cf6113b0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061334d565b60405180910390fd5b6113488161142e565b50565b60065481565b6113596113b0565b6a295be96e6406697200000081106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d906133b9565b60405180910390fd5b8060088190555050565b6113b861233c565b73ffffffffffffffffffffffffffffffffffffffff166113d6610958565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613425565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813560001a905060f781101561153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906134b7565b60405180910390fd5b60f68161154c9190612d97565b826115579190612520565b91506000823560001a9050607f811161157e576001836115779190612520565b92506115ea565b60808110158015611590575060b78111155b6115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690613523565b60405180910390fd5b607f816115dc9190612d97565b836115e79190612520565b92505b6000833560001a905060b98114611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906135db565b60405180910390fd5b6003846116439190612520565b93506000843560001a905060f98114611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061366d565b60405180910390fd5b60038561169e9190612520565b94506000853560001a9050600181146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e3906136d9565b60405180910390fd5b6001866116f99190612520565b95506000863560001a9050607f8111611720576001876117199190612520565b965061178c565b60808110158015611732575060b78111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613745565b60405180910390fd5b607f8161177e9190612d97565b876117899190612520565b96505b6000873560001a905060b981146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906137d7565b60405180910390fd5b610103886117e69190612520565b97506000883560001a905060f88114611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613869565b60405180910390fd5b6002896118419190612520565b98506000893560001a905060f8811461188f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611886906138fb565b60405180910390fd5b60028a61189c9190612520565b995060008a3560001a9050609481146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613967565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff16811461192b57600080fd5b505050505050505050505050565b600080600060405190506000806000805b61ffff601e890335169250600083141561196357611a39565b61ffff601c8903351691508260208361197c9190612520565b11156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906139d3565b60405180910390fd5b6004886119ca9190612520565b975081880135905060008114611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90613a3f565b60405180910390fd5b82888637888286015282852098508293508288611a329190612520565b975061194a565b8860001b955060008486611a4d9190612520565b9050600061ffff601c8b0335169050600061ffff601a8c0335169050818782611a769190612520565b1115611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906139d3565b60405180910390fd5b60068b611ac49190612520565b9a50818b8437611ae08184611ad99190612520565b8989612344565b8183209b50818b611af19190612520565b9a5061ffff601e8c033516955061ffff601c8c033516945085602086611b179190612520565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f906139d3565b60405180910390fd5b60048b611b659190612520565b9a50848b0135935060008414611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790613a3f565b60405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008360000160000154905060008111611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906131bd565b60405180910390fd5b600015158460040160149054906101000a900460ff16151514611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613aab565b60405180910390fd5b60008460000160010160009054906101000a900460ff1660ff16905060008560020160009054906101000a900460ff1660ff16905060008660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600087600a0160009054906101000a900460ff16905060008787604051602001611cfd929190613aec565b6040516020818303038152906040528051906020012090506000858260001c611d269190612f1e565b90506000611d36888888876121da565b9050600060288811611d7d5760008c60020160019054906101000a900464ffffffffff1664ffffffffff16846002611d6e9190613c4b565b1614611d78578190505b611da2565b8415611d945786831115611d8f578190505b611da1565b86831015611da0578190505b5b5b8160096000828254611db49190612d97565b9250508190555060018c60040160146101000a81548160ff021916908315150217905550808c600601819055508360001c8c60080181905550828c6005018190555060008c600701541480611e1057508b600601548c60070154115b15611e1f57808c600701819055505b60008c600701541115611e78578573ffffffffffffffffffffffffffffffffffffffff166108fc8d600701549081150290604051600060405180830381858888f19350505050158015611e76573d6000803e3d6000fd5b505b611e818c6123c3565b505050505050505050505050565b60026001541415611ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecc90613ce2565b60405180910390fd5b6002600181905550565b600186118015611ef0575060648611155b611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2690613d4e565b60405180910390fd5b6006548810158015611f4357506007548811155b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613de0565b60405180910390fd5b600087118015611f9e575060286002611f9b9190613c4b565b87105b611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd490613e4c565b60405180910390fd5b84431115612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790613eb8565b60405180910390fd5b6000878787878760405160200161203b959493929190613f20565b604051602081830303815290604052805190602001209050600181601b8585604051600081526020016040526040516120779493929190613fd3565b6020604051602081039080840390855afa158015612099573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166120c1610958565b73ffffffffffffffffffffffffffffffffffffffff1614612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e90614064565b60405180910390fd5b60288711156121cf57831561217c57600a5488101580156121385750868811155b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e9061411c565b60405180910390fd5b6121ce565b60008811801561218e5750600b548811155b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906141d4565b60405180910390fd5b5b5b505050505050505050565b60008260001080156121ec5750838311155b61222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614240565b60405180910390fd5b60006064612238876124c3565b600c546122459190612520565b876122509190612a62565b61225a9190614260565b9050600084905060648614801561226e5750835b15612283578460646122809190612d97565b90505b808683896122919190612d97565b61229b9190612a62565b6122a59190614260565b92506000600854886122b79190612520565b9050808411156122c5578093505b505050949350505050565b8460ff168773ffffffffffffffffffffffffffffffffffffffff167fe49dc342a2664c9376180e6cd7e3e53ba5d52541c470911b4b8f8a2fcb1b2c618887878787604051612322959493929190614291565b60405180910390a350505050505050565b60018081905550565b600033905090565b5b60208110612383578151835260208361235e9190612520565b925060208261236d9190612520565b915060208161237c9190612d97565b9050612345565b600060018260206123949190612d97565b6101006123a19190613c4b565b6123ab9190612d97565b90508019835116818551168181178652505050505050565b60008160000160000154905060008260050154905060008360060154905060008460070154905060008560000160010160009054906101000a900460ff1660ff16905060008660020160009054906101000a900460ff1660ff16905060008760040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508260ff168173ffffffffffffffffffffffffffffffffffffffff167f6e66a5f78adb6dee2af6a518dc7a979c4ed4794fa1056b8bf6ac19280e81d19489858c60020160019054906101000a900464ffffffffff168b8b8b6040516124b1969594939291906142e4565b60405180910390a35050505050505050565b6000600554600454836124d69190614260565b6124e09190612a62565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061252b826124e7565b9150612536836124e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256b5761256a6124f1565b5b828201905092915050565b61257f816124e7565b82525050565b600060208201905061259a6000830184612576565b92915050565b600080fd5b6125ae816124e7565b81146125b957600080fd5b50565b6000813590506125cb816125a5565b92915050565b6000602082840312156125e7576125e66125a0565b5b60006125f5848285016125bc565b91505092915050565b612607816124e7565b82525050565b600060ff82169050919050565b6126238161260d565b82525050565b60408201600082015161263f60008501826125fe565b506020820151612652602085018261261a565b50505050565b6126618161260d565b82525050565b600064ffffffffff82169050919050565b61268181612667565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126b282612687565b9050919050565b6126c2816126a7565b82525050565b60008115159050919050565b6126dd816126c8565b82525050565b60006101a0820190506126f9600083018f612629565b612706604083018e612658565b612713606083018d612678565b612720608083018c612576565b61272d60a083018b6126b9565b61273a60c083018a6126d4565b61274760e0830189612576565b612755610100830188612576565b612763610120830187612576565b612771610140830186612576565b61277f610160830185612576565b61278d6101808301846126d4565b9d9c50505050505050505050505050565b6127a781612667565b81146127b257600080fd5b50565b6000813590506127c48161279e565b92915050565b600080604083850312156127e1576127e06125a0565b5b60006127ef858286016125bc565b9250506020612800858286016127b5565b9150509250929050565b600061281582612687565b9050919050565b6128258161280a565b82525050565b6000602082019050612840600083018461281c565b92915050565b6000819050919050565b61285981612846565b811461286457600080fd5b50565b60008135905061287681612850565b92915050565b600080600060608486031215612895576128946125a0565b5b60006128a3868287016125bc565b93505060206128b486828701612867565b92505060406128c5868287016125bc565b9150509250925092565b6128d8816126a7565b81146128e357600080fd5b50565b6000813590506128f5816128cf565b92915050565b60008060408385031215612912576129116125a0565b5b6000612920858286016128e6565b9250506020612931858286016125bc565b9150509250929050565b612944816126c8565b811461294f57600080fd5b50565b6000813590506129618161293b565b92915050565b600080600080600080600060e0888a031215612986576129856125a0565b5b60006129948a828b016125bc565b97505060206129a58a828b016125bc565b96505060406129b68a828b016125bc565b95505060606129c78a828b016125bc565b94505060806129d88a828b01612952565b93505060a06129e98a828b01612867565b92505060c06129fa8a828b01612867565b91505092959891949750929550565b612a128161280a565b8114612a1d57600080fd5b50565b600081359050612a2f81612a09565b92915050565b600060208284031215612a4b57612a4a6125a0565b5b6000612a5984828501612a20565b91505092915050565b6000612a6d826124e7565b9150612a78836124e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ab157612ab06124f1565b5b828202905092915050565b6000819050919050565b612ad7612ad2826124e7565b612abc565b82525050565b6000612ae98284612ac6565b60208201915081905092915050565b600082825260208201905092915050565b7f426c6f636b686173682063616e2774206265207175657269656420627920455660008201527f4d2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b65602283612af8565b9150612b7082612b09565b604082019050919050565b60006020820190508181036000830152612b9481612b58565b9050919050565b7f6d6178426574416d6f756e74206d75737420626520612073616e65206e756d6260008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000612bf7602283612af8565b9150612c0282612b9b565b604082019050919050565b60006020820190508181036000830152612c2681612bea565b9050919050565b7f4265742073686f756c6420626520696e20612027626574272073746174652e00600082015250565b6000612c63601f83612af8565b9150612c6e82612c2d565b602082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f736574746c65426574206265666f726520706c61636542657400000000000000600082015250565b6000612ccf601983612af8565b9150612cda82612c99565b602082019050919050565b60006020820190508181036000830152612cfe81612cc2565b9050919050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e63652e0000000000000000000000000000000000000000000000000000602082015250565b6000612d61602683612af8565b9150612d6c82612d05565b604082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b6000612da2826124e7565b9150612dad836124e7565b925082821015612dc057612dbf6124f1565b5b828203905092915050565b7f5769746864726177616c20616d6f756e74206c6172676572207468616e20626160008201527f6c616e6365206d696e7573206c6f636b6564496e426574730000000000000000602082015250565b6000612e27603883612af8565b9150612e3282612dcb565b604082019050919050565b60006020820190508181036000830152612e5681612e1a565b9050919050565b7f4265742073686f756c6420626520696e20612027636c65616e2720737461746560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eb9602183612af8565b9150612ec482612e5d565b604082019050919050565b60006020820190508181036000830152612ee881612eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f29826124e7565b9150612f34836124e7565b925082612f4457612f43612eef565b5b828206905092915050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560008201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000602082015250565b6000612fab602e83612af8565b9150612fb682612f4f565b604082019050919050565b60006020820190508181036000830152612fda81612f9e565b9050919050565b7f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000600082015250565b6000613017601a83612af8565b915061302282612fe1565b602082019050919050565b600060208201905081810360008301526130468161300a565b9050919050565b7f556e61626c6520746f20616363657074206265742064756520746f20696e737560008201527f6666696369656e742066756e6473000000000000000000000000000000000000602082015250565b60006130a9602e83612af8565b91506130b48261304d565b604082019050919050565b600060208201905081810360008301526130d88161309c565b9050919050565b7f686f7573654564676550657263656e74206d75737420626520612073616e652060008201527f6e756d6265720000000000000000000000000000000000000000000000000000602082015250565b600061313b602683612af8565b9150613146826130df565b604082019050919050565b6000602082019050818103600083015261316a8161312e565b9050919050565b7f42657420646f6573206e6f742065786973742e00000000000000000000000000600082015250565b60006131a7601383612af8565b91506131b282613171565b602082019050919050565b600060208201905081810360008301526131d68161319a565b9050919050565b7f42657420697320736574746c656420616c72656164792e000000000000000000600082015250565b6000613213601783612af8565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b9050919050565b7f5761697420616674657220706c6163696e6720626574206265666f726520726560008201527f7175657374696e6720726566756e642e00000000000000000000000000000000602082015250565b60006132a5603083612af8565b91506132b082613249565b604082019050919050565b600060208201905081810360008301526132d481613298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613337602683612af8565b9150613342826132db565b604082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f6d617850726f666974206d75737420626520612073616e65206e756d62657200600082015250565b60006133a3601f83612af8565b91506133ae8261336d565b602082019050919050565b600060208201905081810360008301526133d281613396565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061340f602083612af8565b915061341a826133d9565b602082019050919050565b6000602082019050818103600083015261343e81613402565b9050919050565b7f52656365697074206c656166206c6f6e676572207468616e203535206279746560008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b60006134a1602283612af8565b91506134ac82613445565b604082019050919050565b600060208201905081810360008301526134d081613494565b9050919050565b7f5061746820697320616e20524c5020737472696e672e00000000000000000000600082015250565b600061350d601683612af8565b9150613518826134d7565b602082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f5265636569707420737472696e6720697320616c77617973206174206c65617360008201527f7420323536206279746573206c6f6e672c20627574206c657373207468616e2060208201527f36346b2e00000000000000000000000000000000000000000000000000000000604082015250565b60006135c5604483612af8565b91506135d082613543565b606082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f5265636569707420697320616c77617973206174206c6561737420323536206260008201527f79746573206c6f6e672c20627574206c657373207468616e2036346b2e000000602082015250565b6000613657603d83612af8565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5374617475732073686f756c6420626520737563636573732e00000000000000600082015250565b60006136c3601983612af8565b91506136ce8261368d565b602082019050919050565b600060208201905081810360008301526136f2816136b6565b9050919050565b7f43756d756c61746976652067617320697320616e20524c5020737472696e672e600082015250565b600061372f602083612af8565b915061373a826136f9565b602082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b7f426c6f6f6d2066696c74657220697320616c776179732032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006137c1602683612af8565b91506137cc82613765565b604082019050919050565b600060208201905081810360008301526137f0816137b4565b9050919050565b7f4c6f6773206c697374206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b6000613853602683612af8565b915061385e826137f7565b604082019050919050565b6000602082019050818103600083015261388281613846565b9050919050565b7f4c6f6720656e747279206973206c657373207468616e2032353620627974657360008201527f206c6f6e672e0000000000000000000000000000000000000000000000000000602082015250565b60006138e5602683612af8565b91506138f082613889565b604082019050919050565b60006020820190508181036000830152613914816138d8565b9050919050565b7f41646472657373206973203230206279746573206c6f6e672e00000000000000600082015250565b6000613951601983612af8565b915061395c8261391b565b602082019050919050565b6000602082019050818103600083015261398081613944565b9050919050565b7f536869667420626f756e647320636865636b2e00000000000000000000000000600082015250565b60006139bd601383612af8565b91506139c882613987565b602082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000600082015250565b6000613a29601483612af8565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b7f42657420697320736574746c656420616c726561647900000000000000000000600082015250565b6000613a95601683612af8565b9150613aa082613a5f565b602082019050919050565b60006020820190508181036000830152613ac481613a88565b9050919050565b6000819050919050565b613ae6613ae182612846565b613acb565b82525050565b6000613af88285612ac6565b602082019150613b088284613ad5565b6020820191508190509392505050565b60008160011c9050919050565b6000808291508390505b6001851115613b6f57808604811115613b4b57613b4a6124f1565b5b6001851615613b5a5780820291505b8081029050613b6885613b18565b9450613b2f565b94509492505050565b600082613b885760019050613c44565b81613b965760009050613c44565b8160018114613bac5760028114613bb657613be5565b6001915050613c44565b60ff841115613bc857613bc76124f1565b5b8360020a915084821115613bdf57613bde6124f1565b5b50613c44565b5060208310610133831016604e8410600b8410161715613c1a5782820a905083811115613c1557613c146124f1565b5b613c44565b613c278484846001613b25565b92509050818404811115613c3e57613c3d6124f1565b5b81810290505b9392505050565b6000613c56826124e7565b9150613c61836124e7565b9250613c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b78565b905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ccc601f83612af8565b9150613cd782613c96565b602082019050919050565b60006020820190508181036000830152613cfb81613cbf565b9050919050565b7f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000600082015250565b6000613d38601e83612af8565b9150613d4382613d02565b602082019050919050565b60006020820190508181036000830152613d6781613d2b565b9050919050565b7f42657420616d6f756e742073686f756c642062652077697468696e2072616e6760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dca602283612af8565b9150613dd582613d6e565b604082019050919050565b60006020820190508181036000830152613df981613dbd565b9050919050565b7f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000600082015250565b6000613e36601c83612af8565b9150613e4182613e00565b602082019050919050565b60006020820190508181036000830152613e6581613e29565b9050919050565b7f436f6d6d69742068617320657870697265642e00000000000000000000000000600082015250565b6000613ea2601383612af8565b9150613ead82613e6c565b602082019050919050565b60006020820190508181036000830152613ed181613e95565b9050919050565b60008160f81b9050919050565b6000613ef082613ed8565b9050919050565b6000613f0282613ee5565b9050919050565b613f1a613f15826126c8565b613ef7565b82525050565b6000613f2c8288612ac6565b602082019150613f3c8287612ac6565b602082019150613f4c8286612ac6565b602082019150613f5c8285612ac6565b602082019150613f6c8284613f09565b6001820191508190509695505050505050565b613f8881612846565b82525050565b6000819050919050565b6000819050919050565b6000613fbd613fb8613fb384613f8e565b613f98565b61260d565b9050919050565b613fcd81613fa2565b82525050565b6000608082019050613fe86000830187613f7f565b613ff56020830186613fc4565b6140026040830185613f7f565b61400f6060830184613f7f565b95945050505050565b7f4543445341207369676e6174757265206973206e6f742076616c69642e000000600082015250565b600061404e601d83612af8565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f6c6172676572207468616e206d696e696d756d206c617267657220636f6d706160208201527f7269736f6e2076616c75652e0000000000000000000000000000000000000000604082015250565b6000614106604c83612af8565b915061411182614084565b606082019050919050565b60006020820190508181036000830152614135816140f9565b9050919050565b7f48696768206d6f64756c6f2072616e67652c206265744d61736b206d7573742060008201527f736d616c6c6572207468616e206d6178696d756d20736d616c6c657220636f6d60208201527f70617269736f6e2076616c75652e000000000000000000000000000000000000604082015250565b60006141be604e83612af8565b91506141c98261413c565b606082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b7f57696e2070726f626162696c697479206f7574206f662072616e67652e000000600082015250565b600061422a601d83612af8565b9150614235826141f4565b602082019050919050565b600060208201905081810360008301526142598161421d565b9050919050565b600061426b826124e7565b9150614276836124e7565b92508261428657614285612eef565b5b828204905092915050565b600060a0820190506142a66000830188612576565b6142b36020830187612658565b6142c06040830186612678565b6142cd6060830185612576565b6142da60808301846126d4565b9695505050505050565b600060c0820190506142f96000830189612576565b6143066020830188612658565b6143136040830187612678565b6143206060830186612576565b61432d6080830185612576565b61433a60a0830184612576565b97965050505050505056fea2646970667358221220209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a475764736f6c634300080c0033

Deployed Bytecode Sourcemap

6614:27408:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11757:9;11736:17;;:30;;;;;;;:::i;:::-;;;;;;;;6614:27408;;11675:9;11654:17;;:30;;;;;;;:::i;:::-;;;;;;;;6614:27408;8728:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11807:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9806:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11016:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11128:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;9228:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12629:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9169:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5722:103;;;;;;;;;;;;;:::i;:::-;;8764:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19468:1001;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12107:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12785:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5074:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18316:732;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11958:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13600:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9470:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13384:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13874:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14634:2371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9360:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12251:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9722:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9644:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24197:1017;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5980:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9316:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13071:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8728:29;;;;:::o;11807:98::-;11852:4;11876:21;11869:28;;11807:98;:::o;9806:30::-;;;;:::o;11016:32::-;;;;:::o;11128:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9228:41::-;;;;:::o;12629:120::-;4960:13;:11;:13::i;:::-;12735:6:::1;12719:13;:22;;;;:::i;:::-;12704:12;:37;;;;12629:120:::0;:::o;9169:52::-;;;;:::o;5722:103::-;4960:13;:11;:13::i;:::-;5787:30:::1;5814:1;5787:18;:30::i;:::-;5722:103::o:0;8764:32::-;;;;:::o;19468:1001::-;4960:13;:11;:13::i;:::-;19659:11:::1;19705:6;19688:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;19678:35;;;;;;19673:41;;19659:55;;19727:15;19745:4;:12;19750:6;19745:12;;;;;;;;;;;19727:30;;8047:3;19862:20;:44;;;;;;:::i;:::-;19846:12;:60;;19837:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;19995:38;20017:15;19995:21;:38::i;:::-;20143:21;20175:17:::0;20232:38:::1;20250:6;20258:11;20232:17;:38::i;:::-;20203:67;;;;;;;;20325:13;20300:20;20290:31;;;:48;20281:58;;;::::0;::::1;;20422:39;20438:3;20443:6;20451:9;20422:15;:39::i;:::-;19564:905;;;;19468:1001:::0;;:::o;12107:97::-;4960:13;:11;:13::i;:::-;12191:5:::1;12175:13;:21;;;;12107:97:::0;:::o;12785:199::-;4960:13;:11;:13::i;:::-;12885::::1;12869;:29;12860:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;12963:13;12948:12;:28;;;;12785:199:::0;:::o;5074:87::-;5120:7;5147:6;;;;;;;;;;;5140:13;;5074:87;:::o;18316:732::-;4960:13;:11;:13::i;:::-;18424:11:::1;18470:6;18453:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;18443:35;;;;;;18438:41;;18424:55;;18492:15;18510:4;:12;18515:6;18510:12;;;;;;;;;;;18492:30;;18533:21;18557:3;:20;;;18533:44;;18622:1;18599:25;;:3;:11;;;;;;;;;;;;:25;;;;18590:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;18785:16;18769:12;:32;;18760:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;18898:14;18877:3;:18;;:35;;;;18995:45;19011:3;19016:6;19024:15;18995;:45::i;:::-;18413:635;;;18316:732:::0;;;:::o;11958:95::-;4960:13;:11;:13::i;:::-;12040:5:::1;12025:12;:20;;;;11958:95:::0;:::o;13600:171::-;4960:13;:11;:13::i;:::-;13735:28:::1;13705:27;:58;;;;13600:171:::0;:::o;9470:36::-;;;;:::o;13384:163::-;4960:13;:11;:13::i;:::-;13513:26:::1;13485:25;:54;;;;13384:163:::0;:::o;13874:433::-;4960:13;:11;:13::i;:::-;14004:21:::1;13986:14;:39;;13977:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;14130:12;;14106:21;:36;;;;:::i;:::-;14088:14;:54;;14079:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;14214:11;:20;;:36;14235:14;14214:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;14285:14;14261:20;;:38;;;;;;;:::i;:::-;;;;;;;;13874:433:::0;;:::o;14634:2371::-;2345:21;:19;:21::i;:::-;14794:15:::1;14812:4;:12;14817:6;14812:12;;;;;;;;;;;14794:30;;14867:1;14844:25;;:3;:11;;;;;;;;;;;;:25;;;14835:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14920:11;14934:9;14920:23;;14956:83;14974:6;14982:7;14991:6;14999:15;15016:6;15024:8;15034:1;15037;14956:17;:83::i;:::-;15052:13;15076:9:::0;7544:2:::1;15102:6;:25;15098:718;;8563:4;8460:66;8359;15457:7;:21;;;;:::i;:::-;15456:37;15455:55;;;;:::i;:::-;15444:66;;15532:7;15525:14;;15098:718;;;15698:1;15688:7;:11;:32;;;;;15714:6;15703:7;:17;;15688:32;15679:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;15797:7;15786:18;;15098:718;15856:22;15881:52;15898:6;15906;15914:8;15924;15881:16;:52::i;:::-;15856:77;;16071:9;;16062:6;:18;;;;:::i;:::-;16041:17;:39;;16032:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;16241:21;16220:17;16205:12;;:32;;;;:::i;:::-;:57;;16196:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;16373:17;16357:12;;:33;;;;;;;:::i;:::-;;;;;;;;16441:6;16425:3;:8;;:15;;:22;;;;16480:6;16458:3;:8;;:15;;;:29;;;;;;;;;;;;;;;;;;16517:8;16498:3;:12;;;:28;;;;;;;;;;;;;;;;;;16553:4;16537:3;:8;;;:21;;;;;;;;;;;;;;;;;;16590:12;16569:3;:20;;:33;;;;16633:10;16613:3;:11;;;:31;;;;;;;;;;;;;;;;;;16669:5;16655:3;:13;;;:19;;;;;;;;;;;;;;;;;;16697:1;16685:3;:11;;:13;;;;16723:1;16709:3;:13;;:15;;;;16754:1;16735:3;:18;;:20;;;;16783:1;16766:3;:16;;:18;;;;16806:6;16795:3;:10;;:17;;;;16836:8;16823:3;:12;;;:21;;;;;;;;;;;;;;;;;;16894:103;16913:3;:11;;;;;;;;;;;;16926:6;16940;16955:8;16973:4;16980:6;16988:8;16894:18;:103::i;:::-;14781:2224;;;;;2389:20:::0;:18;:20::i;:::-;14634:2371;;;;;;;:::o;9360:38::-;;;;:::o;12251:241::-;4960:13;:11;:13::i;:::-;12365:1:::1;12344:17;:22;;:50;;;;;12391:3;12370:17;:24;;12344:50;12334:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;12467:17;12448:16;:36;;;;12251:241:::0;:::o;9722:29::-;;;;:::o;9644:24::-;;;;:::o;24197:1017::-;2345:21;:19;:21::i;:::-;24280:15:::1;24298:4;:12;24303:6;24298:12;;;;;;;;;;;24280:30;;24321:11;24335:3;:8;;:15;;;24321:29;;24361:13;24377:3;:12;;;;;;;;;;;;24361:28;;24449:1;24440:6;:10;24431:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;24536:5;24519:22;;:3;:13;;;;;;;;;;;;:22;;;24510:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;24659:5;24636:3;:20;;;:28;;;;:::i;:::-;24621:12;:43;24612:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;24730:22;24755:65;24772:6;24780:3;:8;;:15;;;;;;;;;;;;24755:65;;24797:3;:12;;;;;;;;;;;;24755:65;;24811:8;24755:16;:65::i;:::-;24730:90;;24932:17;24916:12;;:33;;;;;;;:::i;:::-;;;;;;;;25009:4;24993:3;:13;;;:20;;;;;;;;;;;;;;;;;;25040:6;25024:3;:13;;:22;;;;25088:3;:11;;;;;;;;;;;;:20;;:28;25109:6;25088:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;25186:3;:11;;;;;;;;;;;;25174:32;;;25199:6;25174:32;;;;;;:::i;:::-;;;;;;;;24259:955;;;;2389:20:::0;:18;:20::i;:::-;24197:1017;:::o;5980:201::-;4960:13;:11;:13::i;:::-;6089:1:::1;6069:22;;:8;:22;;;;6061:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6145:28;6164:8;6145:18;:28::i;:::-;5980:201:::0;:::o;9316:37::-;;;;:::o;13071:182::-;4960:13;:11;:13::i;:::-;13162:14:::1;13149:10;:27;13140:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13235:10;13223:9;:22;;;;13071:182:::0;:::o;5239:132::-;5314:12;:10;:12::i;:::-;5303:23;;:7;:5;:7::i;:::-;:23;;;5295:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5239:132::o;6341:191::-;6415:16;6434:6;;;;;;;;;;;6415:25;;6460:8;6451:6;;:17;;;;;;;;;;;;;;;;;;6515:8;6484:40;;6505:8;6484:40;;;;;;;;;;;;6404:128;6341:191;:::o;29522:2640::-;29590:19;29661:6;29648:20;29645:1;29640:29;29622:47;;29710:4;29692:14;:22;;29683:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:4;29774:14;:21;;;;:::i;:::-;29764:31;;;;;:::i;:::-;;;29808:19;29879:6;29866:20;29863:1;29858:29;29840:47;;29923:4;29905:14;:22;29901:231;;29954:1;29944:11;;;;;:::i;:::-;;;29901:231;;;30017:4;29999:14;:22;;:48;;;;;30043:4;30025:14;:22;;29999:48;29990:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;30116:4;30099:14;:21;;;;:::i;:::-;30089:31;;;;;:::i;:::-;;;29901:231;30144:28;30233:6;30220:20;30217:1;30212:29;30185:56;;30289:4;30262:23;:31;30253:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;30387:1;30377:11;;;;;:::i;:::-;;;30401:22;30478:6;30465:20;30462:1;30457:29;30436:50;;30528:4;30507:17;:25;30498:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30619:1;30609:11;;;;;:::i;:::-;;;30633:15;30696:6;30683:20;30680:1;30675:29;30661:43;;30739:3;30725:10;:17;30716:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;30793:1;30783:11;;;;;:::i;:::-;;;30807:21;30882:6;30869:20;30866:1;30861:29;30841:49;;30926:4;30906:16;:24;30902:249;;30957:1;30947:11;;;;;:::i;:::-;;;30902:249;;;31022:4;31002:16;:24;;:52;;;;;31050:4;31030:16;:24;;31002:52;30993:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;31135:4;31116:16;:23;;;;:::i;:::-;31106:33;;;;;:::i;:::-;;;30902:249;31163:20;31236:6;31223:20;31220:1;31215:29;31196:48;;31284:4;31265:15;:23;31256:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31352:7;31342:17;;;;;:::i;:::-;;;31372:23;31451:6;31438:20;31435:1;31430:29;31408:51;;31502:4;31480:18;:26;31471:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31570:1;31560:11;;;;;:::i;:::-;;;31584:23;31663:6;31650:20;31647:1;31642:29;31620:51;;31714:4;31692:18;:26;31683:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31782:1;31772:11;;;;;:::i;:::-;;;31796:22;31873:6;31860:20;31857:1;31852:29;31831:50;;31923:4;31902:17;:25;31893:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31970:15;32047:42;32041:2;32033:6;32029:15;32016:29;32012:78;31998:92;;32146:4;32125:28;;32111:10;:42;32102:52;;;;;;29579:2583;;;;;;;;;;;29522:2640;:::o;26248:3054::-;26325:17;26344;26464:16;26515:4;26509:11;26494:26;;26534:22;26558:15;26575:10;26587:13;26916:857;27021:6;27015:2;27007:6;27003:15;26990:29;26986:42;26972:56;;27062:1;27048:10;:15;27044:129;;;27152:5;;27044:129;27244:6;27238:2;27230:6;27226:15;27213:29;27209:42;27200:51;;27290:10;27284:2;27276:5;:10;;;;:::i;:::-;:24;;27267:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27351:1;27341:11;;;;;:::i;:::-;;;27415:5;27407:6;27403:18;27390:32;27378:44;;27459:1;27447:8;:13;27438:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;27564:10;27556:6;27543:11;27530:45;27625:8;27617:5;27604:11;27600:23;27593:41;27687:10;27674:11;27664:34;27652:46;;27737:10;27716:31;;26934:10;26924:20;;;;;:::i;:::-;;;26916:857;;;27857:8;27849:17;;27837:29;;27938:16;27971:17;27957:11;:31;;;;:::i;:::-;27938:50;;27999:17;28080:6;28074:2;28066:6;28062:15;28049:29;28045:42;28029:58;;28099:16;28179:6;28173:2;28165:6;28161:15;28148:29;28144:42;28129:57;;28242:12;28221:17;28207:11;:31;;;;:::i;:::-;:47;;28198:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28301:1;28291:11;;;;;:::i;:::-;;;28358:12;28350:6;28337:11;28324:47;28383:65;28404:11;28390;:25;;;;:::i;:::-;28417:11;28430:17;28383:6;:65::i;:::-;28507:12;28494:11;28484:36;28472:48;;28544:12;28534:22;;;;;:::i;:::-;;;28719:6;28713:2;28705:6;28701:15;28688:29;28684:42;28670:56;;28784:6;28778:2;28770:6;28766:15;28753:29;28749:42;28740:51;;28835:10;28829:2;28821:5;:10;;;;:::i;:::-;:24;;28812:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28892:1;28882:11;;;;;:::i;:::-;;;28952:5;28944:6;28940:18;28927:32;28915:44;;28992:1;28980:8;:13;28971:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;29089:10;29081:6;29068:11;29055:45;29146:8;29138:5;29125:11;29121:23;29114:41;29273:10;29260:11;29250:34;29237:47;;29040:255;;;;;;;;26248:3054;;;;;:::o;20551:2771::-;20720:11;20734:3;:8;;:15;;;20720:29;;20817:1;20808:6;:10;20799:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20903:5;20886:22;;:3;:13;;;;;;;;;;;;:22;;;20878:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21054:11;21068:3;:8;;:15;;;;;;;;;;;;21054:29;;;;21094:13;21110:3;:12;;;;;;;;;;;;21094:28;;;;21133:23;21159:3;:11;;;;;;;;;;;;21133:37;;21181:13;21197:3;:12;;;;;;;;;;;;21181:28;;21583:15;21628:6;21636:16;21611:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21601:53;;;;;;21583:71;;21744:12;21775:6;21764:7;21759:13;;:22;;;;:::i;:::-;21744:37;;21842:22;21867:52;21884:6;21892;21900:8;21910;21867:16;:52::i;:::-;21842:77;;21973:14;7544:2;22044:6;:25;22040:649;;22197:1;22185:3;:8;;;;;;;;;;;;22168:25;;22174:7;22169:1;:12;;;;:::i;:::-;22168:25;:30;22164:100;;22231:17;22219:29;;22164:100;22040:649;;;22377:8;22373:291;;;22419:8;22409:7;:18;22405:96;;;22464:17;22452:29;;22405:96;22373:291;;;22567:8;22557:7;:18;22553:96;;;22612:17;22600:29;;22553:96;22373:291;22040:649;22800:17;22784:12;;:33;;;;;;;:::i;:::-;;;;;;;;22877:4;22861:3;:13;;;:20;;;;;;;;;;;;;;;;;;22908:9;22892:3;:13;;:25;;;;22952:7;22947:13;;22928:3;:16;;:32;;;;22985:7;22971:3;:11;;:21;;;;23031:1;23009:3;:18;;;:23;:61;;;;23057:3;:13;;;23036:3;:18;;;:34;23009:61;23005:133;;;23117:9;23096:3;:18;;:30;;;;23005:133;23215:1;23194:3;:18;;;:22;23190:91;;;23233:7;:16;;:36;23250:3;:18;;;23233:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23190:91;23293:21;23310:3;23293:16;:21::i;:::-;20640:2682;;;;;;;;;20551:2771;;;:::o;2425:293::-;1827:1;2559:7;;:19;;2551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1827:1;2692:7;:18;;;;2425:293::o;32720:1299::-;32934:1;32925:6;:10;:34;;;;;6893:3;32939:6;:20;;32925:34;32916:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33024:12;;33014:6;:22;;:48;;;;;33050:12;;33040:6;:22;;33014:48;33005:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;33131:1;33121:7;:11;:37;;;;;7544:2;8220:1;:20;;;;:::i;:::-;33136:7;:22;33121:37;33112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33325:15;33309:12;:31;;33300:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33375:21;33426:7;33435:6;33443:15;33460:6;33468:8;33409:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33399:79;;;;;;33375:103;;33509:34;33519:13;33534:2;33538:1;33541;33509:34;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:45;;:7;:5;:7::i;:::-;:45;;;33489:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;7544:2;33594:6;:24;33590:422;;;33639:8;33635:366;;;33687:12;;33676:7;:23;;:44;;;;;33714:6;33703:7;:17;;33676:44;33667:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;33635:366;;;33873:1;33863:7;:11;:39;;;;;33889:13;;33878:7;:24;;33863:39;33854:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;33635:366;33590:422;32872:1147;32720:1299;;;;;;;;:::o;17081:660::-;17185:14;17225:8;17221:1;:12;:34;;;;;17249:6;17237:8;:18;;17221:34;17212:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;17300:14;17370:3;17346:20;17359:6;17346:12;:20::i;:::-;17327:16;;:39;;;;:::i;:::-;17317:6;:50;;;;:::i;:::-;:56;;;;:::i;:::-;17300:73;;17384:17;17404:8;17384:28;;6893:3;17427:6;:20;:32;;;;;17451:8;17427:32;17423:101;;;17504:8;6893:3;17491:21;;;;:::i;:::-;17476:36;;17423:101;17578:12;17569:6;17556:9;17547:6;:18;;;;:::i;:::-;17546:29;;;;:::i;:::-;:44;;;;:::i;:::-;17534:56;;17603:17;17632:9;;17623:6;:18;;;;:::i;:::-;17603:38;;17669:12;17657:9;:24;17654:80;;;17710:12;17698:24;;17654:80;17201:540;;;17081:660;;;;;;:::o;14315:293::-;14543:6;14510:90;;14520:7;14510:90;;;14529:6;14558:8;14576:4;14583:6;14591:8;14510:90;;;;;;;;;;:::i;:::-;;;;;;;;14315:293;;;;;;;:::o;2726:213::-;1783:1;2909:7;:22;;;;2726:213::o;3625:98::-;3678:7;3705:10;3698:17;;3625:98;:::o;32191:497::-;32293:127;32306:2;32299:3;:9;32293:127;;32366:3;32360:10;32354:4;32347:24;32395:2;32387:10;;;;;:::i;:::-;;;32406:2;32399:9;;;;;:::i;:::-;;;32317:2;32310:9;;;;;:::i;:::-;;;32293:127;;;32460:9;32492:1;32485:3;32480:2;:8;;;;:::i;:::-;32472:3;:17;;;;:::i;:::-;:21;;;;:::i;:::-;32460:33;;32563:4;32559:9;32553:3;32547:10;32543:26;32616:4;32609;32603:11;32599:22;32661:7;32651:8;32648:21;32642:4;32635:35;32513:168;;;32191:497;;;:::o;23330:598::-;23397:11;23411:3;:8;;:15;;;23397:29;;23437:12;23452:3;:11;;;23437:26;;23474:14;23491:3;:13;;;23474:30;;23515:19;23537:3;:18;;;23515:40;;23635:11;23649:3;:8;;:15;;;;;;;;;;;;23635:29;;;;23675:13;23691:3;:12;;;;;;;;;;;;23675:28;;;;23714:23;23740:3;:11;;;;;;;;;;;;23714:37;;23849:6;23815:105;;23826:7;23815:105;;;23835:6;23864:8;23875:3;:8;;;;;;;;;;;;23885:7;23894:9;23905:14;23815:105;;;;;;;;;;;:::i;:::-;;;;;;;;23386:542;;;;;;;23330:598;:::o;17773:168::-;17830:14;17908:25;;17878:27;;17869:6;:36;;;;:::i;:::-;:64;;;;:::i;:::-;17857:76;;17773:168;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:180::-;138:77;135:1;128:88;235:4;232:1;225:15;259:4;256:1;249:15;276:305;316:3;335:20;353:1;335:20;:::i;:::-;330:25;;369:20;387:1;369:20;:::i;:::-;364:25;;523:1;455:66;451:74;448:1;445:81;442:107;;;529:18;;:::i;:::-;442:107;573:1;570;566:9;559:16;;276:305;;;;:::o;587:118::-;674:24;692:5;674:24;:::i;:::-;669:3;662:37;587:118;;:::o;711:222::-;804:4;842:2;831:9;827:18;819:26;;855:71;923:1;912:9;908:17;899:6;855:71;:::i;:::-;711:222;;;;:::o;1020:117::-;1129:1;1126;1119:12;1266:122;1339:24;1357:5;1339:24;:::i;:::-;1332:5;1329:35;1319:63;;1378:1;1375;1368:12;1319:63;1266:122;:::o;1394:139::-;1440:5;1478:6;1465:20;1456:29;;1494:33;1521:5;1494:33;:::i;:::-;1394:139;;;;:::o;1539:329::-;1598:6;1647:2;1635:9;1626:7;1622:23;1618:32;1615:119;;;1653:79;;:::i;:::-;1615:119;1773:1;1798:53;1843:7;1834:6;1823:9;1819:22;1798:53;:::i;:::-;1788:63;;1744:117;1539:329;;;;:::o;1874:108::-;1951:24;1969:5;1951:24;:::i;:::-;1946:3;1939:37;1874:108;;:::o;1988:86::-;2023:7;2063:4;2056:5;2052:16;2041:27;;1988:86;;;:::o;2080:102::-;2153:22;2169:5;2153:22;:::i;:::-;2148:3;2141:35;2080:102;;:::o;2244:505::-;2389:4;2384:3;2380:14;2478:4;2471:5;2467:16;2461:23;2497:63;2554:4;2549:3;2545:14;2531:12;2497:63;:::i;:::-;2404:166;2654:4;2647:5;2643:16;2637:23;2673:59;2726:4;2721:3;2717:14;2703:12;2673:59;:::i;:::-;2580:162;2358:391;2244:505;;:::o;2755:112::-;2838:22;2854:5;2838:22;:::i;:::-;2833:3;2826:35;2755:112;;:::o;2873:95::-;2909:7;2949:12;2942:5;2938:24;2927:35;;2873:95;;;:::o;2974:115::-;3059:23;3076:5;3059:23;:::i;:::-;3054:3;3047:36;2974:115;;:::o;3095:126::-;3132:7;3172:42;3165:5;3161:54;3150:65;;3095:126;;;:::o;3227:104::-;3272:7;3301:24;3319:5;3301:24;:::i;:::-;3290:35;;3227:104;;;:::o;3337:142::-;3440:32;3466:5;3440:32;:::i;:::-;3435:3;3428:45;3337:142;;:::o;3485:90::-;3519:7;3562:5;3555:13;3548:21;3537:32;;3485:90;;;:::o;3581:109::-;3662:21;3677:5;3662:21;:::i;:::-;3657:3;3650:34;3581:109;;:::o;3696:1538::-;4145:4;4183:3;4172:9;4168:19;4160:27;;4197:119;4313:1;4302:9;4298:17;4289:6;4197:119;:::i;:::-;4326:68;4390:2;4379:9;4375:18;4366:6;4326:68;:::i;:::-;4404:70;4470:2;4459:9;4455:18;4446:6;4404:70;:::i;:::-;4484:73;4552:3;4541:9;4537:19;4528:6;4484:73;:::i;:::-;4567:89;4651:3;4640:9;4636:19;4627:6;4567:89;:::i;:::-;4666:67;4728:3;4717:9;4713:19;4704:6;4666:67;:::i;:::-;4743:73;4811:3;4800:9;4796:19;4787:6;4743:73;:::i;:::-;4826;4894:3;4883:9;4879:19;4870:6;4826:73;:::i;:::-;4909;4977:3;4966:9;4962:19;4953:6;4909:73;:::i;:::-;4992;5060:3;5049:9;5045:19;5036:6;4992:73;:::i;:::-;5075:74;5144:3;5133:9;5129:19;5119:7;5075:74;:::i;:::-;5159:68;5222:3;5211:9;5207:19;5197:7;5159:68;:::i;:::-;3696:1538;;;;;;;;;;;;;;;:::o;5240:120::-;5312:23;5329:5;5312:23;:::i;:::-;5305:5;5302:34;5292:62;;5350:1;5347;5340:12;5292:62;5240:120;:::o;5366:137::-;5411:5;5449:6;5436:20;5427:29;;5465:32;5491:5;5465:32;:::i;:::-;5366:137;;;;:::o;5509:472::-;5576:6;5584;5633:2;5621:9;5612:7;5608:23;5604:32;5601:119;;;5639:79;;:::i;:::-;5601:119;5759:1;5784:53;5829:7;5820:6;5809:9;5805:22;5784:53;:::i;:::-;5774:63;;5730:117;5886:2;5912:52;5956:7;5947:6;5936:9;5932:22;5912:52;:::i;:::-;5902:62;;5857:117;5509:472;;;;;:::o;5987:96::-;6024:7;6053:24;6071:5;6053:24;:::i;:::-;6042:35;;5987:96;;;:::o;6089:118::-;6176:24;6194:5;6176:24;:::i;:::-;6171:3;6164:37;6089:118;;:::o;6213:222::-;6306:4;6344:2;6333:9;6329:18;6321:26;;6357:71;6425:1;6414:9;6410:17;6401:6;6357:71;:::i;:::-;6213:222;;;;:::o;6441:77::-;6478:7;6507:5;6496:16;;6441:77;;;:::o;6524:122::-;6597:24;6615:5;6597:24;:::i;:::-;6590:5;6587:35;6577:63;;6636:1;6633;6626:12;6577:63;6524:122;:::o;6652:139::-;6698:5;6736:6;6723:20;6714:29;;6752:33;6779:5;6752:33;:::i;:::-;6652:139;;;;:::o;6797:619::-;6874:6;6882;6890;6939:2;6927:9;6918:7;6914:23;6910:32;6907:119;;;6945:79;;:::i;:::-;6907:119;7065:1;7090:53;7135:7;7126:6;7115:9;7111:22;7090:53;:::i;:::-;7080:63;;7036:117;7192:2;7218:53;7263:7;7254:6;7243:9;7239:22;7218:53;:::i;:::-;7208:63;;7163:118;7320:2;7346:53;7391:7;7382:6;7371:9;7367:22;7346:53;:::i;:::-;7336:63;;7291:118;6797:619;;;;;:::o;7422:138::-;7503:32;7529:5;7503:32;:::i;:::-;7496:5;7493:43;7483:71;;7550:1;7547;7540:12;7483:71;7422:138;:::o;7566:155::-;7620:5;7658:6;7645:20;7636:29;;7674:41;7709:5;7674:41;:::i;:::-;7566:155;;;;:::o;7727:490::-;7803:6;7811;7860:2;7848:9;7839:7;7835:23;7831:32;7828:119;;;7866:79;;:::i;:::-;7828:119;7986:1;8011:61;8064:7;8055:6;8044:9;8040:22;8011:61;:::i;:::-;8001:71;;7957:125;8121:2;8147:53;8192:7;8183:6;8172:9;8168:22;8147:53;:::i;:::-;8137:63;;8092:118;7727:490;;;;;:::o;8223:116::-;8293:21;8308:5;8293:21;:::i;:::-;8286:5;8283:32;8273:60;;8329:1;8326;8319:12;8273:60;8223:116;:::o;8345:133::-;8388:5;8426:6;8413:20;8404:29;;8442:30;8466:5;8442:30;:::i;:::-;8345:133;;;;:::o;8484:1197::-;8594:6;8602;8610;8618;8626;8634;8642;8691:3;8679:9;8670:7;8666:23;8662:33;8659:120;;;8698:79;;:::i;:::-;8659:120;8818:1;8843:53;8888:7;8879:6;8868:9;8864:22;8843:53;:::i;:::-;8833:63;;8789:117;8945:2;8971:53;9016:7;9007:6;8996:9;8992:22;8971:53;:::i;:::-;8961:63;;8916:118;9073:2;9099:53;9144:7;9135:6;9124:9;9120:22;9099:53;:::i;:::-;9089:63;;9044:118;9201:2;9227:53;9272:7;9263:6;9252:9;9248:22;9227:53;:::i;:::-;9217:63;;9172:118;9329:3;9356:50;9398:7;9389:6;9378:9;9374:22;9356:50;:::i;:::-;9346:60;;9300:116;9455:3;9482:53;9527:7;9518:6;9507:9;9503:22;9482:53;:::i;:::-;9472:63;;9426:119;9584:3;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9555:119;8484:1197;;;;;;;;;;:::o;9687:122::-;9760:24;9778:5;9760:24;:::i;:::-;9753:5;9750:35;9740:63;;9799:1;9796;9789:12;9740:63;9687:122;:::o;9815:139::-;9861:5;9899:6;9886:20;9877:29;;9915:33;9942:5;9915:33;:::i;:::-;9815:139;;;;:::o;9960:329::-;10019:6;10068:2;10056:9;10047:7;10043:23;10039:32;10036:119;;;10074:79;;:::i;:::-;10036:119;10194:1;10219:53;10264:7;10255:6;10244:9;10240:22;10219:53;:::i;:::-;10209:63;;10165:117;9960:329;;;;:::o;10295:348::-;10335:7;10358:20;10376:1;10358:20;:::i;:::-;10353:25;;10392:20;10410:1;10392:20;:::i;:::-;10387:25;;10580:1;10512:66;10508:74;10505:1;10502:81;10497:1;10490:9;10483:17;10479:105;10476:131;;;10587:18;;:::i;:::-;10476:131;10635:1;10632;10628:9;10617:20;;10295:348;;;;:::o;10649:79::-;10688:7;10717:5;10706:16;;10649:79;;;:::o;10734:157::-;10839:45;10859:24;10877:5;10859:24;:::i;:::-;10839:45;:::i;:::-;10834:3;10827:58;10734:157;;:::o;10897:256::-;11009:3;11024:75;11095:3;11086:6;11024:75;:::i;:::-;11124:2;11119:3;11115:12;11108:19;;11144:3;11137:10;;10897:256;;;;:::o;11159:169::-;11243:11;11277:6;11272:3;11265:19;11317:4;11312:3;11308:14;11293:29;;11159:169;;;;:::o;11334:221::-;11474:34;11470:1;11462:6;11458:14;11451:58;11543:4;11538:2;11530:6;11526:15;11519:29;11334:221;:::o;11561:366::-;11703:3;11724:67;11788:2;11783:3;11724:67;:::i;:::-;11717:74;;11800:93;11889:3;11800:93;:::i;:::-;11918:2;11913:3;11909:12;11902:19;;11561:366;;;:::o;11933:419::-;12099:4;12137:2;12126:9;12122:18;12114:26;;12186:9;12180:4;12176:20;12172:1;12161:9;12157:17;12150:47;12214:131;12340:4;12214:131;:::i;:::-;12206:139;;11933:419;;;:::o;12358:221::-;12498:34;12494:1;12486:6;12482:14;12475:58;12567:4;12562:2;12554:6;12550:15;12543:29;12358:221;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12585:366;;;:::o;12957:419::-;13123:4;13161:2;13150:9;13146:18;13138:26;;13210:9;13204:4;13200:20;13196:1;13185:9;13181:17;13174:47;13238:131;13364:4;13238:131;:::i;:::-;13230:139;;12957:419;;;:::o;13382:181::-;13522:33;13518:1;13510:6;13506:14;13499:57;13382:181;:::o;13569:366::-;13711:3;13732:67;13796:2;13791:3;13732:67;:::i;:::-;13725:74;;13808:93;13897:3;13808:93;:::i;:::-;13926:2;13921:3;13917:12;13910:19;;13569:366;;;:::o;13941:419::-;14107:4;14145:2;14134:9;14130:18;14122:26;;14194:9;14188:4;14184:20;14180:1;14169:9;14165:17;14158:47;14222:131;14348:4;14222:131;:::i;:::-;14214:139;;13941:419;;;:::o;14366:175::-;14506:27;14502:1;14494:6;14490:14;14483:51;14366:175;:::o;14547:366::-;14689:3;14710:67;14774:2;14769:3;14710:67;:::i;:::-;14703:74;;14786:93;14875:3;14786:93;:::i;:::-;14904:2;14899:3;14895:12;14888:19;;14547:366;;;:::o;14919:419::-;15085:4;15123:2;15112:9;15108:18;15100:26;;15172:9;15166:4;15162:20;15158:1;15147:9;15143:17;15136:47;15200:131;15326:4;15200:131;:::i;:::-;15192:139;;14919:419;;;:::o;15344:225::-;15484:34;15480:1;15472:6;15468:14;15461:58;15553:8;15548:2;15540:6;15536:15;15529:33;15344:225;:::o;15575:366::-;15717:3;15738:67;15802:2;15797:3;15738:67;:::i;:::-;15731:74;;15814:93;15903:3;15814:93;:::i;:::-;15932:2;15927:3;15923:12;15916:19;;15575:366;;;:::o;15947:419::-;16113:4;16151:2;16140:9;16136:18;16128:26;;16200:9;16194:4;16190:20;16186:1;16175:9;16171:17;16164:47;16228:131;16354:4;16228:131;:::i;:::-;16220:139;;15947:419;;;:::o;16372:191::-;16412:4;16432:20;16450:1;16432:20;:::i;:::-;16427:25;;16466:20;16484:1;16466:20;:::i;:::-;16461:25;;16505:1;16502;16499:8;16496:34;;;16510:18;;:::i;:::-;16496:34;16555:1;16552;16548:9;16540:17;;16372:191;;;;:::o;16569:243::-;16709:34;16705:1;16697:6;16693:14;16686:58;16778:26;16773:2;16765:6;16761:15;16754:51;16569:243;:::o;16818:366::-;16960:3;16981:67;17045:2;17040:3;16981:67;:::i;:::-;16974:74;;17057:93;17146:3;17057:93;:::i;:::-;17175:2;17170:3;17166:12;17159:19;;16818:366;;;:::o;17190:419::-;17356:4;17394:2;17383:9;17379:18;17371:26;;17443:9;17437:4;17433:20;17429:1;17418:9;17414:17;17407:47;17471:131;17597:4;17471:131;:::i;:::-;17463:139;;17190:419;;;:::o;17615:220::-;17755:34;17751:1;17743:6;17739:14;17732:58;17824:3;17819:2;17811:6;17807:15;17800:28;17615:220;:::o;17841:366::-;17983:3;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18080:93;18169:3;18080:93;:::i;:::-;18198:2;18193:3;18189:12;18182:19;;17841:366;;;:::o;18213:419::-;18379:4;18417:2;18406:9;18402:18;18394:26;;18466:9;18460:4;18456:20;18452:1;18441:9;18437:17;18430:47;18494:131;18620:4;18494:131;:::i;:::-;18486:139;;18213:419;;;:::o;18638:180::-;18686:77;18683:1;18676:88;18783:4;18780:1;18773:15;18807:4;18804:1;18797:15;18824:176;18856:1;18873:20;18891:1;18873:20;:::i;:::-;18868:25;;18907:20;18925:1;18907:20;:::i;:::-;18902:25;;18946:1;18936:35;;18951:18;;:::i;:::-;18936:35;18992:1;18989;18985:9;18980:14;;18824:176;;;;:::o;19006:233::-;19146:34;19142:1;19134:6;19130:14;19123:58;19215:16;19210:2;19202:6;19198:15;19191:41;19006:233;:::o;19245:366::-;19387:3;19408:67;19472:2;19467:3;19408:67;:::i;:::-;19401:74;;19484:93;19573:3;19484:93;:::i;:::-;19602:2;19597:3;19593:12;19586:19;;19245:366;;;:::o;19617:419::-;19783:4;19821:2;19810:9;19806:18;19798:26;;19870:9;19864:4;19860:20;19856:1;19845:9;19841:17;19834:47;19898:131;20024:4;19898:131;:::i;:::-;19890:139;;19617:419;;;:::o;20042:176::-;20182:28;20178:1;20170:6;20166:14;20159:52;20042:176;:::o;20224:366::-;20366:3;20387:67;20451:2;20446:3;20387:67;:::i;:::-;20380:74;;20463:93;20552:3;20463:93;:::i;:::-;20581:2;20576:3;20572:12;20565:19;;20224:366;;;:::o;20596:419::-;20762:4;20800:2;20789:9;20785:18;20777:26;;20849:9;20843:4;20839:20;20835:1;20824:9;20820:17;20813:47;20877:131;21003:4;20877:131;:::i;:::-;20869:139;;20596:419;;;:::o;21021:233::-;21161:34;21157:1;21149:6;21145:14;21138:58;21230:16;21225:2;21217:6;21213:15;21206:41;21021:233;:::o;21260:366::-;21402:3;21423:67;21487:2;21482:3;21423:67;:::i;:::-;21416:74;;21499:93;21588:3;21499:93;:::i;:::-;21617:2;21612:3;21608:12;21601:19;;21260:366;;;:::o;21632:419::-;21798:4;21836:2;21825:9;21821:18;21813:26;;21885:9;21879:4;21875:20;21871:1;21860:9;21856:17;21849:47;21913:131;22039:4;21913:131;:::i;:::-;21905:139;;21632:419;;;:::o;22057:225::-;22197:34;22193:1;22185:6;22181:14;22174:58;22266:8;22261:2;22253:6;22249:15;22242:33;22057:225;:::o;22288:366::-;22430:3;22451:67;22515:2;22510:3;22451:67;:::i;:::-;22444:74;;22527:93;22616:3;22527:93;:::i;:::-;22645:2;22640:3;22636:12;22629:19;;22288:366;;;:::o;22660:419::-;22826:4;22864:2;22853:9;22849:18;22841:26;;22913:9;22907:4;22903:20;22899:1;22888:9;22884:17;22877:47;22941:131;23067:4;22941:131;:::i;:::-;22933:139;;22660:419;;;:::o;23085:169::-;23225:21;23221:1;23213:6;23209:14;23202:45;23085:169;:::o;23260:366::-;23402:3;23423:67;23487:2;23482:3;23423:67;:::i;:::-;23416:74;;23499:93;23588:3;23499:93;:::i;:::-;23617:2;23612:3;23608:12;23601:19;;23260:366;;;:::o;23632:419::-;23798:4;23836:2;23825:9;23821:18;23813:26;;23885:9;23879:4;23875:20;23871:1;23860:9;23856:17;23849:47;23913:131;24039:4;23913:131;:::i;:::-;23905:139;;23632:419;;;:::o;24057:173::-;24197:25;24193:1;24185:6;24181:14;24174:49;24057:173;:::o;24236:366::-;24378:3;24399:67;24463:2;24458:3;24399:67;:::i;:::-;24392:74;;24475:93;24564:3;24475:93;:::i;:::-;24593:2;24588:3;24584:12;24577:19;;24236:366;;;:::o;24608:419::-;24774:4;24812:2;24801:9;24797:18;24789:26;;24861:9;24855:4;24851:20;24847:1;24836:9;24832:17;24825:47;24889:131;25015:4;24889:131;:::i;:::-;24881:139;;24608:419;;;:::o;25033:235::-;25173:34;25169:1;25161:6;25157:14;25150:58;25242:18;25237:2;25229:6;25225:15;25218:43;25033:235;:::o;25274:366::-;25416:3;25437:67;25501:2;25496:3;25437:67;:::i;:::-;25430:74;;25513:93;25602:3;25513:93;:::i;:::-;25631:2;25626:3;25622:12;25615:19;;25274:366;;;:::o;25646:419::-;25812:4;25850:2;25839:9;25835:18;25827:26;;25899:9;25893:4;25889:20;25885:1;25874:9;25870:17;25863:47;25927:131;26053:4;25927:131;:::i;:::-;25919:139;;25646:419;;;:::o;26071:225::-;26211:34;26207:1;26199:6;26195:14;26188:58;26280:8;26275:2;26267:6;26263:15;26256:33;26071:225;:::o;26302:366::-;26444:3;26465:67;26529:2;26524:3;26465:67;:::i;:::-;26458:74;;26541:93;26630:3;26541:93;:::i;:::-;26659:2;26654:3;26650:12;26643:19;;26302:366;;;:::o;26674:419::-;26840:4;26878:2;26867:9;26863:18;26855:26;;26927:9;26921:4;26917:20;26913:1;26902:9;26898:17;26891:47;26955:131;27081:4;26955:131;:::i;:::-;26947:139;;26674:419;;;:::o;27099:181::-;27239:33;27235:1;27227:6;27223:14;27216:57;27099:181;:::o;27286:366::-;27428:3;27449:67;27513:2;27508:3;27449:67;:::i;:::-;27442:74;;27525:93;27614:3;27525:93;:::i;:::-;27643:2;27638:3;27634:12;27627:19;;27286:366;;;:::o;27658:419::-;27824:4;27862:2;27851:9;27847:18;27839:26;;27911:9;27905:4;27901:20;27897:1;27886:9;27882:17;27875:47;27939:131;28065:4;27939:131;:::i;:::-;27931:139;;27658:419;;;:::o;28083:182::-;28223:34;28219:1;28211:6;28207:14;28200:58;28083:182;:::o;28271:366::-;28413:3;28434:67;28498:2;28493:3;28434:67;:::i;:::-;28427:74;;28510:93;28599:3;28510:93;:::i;:::-;28628:2;28623:3;28619:12;28612:19;;28271:366;;;:::o;28643:419::-;28809:4;28847:2;28836:9;28832:18;28824:26;;28896:9;28890:4;28886:20;28882:1;28871:9;28867:17;28860:47;28924:131;29050:4;28924:131;:::i;:::-;28916:139;;28643:419;;;:::o;29068:221::-;29208:34;29204:1;29196:6;29192:14;29185:58;29277:4;29272:2;29264:6;29260:15;29253:29;29068:221;:::o;29295:366::-;29437:3;29458:67;29522:2;29517:3;29458:67;:::i;:::-;29451:74;;29534:93;29623:3;29534:93;:::i;:::-;29652:2;29647:3;29643:12;29636:19;;29295:366;;;:::o;29667:419::-;29833:4;29871:2;29860:9;29856:18;29848:26;;29920:9;29914:4;29910:20;29906:1;29895:9;29891:17;29884:47;29948:131;30074:4;29948:131;:::i;:::-;29940:139;;29667:419;;;:::o;30092:172::-;30232:24;30228:1;30220:6;30216:14;30209:48;30092:172;:::o;30270:366::-;30412:3;30433:67;30497:2;30492:3;30433:67;:::i;:::-;30426:74;;30509:93;30598:3;30509:93;:::i;:::-;30627:2;30622:3;30618:12;30611:19;;30270:366;;;:::o;30642:419::-;30808:4;30846:2;30835:9;30831:18;30823:26;;30895:9;30889:4;30885:20;30881:1;30870:9;30866:17;30859:47;30923:131;31049:4;30923:131;:::i;:::-;30915:139;;30642:419;;;:::o;31067:292::-;31207:34;31203:1;31195:6;31191:14;31184:58;31276:34;31271:2;31263:6;31259:15;31252:59;31345:6;31340:2;31332:6;31328:15;31321:31;31067:292;:::o;31365:366::-;31507:3;31528:67;31592:2;31587:3;31528:67;:::i;:::-;31521:74;;31604:93;31693:3;31604:93;:::i;:::-;31722:2;31717:3;31713:12;31706:19;;31365:366;;;:::o;31737:419::-;31903:4;31941:2;31930:9;31926:18;31918:26;;31990:9;31984:4;31980:20;31976:1;31965:9;31961:17;31954:47;32018:131;32144:4;32018:131;:::i;:::-;32010:139;;31737:419;;;:::o;32162:248::-;32302:34;32298:1;32290:6;32286:14;32279:58;32371:31;32366:2;32358:6;32354:15;32347:56;32162:248;:::o;32416:366::-;32558:3;32579:67;32643:2;32638:3;32579:67;:::i;:::-;32572:74;;32655:93;32744:3;32655:93;:::i;:::-;32773:2;32768:3;32764:12;32757:19;;32416:366;;;:::o;32788:419::-;32954:4;32992:2;32981:9;32977:18;32969:26;;33041:9;33035:4;33031:20;33027:1;33016:9;33012:17;33005:47;33069:131;33195:4;33069:131;:::i;:::-;33061:139;;32788:419;;;:::o;33213:175::-;33353:27;33349:1;33341:6;33337:14;33330:51;33213:175;:::o;33394:366::-;33536:3;33557:67;33621:2;33616:3;33557:67;:::i;:::-;33550:74;;33633:93;33722:3;33633:93;:::i;:::-;33751:2;33746:3;33742:12;33735:19;;33394:366;;;:::o;33766:419::-;33932:4;33970:2;33959:9;33955:18;33947:26;;34019:9;34013:4;34009:20;34005:1;33994:9;33990:17;33983:47;34047:131;34173:4;34047:131;:::i;:::-;34039:139;;33766:419;;;:::o;34191:182::-;34331:34;34327:1;34319:6;34315:14;34308:58;34191:182;:::o;34379:366::-;34521:3;34542:67;34606:2;34601:3;34542:67;:::i;:::-;34535:74;;34618:93;34707:3;34618:93;:::i;:::-;34736:2;34731:3;34727:12;34720:19;;34379:366;;;:::o;34751:419::-;34917:4;34955:2;34944:9;34940:18;34932:26;;35004:9;34998:4;34994:20;34990:1;34979:9;34975:17;34968:47;35032:131;35158:4;35032:131;:::i;:::-;35024:139;;34751:419;;;:::o;35176:225::-;35316:34;35312:1;35304:6;35300:14;35293:58;35385:8;35380:2;35372:6;35368:15;35361:33;35176:225;:::o;35407:366::-;35549:3;35570:67;35634:2;35629:3;35570:67;:::i;:::-;35563:74;;35646:93;35735:3;35646:93;:::i;:::-;35764:2;35759:3;35755:12;35748:19;;35407:366;;;:::o;35779:419::-;35945:4;35983:2;35972:9;35968:18;35960:26;;36032:9;36026:4;36022:20;36018:1;36007:9;36003:17;35996:47;36060:131;36186:4;36060:131;:::i;:::-;36052:139;;35779:419;;;:::o;36204:225::-;36344:34;36340:1;36332:6;36328:14;36321:58;36413:8;36408:2;36400:6;36396:15;36389:33;36204:225;:::o;36435:366::-;36577:3;36598:67;36662:2;36657:3;36598:67;:::i;:::-;36591:74;;36674:93;36763:3;36674:93;:::i;:::-;36792:2;36787:3;36783:12;36776:19;;36435:366;;;:::o;36807:419::-;36973:4;37011:2;37000:9;36996:18;36988:26;;37060:9;37054:4;37050:20;37046:1;37035:9;37031:17;37024:47;37088:131;37214:4;37088:131;:::i;:::-;37080:139;;36807:419;;;:::o;37232:225::-;37372:34;37368:1;37360:6;37356:14;37349:58;37441:8;37436:2;37428:6;37424:15;37417:33;37232:225;:::o;37463:366::-;37605:3;37626:67;37690:2;37685:3;37626:67;:::i;:::-;37619:74;;37702:93;37791:3;37702:93;:::i;:::-;37820:2;37815:3;37811:12;37804:19;;37463:366;;;:::o;37835:419::-;38001:4;38039:2;38028:9;38024:18;38016:26;;38088:9;38082:4;38078:20;38074:1;38063:9;38059:17;38052:47;38116:131;38242:4;38116:131;:::i;:::-;38108:139;;37835:419;;;:::o;38260:175::-;38400:27;38396:1;38388:6;38384:14;38377:51;38260:175;:::o;38441:366::-;38583:3;38604:67;38668:2;38663:3;38604:67;:::i;:::-;38597:74;;38680:93;38769:3;38680:93;:::i;:::-;38798:2;38793:3;38789:12;38782:19;;38441:366;;;:::o;38813:419::-;38979:4;39017:2;39006:9;39002:18;38994:26;;39066:9;39060:4;39056:20;39052:1;39041:9;39037:17;39030:47;39094:131;39220:4;39094:131;:::i;:::-;39086:139;;38813:419;;;:::o;39238:169::-;39378:21;39374:1;39366:6;39362:14;39355:45;39238:169;:::o;39413:366::-;39555:3;39576:67;39640:2;39635:3;39576:67;:::i;:::-;39569:74;;39652:93;39741:3;39652:93;:::i;:::-;39770:2;39765:3;39761:12;39754:19;;39413:366;;;:::o;39785:419::-;39951:4;39989:2;39978:9;39974:18;39966:26;;40038:9;40032:4;40028:20;40024:1;40013:9;40009:17;40002:47;40066:131;40192:4;40066:131;:::i;:::-;40058:139;;39785:419;;;:::o;40210:170::-;40350:22;40346:1;40338:6;40334:14;40327:46;40210:170;:::o;40386:366::-;40528:3;40549:67;40613:2;40608:3;40549:67;:::i;:::-;40542:74;;40625:93;40714:3;40625:93;:::i;:::-;40743:2;40738:3;40734:12;40727:19;;40386:366;;;:::o;40758:419::-;40924:4;40962:2;40951:9;40947:18;40939:26;;41011:9;41005:4;41001:20;40997:1;40986:9;40982:17;40975:47;41039:131;41165:4;41039:131;:::i;:::-;41031:139;;40758:419;;;:::o;41183:172::-;41323:24;41319:1;41311:6;41307:14;41300:48;41183:172;:::o;41361:366::-;41503:3;41524:67;41588:2;41583:3;41524:67;:::i;:::-;41517:74;;41600:93;41689:3;41600:93;:::i;:::-;41718:2;41713:3;41709:12;41702:19;;41361:366;;;:::o;41733:419::-;41899:4;41937:2;41926:9;41922:18;41914:26;;41986:9;41980:4;41976:20;41972:1;41961:9;41957:17;41950:47;42014:131;42140:4;42014:131;:::i;:::-;42006:139;;41733:419;;;:::o;42158:79::-;42197:7;42226:5;42215:16;;42158:79;;;:::o;42243:157::-;42348:45;42368:24;42386:5;42368:24;:::i;:::-;42348:45;:::i;:::-;42343:3;42336:58;42243:157;;:::o;42406:397::-;42546:3;42561:75;42632:3;42623:6;42561:75;:::i;:::-;42661:2;42656:3;42652:12;42645:19;;42674:75;42745:3;42736:6;42674:75;:::i;:::-;42774:2;42769:3;42765:12;42758:19;;42794:3;42787:10;;42406:397;;;;;:::o;42809:102::-;42851:8;42898:5;42895:1;42891:13;42870:34;;42809:102;;;:::o;42917:848::-;42978:5;42985:4;43009:6;43000:15;;43033:5;43024:14;;43047:712;43068:1;43058:8;43055:15;43047:712;;;43163:4;43158:3;43154:14;43148:4;43145:24;43142:50;;;43172:18;;:::i;:::-;43142:50;43222:1;43212:8;43208:16;43205:451;;;43637:4;43630:5;43626:16;43617:25;;43205:451;43687:4;43681;43677:15;43669:23;;43717:32;43740:8;43717:32;:::i;:::-;43705:44;;43047:712;;;42917:848;;;;;;;:::o;43771:1073::-;43825:5;44016:8;44006:40;;44037:1;44028:10;;44039:5;;44006:40;44065:4;44055:36;;44082:1;44073:10;;44084:5;;44055:36;44151:4;44199:1;44194:27;;;;44235:1;44230:191;;;;44144:277;;44194:27;44212:1;44203:10;;44214:5;;;44230:191;44275:3;44265:8;44262:17;44259:43;;;44282:18;;:::i;:::-;44259:43;44331:8;44328:1;44324:16;44315:25;;44366:3;44359:5;44356:14;44353:40;;;44373:18;;:::i;:::-;44353:40;44406:5;;;44144:277;;44530:2;44520:8;44517:16;44511:3;44505:4;44502:13;44498:36;44480:2;44470:8;44467:16;44462:2;44456:4;44453:12;44449:35;44433:111;44430:246;;;44586:8;44580:4;44576:19;44567:28;;44621:3;44614:5;44611:14;44608:40;;;44628:18;;:::i;:::-;44608:40;44661:5;;44430:246;44701:42;44739:3;44729:8;44723:4;44720:1;44701:42;:::i;:::-;44686:57;;;;44775:4;44770:3;44766:14;44759:5;44756:25;44753:51;;;44784:18;;:::i;:::-;44753:51;44833:4;44826:5;44822:16;44813:25;;43771:1073;;;;;;:::o;44850:285::-;44910:5;44934:23;44952:4;44934:23;:::i;:::-;44926:31;;44978:27;44996:8;44978:27;:::i;:::-;44966:39;;45024:104;45061:66;45051:8;45045:4;45024:104;:::i;:::-;45015:113;;44850:285;;;;:::o;45141:181::-;45281:33;45277:1;45269:6;45265:14;45258:57;45141:181;:::o;45328:366::-;45470:3;45491:67;45555:2;45550:3;45491:67;:::i;:::-;45484:74;;45567:93;45656:3;45567:93;:::i;:::-;45685:2;45680:3;45676:12;45669:19;;45328:366;;;:::o;45700:419::-;45866:4;45904:2;45893:9;45889:18;45881:26;;45953:9;45947:4;45943:20;45939:1;45928:9;45924:17;45917:47;45981:131;46107:4;45981:131;:::i;:::-;45973:139;;45700:419;;;:::o;46125:180::-;46265:32;46261:1;46253:6;46249:14;46242:56;46125:180;:::o;46311:366::-;46453:3;46474:67;46538:2;46533:3;46474:67;:::i;:::-;46467:74;;46550:93;46639:3;46550:93;:::i;:::-;46668:2;46663:3;46659:12;46652:19;;46311:366;;;:::o;46683:419::-;46849:4;46887:2;46876:9;46872:18;46864:26;;46936:9;46930:4;46926:20;46922:1;46911:9;46907:17;46900:47;46964:131;47090:4;46964:131;:::i;:::-;46956:139;;46683:419;;;:::o;47108:221::-;47248:34;47244:1;47236:6;47232:14;47225:58;47317:4;47312:2;47304:6;47300:15;47293:29;47108:221;:::o;47335:366::-;47477:3;47498:67;47562:2;47557:3;47498:67;:::i;:::-;47491:74;;47574:93;47663:3;47574:93;:::i;:::-;47692:2;47687:3;47683:12;47676:19;;47335:366;;;:::o;47707:419::-;47873:4;47911:2;47900:9;47896:18;47888:26;;47960:9;47954:4;47950:20;47946:1;47935:9;47931:17;47924:47;47988:131;48114:4;47988:131;:::i;:::-;47980:139;;47707:419;;;:::o;48132:178::-;48272:30;48268:1;48260:6;48256:14;48249:54;48132:178;:::o;48316:366::-;48458:3;48479:67;48543:2;48538:3;48479:67;:::i;:::-;48472:74;;48555:93;48644:3;48555:93;:::i;:::-;48673:2;48668:3;48664:12;48657:19;;48316:366;;;:::o;48688:419::-;48854:4;48892:2;48881:9;48877:18;48869:26;;48941:9;48935:4;48931:20;48927:1;48916:9;48912:17;48905:47;48969:131;49095:4;48969:131;:::i;:::-;48961:139;;48688:419;;;:::o;49113:169::-;49253:21;49249:1;49241:6;49237:14;49230:45;49113:169;:::o;49288:366::-;49430:3;49451:67;49515:2;49510:3;49451:67;:::i;:::-;49444:74;;49527:93;49616:3;49527:93;:::i;:::-;49645:2;49640:3;49636:12;49629:19;;49288:366;;;:::o;49660:419::-;49826:4;49864:2;49853:9;49849:18;49841:26;;49913:9;49907:4;49903:20;49899:1;49888:9;49884:17;49877:47;49941:131;50067:4;49941:131;:::i;:::-;49933:139;;49660:419;;;:::o;50085:96::-;50119:8;50168:5;50163:3;50159:15;50138:36;;50085:96;;;:::o;50187:93::-;50224:7;50253:21;50268:5;50253:21;:::i;:::-;50242:32;;50187:93;;;:::o;50286:95::-;50322:7;50351:24;50369:5;50351:24;:::i;:::-;50340:35;;50286:95;;;:::o;50387:145::-;50486:39;50503:21;50518:5;50503:21;:::i;:::-;50486:39;:::i;:::-;50481:3;50474:52;50387:145;;:::o;50538:807::-;50756:3;50771:75;50842:3;50833:6;50771:75;:::i;:::-;50871:2;50866:3;50862:12;50855:19;;50884:75;50955:3;50946:6;50884:75;:::i;:::-;50984:2;50979:3;50975:12;50968:19;;50997:75;51068:3;51059:6;50997:75;:::i;:::-;51097:2;51092:3;51088:12;51081:19;;51110:75;51181:3;51172:6;51110:75;:::i;:::-;51210:2;51205:3;51201:12;51194:19;;51223:69;51288:3;51279:6;51223:69;:::i;:::-;51317:1;51312:3;51308:11;51301:18;;51336:3;51329:10;;50538:807;;;;;;;;:::o;51351:118::-;51438:24;51456:5;51438:24;:::i;:::-;51433:3;51426:37;51351:118;;:::o;51475:86::-;51521:7;51550:5;51539:16;;51475:86;;;:::o;51567:60::-;51595:3;51616:5;51609:12;;51567:60;;;:::o;51633:156::-;51690:9;51723:60;51739:43;51748:33;51775:5;51748:33;:::i;:::-;51739:43;:::i;:::-;51723:60;:::i;:::-;51710:73;;51633:156;;;:::o;51795:145::-;51889:44;51927:5;51889:44;:::i;:::-;51884:3;51877:57;51795:145;;:::o;51946:567::-;52130:4;52168:3;52157:9;52153:19;52145:27;;52182:71;52250:1;52239:9;52235:17;52226:6;52182:71;:::i;:::-;52263:79;52338:2;52327:9;52323:18;52314:6;52263:79;:::i;:::-;52352:72;52420:2;52409:9;52405:18;52396:6;52352:72;:::i;:::-;52434;52502:2;52491:9;52487:18;52478:6;52434:72;:::i;:::-;51946:567;;;;;;;:::o;52519:179::-;52659:31;52655:1;52647:6;52643:14;52636:55;52519:179;:::o;52704:366::-;52846:3;52867:67;52931:2;52926:3;52867:67;:::i;:::-;52860:74;;52943:93;53032:3;52943:93;:::i;:::-;53061:2;53056:3;53052:12;53045:19;;52704:366;;;:::o;53076:419::-;53242:4;53280:2;53269:9;53265:18;53257:26;;53329:9;53323:4;53319:20;53315:1;53304:9;53300:17;53293:47;53357:131;53483:4;53357:131;:::i;:::-;53349:139;;53076:419;;;:::o;53501:300::-;53641:34;53637:1;53629:6;53625:14;53618:58;53710:34;53705:2;53697:6;53693:15;53686:59;53779:14;53774:2;53766:6;53762:15;53755:39;53501:300;:::o;53807:366::-;53949:3;53970:67;54034:2;54029:3;53970:67;:::i;:::-;53963:74;;54046:93;54135:3;54046:93;:::i;:::-;54164:2;54159:3;54155:12;54148:19;;53807:366;;;:::o;54179:419::-;54345:4;54383:2;54372:9;54368:18;54360:26;;54432:9;54426:4;54422:20;54418:1;54407:9;54403:17;54396:47;54460:131;54586:4;54460:131;:::i;:::-;54452:139;;54179:419;;;:::o;54604:302::-;54744:34;54740:1;54732:6;54728:14;54721:58;54813:34;54808:2;54800:6;54796:15;54789:59;54882:16;54877:2;54869:6;54865:15;54858:41;54604:302;:::o;54912:366::-;55054:3;55075:67;55139:2;55134:3;55075:67;:::i;:::-;55068:74;;55151:93;55240:3;55151:93;:::i;:::-;55269:2;55264:3;55260:12;55253:19;;54912:366;;;:::o;55284:419::-;55450:4;55488:2;55477:9;55473:18;55465:26;;55537:9;55531:4;55527:20;55523:1;55512:9;55508:17;55501:47;55565:131;55691:4;55565:131;:::i;:::-;55557:139;;55284:419;;;:::o;55709:179::-;55849:31;55845:1;55837:6;55833:14;55826:55;55709:179;:::o;55894:366::-;56036:3;56057:67;56121:2;56116:3;56057:67;:::i;:::-;56050:74;;56133:93;56222:3;56133:93;:::i;:::-;56251:2;56246:3;56242:12;56235:19;;55894:366;;;:::o;56266:419::-;56432:4;56470:2;56459:9;56455:18;56447:26;;56519:9;56513:4;56509:20;56505:1;56494:9;56490:17;56483:47;56547:131;56673:4;56547:131;:::i;:::-;56539:139;;56266:419;;;:::o;56691:185::-;56731:1;56748:20;56766:1;56748:20;:::i;:::-;56743:25;;56782:20;56800:1;56782:20;:::i;:::-;56777:25;;56821:1;56811:35;;56826:18;;:::i;:::-;56811:35;56868:1;56865;56861:9;56856:14;;56691:185;;;;:::o;56882:640::-;57075:4;57113:3;57102:9;57098:19;57090:27;;57127:71;57195:1;57184:9;57180:17;57171:6;57127:71;:::i;:::-;57208:68;57272:2;57261:9;57257:18;57248:6;57208:68;:::i;:::-;57286:70;57352:2;57341:9;57337:18;57328:6;57286:70;:::i;:::-;57366:72;57434:2;57423:9;57419:18;57410:6;57366:72;:::i;:::-;57448:67;57510:3;57499:9;57495:19;57486:6;57448:67;:::i;:::-;56882:640;;;;;;;;:::o;57528:763::-;57755:4;57793:3;57782:9;57778:19;57770:27;;57807:71;57875:1;57864:9;57860:17;57851:6;57807:71;:::i;:::-;57888:68;57952:2;57941:9;57937:18;57928:6;57888:68;:::i;:::-;57966:70;58032:2;58021:9;58017:18;58008:6;57966:70;:::i;:::-;58046:72;58114:2;58103:9;58099:18;58090:6;58046:72;:::i;:::-;58128:73;58196:3;58185:9;58181:19;58172:6;58128:73;:::i;:::-;58211;58279:3;58268:9;58264:19;58255:6;58211:73;:::i;:::-;57528:763;;;;;;;;;:::o

Swarm Source

ipfs://209146505a33f37184ebe6312ec5cd3770a8875735c5c0e052f5aee7126a4757

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.