ETH Price: $3,238.74 (-0.61%)
Gas: 2 Gwei

Contract

0x3c037014486aaA5D509c5171d413C8B3022f1072
 

Overview

ETH Balance

0.07 ETH

Eth Value

$226.71 (@ $3,238.74/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Clover Wit...203716922024-07-23 20:42:114 days ago1721767331IN
Clovers: Controller
0 ETH0.001471193.53444159
Claim Clover Wit...202479462024-07-06 14:04:4721 days ago1720274687IN
Clovers: Controller
0 ETH0.001396313.49827423
Claim Clover Wit...201969492024-06-29 11:08:5928 days ago1719659339IN
Clovers: Controller
0 ETH0.000671951.68334865
Claim Clover Wit...197141712024-04-22 23:19:2396 days ago1713827963IN
Clovers: Controller
0 ETH0.002507777.02780218
Claim Clover Wit...197141542024-04-22 23:15:4796 days ago1713827747IN
Clovers: Controller
0 ETH0.002357846.60728521
Claim Clover Wit...197140512024-04-22 22:55:1196 days ago1713826511IN
Clovers: Controller
0 ETH0.002420096.78216384
Claim Clover Wit...196645012024-04-16 0:33:23103 days ago1713227603IN
Clovers: Controller
0 ETH0.000158066.58621956
Claim Clover Wit...196524822024-04-14 8:08:47104 days ago1713082127IN
Clovers: Controller
0.005 ETH0.0038267311.74678214
Claim Clover Wit...196523102024-04-14 7:34:23104 days ago1713080063IN
Clovers: Controller
0.005 ETH0.0049459211.40940794
Claim Clover Wit...196251372024-04-10 12:09:59108 days ago1712750999IN
Clovers: Controller
0.005 ETH0.0056626417.38197941
Claim Clover Wit...196251352024-04-10 12:09:35108 days ago1712750975IN
Clovers: Controller
0.005 ETH0.0064115619.68227573
Claim Clover Wit...196251352024-04-10 12:09:35108 days ago1712750975IN
Clovers: Controller
0.005 ETH0.0062369717.46284424
Claim Clover Wit...193704322024-03-05 17:22:59144 days ago1709659379IN
Clovers: Controller
0 ETH0.00346256144.27361148
Claim Clover Wit...193703882024-03-05 17:14:11144 days ago1709658851IN
Clovers: Controller
0.005 ETH0.00392709163.62880115
Claim Clover Wit...191391112024-02-02 7:03:47176 days ago1706857427IN
Clovers: Controller
0 ETH0.0087149521.83346157
Claim Clover Wit...191390192024-02-02 6:44:47176 days ago1706856287IN
Clovers: Controller
0 ETH0.0068180217.08025859
Claim Clover Wit...191389762024-02-02 6:36:11176 days ago1706855771IN
Clovers: Controller
0.005 ETH0.0072135822.14188588
Claim Clover Wit...191388212024-02-02 6:05:11176 days ago1706853911IN
Clovers: Controller
0.005 ETH0.0057037215.96837076
Claim Clover Wit...189799492024-01-10 23:53:59199 days ago1704930839IN
Clovers: Controller
0.005 ETH0.001117246.55020527
Claim Clover Wit...181796162023-09-20 20:54:11311 days ago1695243251IN
Clovers: Controller
0 ETH0.0010770125.04678929
Claim Clover Wit...181795982023-09-20 20:50:23311 days ago1695243023IN
Clovers: Controller
0 ETH0.0007476424.92145809
Claim Clover Wit...181441612023-09-15 21:05:59316 days ago1694811959IN
Clovers: Controller
0.005 ETH0.0044878212.56471535
Claim Clover Wit...181166462023-09-12 0:20:35320 days ago1694478035IN
Clovers: Controller
0.005 ETH0.0040666310.11310406
Claim Clover Wit...181145292023-09-11 17:14:35320 days ago1694452475IN
Clovers: Controller
0.005 ETH0.0093702126.23556963
Claim Clover Wit...180589242023-09-03 22:24:47328 days ago1693779887IN
Clovers: Controller
0.01 ETH0.004046749.33515299
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
196524822024-04-14 8:08:47104 days ago1713082127
Clovers: Controller
0.005 ETH
196523102024-04-14 7:34:23104 days ago1713080063
Clovers: Controller
0.005 ETH
196251372024-04-10 12:09:59108 days ago1712750999
Clovers: Controller
0.005 ETH
196251352024-04-10 12:09:35108 days ago1712750975
Clovers: Controller
0.005 ETH
196251352024-04-10 12:09:35108 days ago1712750975
Clovers: Controller
0.005 ETH
191389762024-02-02 6:36:11176 days ago1706855771
Clovers: Controller
0.005 ETH
191388212024-02-02 6:05:11176 days ago1706853911
Clovers: Controller
0.005 ETH
181441612023-09-15 21:05:59316 days ago1694811959
Clovers: Controller
0.005 ETH
181166462023-09-12 0:20:35320 days ago1694478035
Clovers: Controller
0.005 ETH
181145292023-09-11 17:14:35320 days ago1694452475
Clovers: Controller
0.005 ETH
180589242023-09-03 22:24:47328 days ago1693779887
Clovers: Controller
0.01 ETH
178132672023-07-31 13:23:47362 days ago1690809827
Clovers: Controller
0.01 ETH
177099012023-07-17 2:06:47377 days ago1689559607
Clovers: Controller
0.005 ETH
176017002023-07-01 20:54:11392 days ago1688244851
Clovers: Controller
0.005 ETH
168637132023-03-19 19:03:35496 days ago1679252615
Clovers: Controller
0.005 ETH
168566642023-03-18 19:16:59497 days ago1679167019
Clovers: Controller
0.005 ETH
168566502023-03-18 19:14:11497 days ago1679166851
Clovers: Controller
0.005 ETH
168566342023-03-18 19:10:59497 days ago1679166659
Clovers: Controller
0.005 ETH
168121312023-03-12 13:06:11503 days ago1678626371
Clovers: Controller
0.005 ETH
168048852023-03-11 12:36:59504 days ago1678538219
Clovers: Controller
0.005 ETH
168001742023-03-10 20:43:47505 days ago1678481027
Clovers: Controller
0.005 ETH
167980922023-03-10 13:42:11505 days ago1678455731
Clovers: Controller
0.005 ETH
167942162023-03-10 0:31:23506 days ago1678408283
Clovers: Controller
0.005 ETH
166674972023-02-20 4:50:47523 days ago1676868647
Clovers: Controller
0.005 ETH
166562042023-02-18 14:47:11525 days ago1676731631
Clovers: Controller
0.005 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CloversController

Compiler Version
v0.5.9+commit.e560f70d

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-16
*/

// File: contracts/v5/Reversi.sol

pragma solidity ^0.5.9;

library Reversi {
    // event DebugBool(bool boolean);
    // event DebugBoard(bytes16 board);
    // event DebugUint(uint u);
    uint8 constant BLACK = 1; //0b01 //0x1
    uint8 constant WHITE = 2; //0b10 //0x2
    uint8 constant EMPTY = 3; //0b11 //0x3

    struct Game {
        bool error;
        bool complete;
        bool symmetrical;
        bool RotSym;
        bool Y0Sym;
        bool X0Sym;
        bool XYSym;
        bool XnYSym;
        bytes16 board;
        bytes28 first32Moves;
        bytes28 lastMoves;

        uint8 currentPlayer;
        uint8 moveKey;
        uint8 blackScore;
        uint8 whiteScore;
        // string msg;
    }


    function isValid (bytes28[2] memory moves) public pure returns (bool) {
        Game memory game = playGame(moves);
        if (game.error) {
            return false;
        } else if (!game.complete) {
            return false;
        } else {
            return true;
        }
    }

    function getGame (bytes28[2] memory moves) public pure returns (
        bool error,
        bool complete,
        bool symmetrical,
        bytes16 board,
        uint8 currentPlayer,
        uint8 moveKey
    // , string memory msg
    ) {
        Game memory game = playGame(moves);
        return (
            game.error,
            game.complete,
            game.symmetrical,
            game.board,
            game.currentPlayer,
            game.moveKey
            // , game.msg
        );
    }

    function showColors () public pure returns(uint8, uint8, uint8) {
        return (EMPTY, BLACK, WHITE);
    }

    function emptyBoard() public pure returns (bytes16) {
        // game.board = bytes16(10625432672847758622720); // completely empty board
        return bytes16(uint128(340282366920938456379662753540715053055)); // empty board except for center pieces
    }

    function playGame (bytes28[2] memory moves) internal pure returns (Game memory)  {
        Game memory game;

        game.first32Moves = moves[0];
        game.lastMoves = moves[1];
        game.moveKey = 0;
        game.blackScore = 2;
        game.whiteScore = 2;

        game.error = false;
        game.complete = false;
        game.currentPlayer = BLACK;

        game.board = emptyBoard();

        bool skip;
        uint8 move;
        uint8 col;
        uint8 row;
        uint8 i;
        bytes28 currentMoves;

        for (i = 0; i < 60 && !skip; i++) {
            currentMoves = game.moveKey < 32 ? game.first32Moves : game.lastMoves;
            move = readMove(currentMoves, game.moveKey % 32, 32);
            (col, row) = convertMove(move);
            skip = !validMove(move);
            if (i == 0 && (col != 2 || row != 3)) {
                skip = true; // this is to force the first move to always be C4 to avoid repeatable boards via mirroring translations
                game.error = true;
            }
            if (!skip && col < 8 && row < 8 && col >= 0 && row >= 0) {
                // game.msg = "make a move";
                game = makeMove(game, col, row);
                game.moveKey = game.moveKey + 1;
                if (game.error) {
                    if (!validMoveRemains(game)) {
                        // player has no valid moves and must pass
                        game.error = false;
                        if (game.currentPlayer == BLACK) {
                            game.currentPlayer = WHITE;
                        } else {
                            game.currentPlayer = BLACK;
                        }
                        game = makeMove(game, col, row);
                        if (game.error) {
                            game.error = true;
                            skip = true;
                        }
                    }
                }
            }
        }
        if (!game.error) {
            game = isComplete(game);
            game = isSymmetrical(game);
        }
        return game;
    }

    function validMoveRemains (Game memory game) internal pure returns (bool) {
        bool validMovesRemain = false;
        bytes16 board = game.board;
        uint8 i;
        for (i = 0; i < 64 && !validMovesRemain; i++) {
            uint8[2] memory move = [((i - (i % 8)) / 8), (i % 8)];
            uint8 tile = returnTile(game.board, move[0], move[1]);
            if (tile == EMPTY) {
                game.error = false;
                game.board = board;
                game = makeMove(game, move[0], move[1]);
                if (!game.error) {
                    validMovesRemain = true;
                }
            }
        }
        return validMovesRemain;
    }

    function makeMove (Game memory game, uint8 col, uint8 row) internal pure returns (Game memory)  {
        // square is already occupied
        if (returnTile(game.board, col, row) != EMPTY){
            game.error = true;
            // game.msg = "Invalid Game (square is already occupied)";
            return game;
        }
        int8[2][8] memory possibleDirections;
        uint8  possibleDirectionsLength;
        (possibleDirections, possibleDirectionsLength) = getPossibleDirections(game, col, row);
        // no valid directions
        if (possibleDirectionsLength == 0) {
            game.error = true;
            // game.msg = "Invalid Game (doesnt border other tiles)";
            return game;
        }

        bytes28 newFlips;
        uint8 newFlipsLength;
        uint8 newFlipCol;
        uint8 newFlipRow;
        uint8 j;
        bool valid = false;
        for (uint8 i = 0; i < possibleDirectionsLength; i++) {
            delete newFlips;
            delete newFlipsLength;
            (newFlips, newFlipsLength) = traverseDirection(game, possibleDirections[i], col, row);
            for (j = 0; j < newFlipsLength; j++) {
                if (!valid) valid = true;
                (newFlipCol, newFlipRow) = convertMove(readMove(newFlips, j, newFlipsLength));
                game.board = turnTile(game.board, game.currentPlayer, newFlipCol, newFlipRow);
                if (game.currentPlayer == WHITE) {
                    game.whiteScore += 1;
                    game.blackScore -= 1;
                } else {
                    game.whiteScore -= 1;
                    game.blackScore += 1;
                }
            }
        }

        //no valid flips in directions
        if (valid) {
            game.board = turnTile(game.board, game.currentPlayer, col, row);
            if (game.currentPlayer == WHITE) {
                game.whiteScore += 1;
            } else {
                game.blackScore += 1;
            }
        } else {
            game.error = true;
            // game.msg = "Invalid Game (doesnt flip any other tiles)";
            return game;
        }

        // switch players
        if (game.currentPlayer == BLACK) {
            game.currentPlayer = WHITE;
        } else {
            game.currentPlayer = BLACK;
        }
        return game;
    }

    function getPossibleDirections (Game memory game, uint8 col, uint8 row) internal pure returns(int8[2][8] memory, uint8){

        int8[2][8] memory possibleDirections;
        uint8 possibleDirectionsLength = 0;
        int8[2][8] memory dirs = [
            [int8(-1), int8(0)], // W
            [int8(-1), int8(1)], // SW
            [int8(0), int8(1)], // S
            [int8(1), int8(1)], // SE
            [int8(1), int8(0)], // E
            [int8(1), int8(-1)], // NE
            [int8(0), int8(-1)], // N
            [int8(-1), int8(-1)] // NW
        ];
        int8 focusedRowPos;
        int8 focusedColPos;
        int8[2] memory dir;
        uint8 testSquare;

        for (uint8 i = 0; i < 8; i++) {
            dir = dirs[i];
            focusedColPos = int8(col) + dir[0];
            focusedRowPos = int8(row) + dir[1];

            // if tile is off the board it is not a valid move
            if (!(focusedRowPos > 7 || focusedRowPos < 0 || focusedColPos > 7 || focusedColPos < 0)) {
                testSquare = returnTile(game.board, uint8(focusedColPos), uint8(focusedRowPos));

                // if the surrounding tile is current color or no color it can"t be part of a capture
                if (testSquare != game.currentPlayer) {
                    if (testSquare != EMPTY) {
                        possibleDirections[possibleDirectionsLength] = dir;
                        possibleDirectionsLength++;
                    }
                }
            }
        }
        return (possibleDirections, possibleDirectionsLength);
    }

    function traverseDirection (Game memory game, int8[2] memory dir, uint8 col, uint8 row) internal pure returns(bytes28, uint8) {
        bytes28 potentialFlips;
        uint8 potentialFlipsLength = 0;
        uint8 opponentColor;
        if (game.currentPlayer == BLACK) {
            opponentColor = WHITE;
        } else {
            opponentColor = BLACK;
        }

        // take one step at a time in this direction
        // ignoring the first step look for the same color as your tile
        bool skip = false;
        int8 testCol;
        int8 testRow;
        uint8 tile;
        for (uint8 j = 1; j < 9; j++) {
            if (!skip) {
                testCol = (int8(j) * dir[0]) + int8(col);
                testRow = (int8(j) * dir[1]) + int8(row);
                // ran off the board before hitting your own tile
                if (testCol > 7 || testCol < 0 || testRow > 7 || testRow < 0) {
                    delete potentialFlips;
                    potentialFlipsLength = 0;
                    skip = true;
                } else{

                    tile = returnTile(game.board, uint8(testCol), uint8(testRow));

                    if (tile == opponentColor) {
                        // if tile is opposite color it could be flipped, so add to potential flip array
                        (potentialFlips, potentialFlipsLength) = addMove(potentialFlips, potentialFlipsLength, uint8(testCol), uint8(testRow));
                    } else if (tile == game.currentPlayer && j > 1) {
                        // hit current players tile which means capture is complete
                        skip = true;
                    } else {
                        // either hit current players own color before hitting an opponent"s
                        // or hit an empty space
                        delete potentialFlips;
                        delete potentialFlipsLength;
                        skip = true;
                    }
                }
            }
        }
        return (potentialFlips, potentialFlipsLength);
    }

    function isComplete (Game memory game) internal pure returns (Game memory) {
        if (game.moveKey == 60) {
            // game.msg = "good game";
            game.complete = true;
            return game;
        } else {
            uint8 i;
            bool validMovesRemains = false;
            bytes16 board = game.board;
            for (i = 0; i < 64 && !validMovesRemains; i++) {
                uint8[2] memory move = [((i - (i % 8)) / 8), (i % 8)];
                uint8 tile = returnTile(game.board, move[0], move[1]);
                if (tile == EMPTY) {
                    game.currentPlayer = BLACK;
                    game.error = false;
                    game.board = board;
                    game = makeMove(game, move[0], move[1]);
                    if (!game.error) {
                        validMovesRemains = true;
                    }
                    game.currentPlayer = WHITE;
                    game.error = false;
                    game.board = board;
                    game = makeMove(game, move[0], move[1]);
                    if (!game.error) {
                        validMovesRemains = true;
                    }
                }
            }
            if (validMovesRemains) {
                game.error = true;
                // game.msg = "Invalid Game (moves still available)";
            } else {
                // game.msg = "good game";
                game.complete = true;
                game.error = false;
            }
        }
        return game;
    }

    function isSymmetrical (Game memory game) internal pure returns (Game memory) {
        bool RotSym = true;
        bool Y0Sym = true;
        bool X0Sym = true;
        bool XYSym = true;
        bool XnYSym = true;
        for (uint8 i = 0; i < 8 && (RotSym || Y0Sym || X0Sym || XYSym || XnYSym); i++) {
            for (uint8 j = 0; j < 8 && (RotSym || Y0Sym || X0Sym || XYSym || XnYSym); j++) {

                // rotational symmetry
                if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - i), (7 - j))) {
                    RotSym = false;
                }
                // symmetry on y = 0
                if (returnBytes(game.board, i, j) != returnBytes(game.board, i, (7 - j))) {
                    Y0Sym = false;
                }
                // symmetry on x = 0
                if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - i), j)) {
                    X0Sym = false;
                }
                // symmetry on x = y
                if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - j), (7 - i))) {
                    XYSym = false;
                }
                // symmetry on x = -y
                if (returnBytes(game.board, i, j) != returnBytes(game.board, j, i)) {
                    XnYSym = false;
                }
            }
        }
        if (RotSym || Y0Sym || X0Sym || XYSym || XnYSym) {
            game.symmetrical = true;
            game.RotSym = RotSym;
            game.Y0Sym = Y0Sym;
            game.X0Sym = X0Sym;
            game.XYSym = XYSym;
            game.XnYSym = XnYSym;
        }
        return game;
    }



    // Utilities

    function returnSymmetricals (bool RotSym, bool Y0Sym, bool X0Sym, bool XYSym, bool XnYSym) public pure returns (uint256) {
        uint256 symmetries = 0;
        if(RotSym) symmetries |= 16;
        if(Y0Sym) symmetries |= 8;
        if(X0Sym) symmetries |= 4;
        if(XYSym) symmetries |= 2;
        if(XnYSym) symmetries |= 1;
        return symmetries;
    }


    function returnBytes (bytes16 board, uint8 col, uint8 row) internal pure returns (bytes16) {
        uint128 push = posToPush(col, row);
        return (board >> push) & bytes16(uint128(3));
    }

    function turnTile (bytes16 board, uint8 color, uint8 col, uint8 row) internal pure returns (bytes16){
        if (col > 7) revert("can't turn tile outside of board col");
        if (row > 7) revert("can't turn tile outside of board row");
        uint128 push = posToPush(col, row);
        bytes16 mask = bytes16(uint128(3)) << push;// 0b00000011 (ones)

        board = ((board ^ mask) & board);

        return board | (bytes16(uint128(color)) << push);
    }

    function returnTile (bytes16 board, uint8 col, uint8 row) public pure returns (uint8){
        uint128 push = posToPush(col, row);
        bytes16 tile = (board >> push ) & bytes16(uint128(3));
        return uint8(uint128(tile)); // returns 2
    }

    function posToPush (uint8 col, uint8 row) internal pure returns (uint128){
        return uint128(((64) - ((8 * col) + row + 1)) * 2);
    }

    function readMove (bytes28 moveSequence, uint8 moveKey, uint8 movesLength) public pure returns(uint8) {
        bytes28 mask = bytes28(uint224(127));
        uint8 push = (movesLength * 7) - (moveKey * 7) - 7;
        return uint8(uint224((moveSequence >> push) & mask));
    }

    function addMove (bytes28 moveSequence, uint8 movesLength, uint8 col, uint8 row) internal pure returns (bytes28, uint8) {
        uint256 foo = col + (row * 8) + 64;
        bytes28 move = bytes28(uint224(foo));
        moveSequence = moveSequence << 7;
        moveSequence = moveSequence | move;
        movesLength++;
        return (moveSequence, movesLength);
    }

    function validMove (uint8 move) internal pure returns(bool) {
        return move >= 64;
    }

    function convertMove (uint8 move) public pure returns(uint8, uint8) {
        move = move - 64;
        uint8 col = move % 8;
        uint8 row = (move - col) / 8;
        return (col, row);
    }

}

// File: contracts/v5/IClovers.sol

pragma solidity ^0.5.9;

contract IClovers {
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function setCloverMoves(uint256 _tokenId, bytes28[2] memory moves) public;
    function getCloverMoves(uint256 _tokenId) public view returns (bytes28[2] memory);
    function getAllSymmetries() public view returns (uint256, uint256, uint256, uint256, uint256, uint256);
    function exists(uint256 _tokenId) public view returns (bool _exists);
    function getBlockMinted(uint256 _tokenId) public view returns (uint256);
    function setBlockMinted(uint256 _tokenId, uint256 value) public;
    function setKeep(uint256 _tokenId, bool value) public;
    function setSymmetries(uint256 _tokenId, uint256 _symmetries) public;
    function setReward(uint256 _tokenId, uint256 _amount) public;
    function mint (address _to, uint256 _tokenId) public;
    function getReward(uint256 _tokenId) public view returns (uint256);
    function getKeep(uint256 _tokenId) public view returns (bool);
    function transferFrom(address _from, address _to, uint256 _tokenId) public;
    function moveEth(address _to, uint256 _amount) public;
    function getSymmetries(uint256 _tokenId) public view returns (uint256);
    function deleteClover(uint256 _tokenId) public;
    function setAllSymmetries(uint256 _totalSymmetries, uint256 RotSym, uint256 Y0Sym, uint256 X0Sym, uint256 XYSym, uint256 XnYSym) public;
}

// File: contracts/v5/IClubToken.sol

pragma solidity ^0.5.9;

contract IClubToken {
    function balanceOf(address _owner) public view returns (uint256);
    function burn(address _burner, uint256 _value) public;
    function mint(address _to, uint256 _amount) public returns (bool);
}

// File: contracts/v5/IClubTokenController.sol

pragma solidity ^0.5.9;

contract IClubTokenController {
    function buy(address buyer) public payable returns(bool);
}

// File: contracts/v5/ISimpleCloversMarket.sol

pragma solidity ^0.5.9;

contract ISimpleCloversMarket {
    function sell(uint256 _tokenId, uint256 price) public;
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

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

pragma solidity ^0.5.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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/cryptography/ECDSA.sol

pragma solidity ^0.5.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * (.note) This call _does not revert_ if the signature is invalid, or
     * if the signer is otherwise unable to be retrieved. In those scenarios,
     * the zero address is returned.
     *
     * (.warning) `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise)
     * be too long), and then calling `toEthSignedMessageHash` on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            return (address(0));
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return address(0);
        }

        if (v != 27 && v != 28) {
            return address(0);
        }

        // If the signature is valid (and not malleable), return the signer address
        return ecrecover(hash, v, r, s);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign)
     * JSON-RPC method.
     *
     * See `recover`.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

// File: contracts/v5/CloversController.sol

pragma solidity ^0.5.9;

/**
 * The CloversController is a replaceable endpoint for minting and unminting Clovers.sol and ClubToken.sol
 */









contract CloversController is Ownable {
    event cloverCommitted(bytes32 movesHash, address owner);
    event cloverClaimed(uint256 tokenId, bytes28[2] moves, address sender, address recepient, uint reward, uint256 symmetries, bool keep);
    event cloverChallenged(uint256 tokenId, bytes28[2] moves, address owner, address challenger);

    using SafeMath for uint256;
    using ECDSA for bytes32;

    bool public paused;
    address public oracle;
    IClovers public clovers;
    IClubToken public clubToken;
    IClubTokenController public clubTokenController;
    ISimpleCloversMarket public simpleCloversMarket;
    // Reversi public reversi;

    uint256 public gasLastUpdated_fastGasPrice_averageGasPrice_safeLowGasPrice;
    uint256 public gasBlockMargin = 240; // ~1 hour at 15 second blocks

    uint256 public basePrice;
    uint256 public priceMultiplier;
    uint256 public payMultiplier;

    mapping(bytes32=>address) public commits;

    modifier notPaused() {
        require(!paused, "Must not be paused");
        _;
    }

    constructor(
        IClovers _clovers,
        IClubToken _clubToken,
        IClubTokenController _clubTokenController
        // Reversi _reversi
    ) public {
        clovers = _clovers;
        clubToken = _clubToken;
        clubTokenController = _clubTokenController;
        // reversi = _reversi;
        paused = true;
    }

    function getMovesHash(bytes28[2] memory moves) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(moves));
    }

    function getMovesHashWithRecepient(bytes32 movesHash, address recepient) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(movesHash, recepient));
    }

    /**
    * @dev Checks whether the game is valid.
    * @param moves The moves needed to play validate the game.
    * @return A boolean representing whether or not the game is valid.
    */
    function isValid(bytes28[2] memory moves) public pure returns (bool) {
        Reversi.Game memory game = Reversi.playGame(moves);
        return isValidGame(game.error, game.complete);
    }

    /**
    * @dev Checks whether the game is valid.
    * @param error The pre-played game error
    * @param complete The pre-played game complete boolean
    * @return A boolean representing whether or not the game is valid.
    */
    function isValidGame(bool error, bool complete) public pure returns (bool) {
        if (error || !complete) {
            return false;
        } else {
            return true;
        }
    }

    function getGame (bytes28[2] memory moves) public pure returns (bool error, bool complete, bool symmetrical, bytes16 board, uint8 currentPlayer, uint8 moveKey) {
        // return Reversi.getGame(moves);
        Reversi.Game memory game = Reversi.playGame(moves);
        return (
            game.error,
            game.complete,
            game.symmetrical,
            game.board,
            game.currentPlayer,
            game.moveKey
            // game.msg
        );
    }
    /**
    * @dev Calculates the reward of the board.
    * @param symmetries symmetries saved as a uint256 value like 00010101 where bits represent symmetry types.
    * @return A uint256 representing the reward that would be returned for claiming the board.
    */
    function calculateReward(uint256 symmetries) public view returns (uint256) {
        uint256 Symmetricals;
        uint256 RotSym;
        uint256 Y0Sym;
        uint256 X0Sym;
        uint256 XYSym;
        uint256 XnYSym;
        (Symmetricals,
        RotSym,
        Y0Sym,
        X0Sym,
        XYSym,
        XnYSym) = clovers.getAllSymmetries();
        uint256 base = 0;
        if (symmetries >> 4 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(RotSym + 1));
        if (symmetries >> 3 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(Y0Sym + 1));
        if (symmetries >> 2 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(X0Sym + 1));
        if (symmetries >> 1 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(XYSym + 1));
        if (symmetries & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(XnYSym + 1));
        return base;
    }

    function getPrice(uint256 symmetries) public view returns(uint256) {
        return basePrice.add(calculateReward(symmetries));
    }

    // In order to prevent commit reveal griefing the first commit is a combined hash of the moves and the recepient.
    // In order to use the same commit mapping, we mark this hash simply as address(1) so it is no longer the equivalent of address(0)
    function claimCloverSecurelyPartOne(bytes32 movesHashWithRecepient) public {
        commits[movesHashWithRecepient] = address(1);
        commits[keccak256(abi.encodePacked(msg.sender))] = address(block.number);
    }

    // Once a commit has been made to guarantee the move hash is associated with the recepient we can make a commit on the hash of the moves themselves
    // If we were to make a claim on the moves in plaintext, the transaction could be front run on the claimCloverWithVerification or the claimCloverWithSignature
    function claimCloverSecurelyPartTwo(bytes32 movesHash) public {
        require(uint256(commits[keccak256(abi.encodePacked(msg.sender))]) < block.number, "Can't combine step1 with step2");
        bytes32 commitHash = getMovesHashWithRecepient(movesHash, msg.sender);
        address commitOfMovesHashWithRecepient = commits[commitHash];
        require(
            address(commitOfMovesHashWithRecepient) == address(1),
            "Invalid commitOfMovesHashWithRecepient, please do claimCloverSecurelyPartOne"
        );
        delete(commits[commitHash]);
        commits[movesHash] = msg.sender;
    }

    function claimCloverWithVerification(bytes28[2] memory moves, bool keep) public payable returns (bool) {
        bytes32 movesHash = getMovesHash(moves);
        address committedRecepient = commits[movesHash];
        require(committedRecepient == address(0) || committedRecepient == msg.sender, "Invalid committedRecepient");

        Reversi.Game memory game = Reversi.playGame(moves);
        require(isValidGame(game.error, game.complete), "Invalid game");
        uint256 tokenId = convertBytes16ToUint(game.board);
        require(!clovers.exists(tokenId), "Clover already exists");

        uint256 symmetries = Reversi.returnSymmetricals(game.RotSym, game.Y0Sym, game.X0Sym, game.XYSym, game.XnYSym);
        require(_claimClover(tokenId, moves, symmetries, msg.sender, keep), "Claim must succeed");
        delete(commits[movesHash]);
        return true;
    }



    /**
    * @dev Claim the Clover without a commit or reveal. Payable so you can buy tokens if needed.
    * @param tokenId The board that results from the moves.
    * @param moves The moves that make up the Clover reversi game.
    * @param symmetries symmetries saved as a uint256 value like 00010101 where bits represent symmetry
    * @param keep symmetries saved as a uint256 value like 00010101 where bits represent symmetry
    * @param signature symmetries saved as a uint256 value like 00010101 where bits represent symmetry
    * types.
    * @return A boolean representing whether or not the claim was successful.
    */
    function claimCloverWithSignature(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, bool keep, bytes memory signature) public payable notPaused returns (bool) {
        address committedRecepient = commits[getMovesHash(moves)];
        require(committedRecepient == address(0) || committedRecepient == msg.sender, "Invalid committedRecepient");
        require(!clovers.exists(tokenId), "Clover already exists");
        require(checkSignature(tokenId, moves, symmetries, keep, msg.sender, signature, oracle), "Invalid Signature");
        require(_claimClover(tokenId, moves, symmetries, msg.sender, keep), "Claim must succeed");
        return true;
    }

    function _claimClover(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, address recepient, bool keep) internal returns (bool) {
        clovers.setCloverMoves(tokenId, moves);
        clovers.setKeep(tokenId, keep);
        uint256 reward;
        if (symmetries > 0) {
            clovers.setSymmetries(tokenId, symmetries);
            reward = calculateReward(symmetries);
            clovers.setReward(tokenId, reward);
            addSymmetries(symmetries);
        }
        uint256 price = basePrice.add(reward);
        if (keep && price > 0) {
            // If the user decides to keep the Clover, they must
            // pay for it in club tokens according to the reward price.
            if (clubToken.balanceOf(msg.sender) < price) {
                clubTokenController.buy.value(msg.value)(msg.sender);
            }
            clubToken.burn(msg.sender, price);
        }

        if (keep) {
            // If the user decided to keep the Clover
            clovers.mint(recepient, tokenId);
        } else {
            // If the user decided not to keep the Clover, they will
            // receive the reward price in club tokens, and the clover will
            // go for sale by the contract.
            clovers.mint(address(clovers), tokenId);
            simpleCloversMarket.sell(tokenId, basePrice.add(reward.mul(priceMultiplier)));
            if (reward > 0) {
                require(clubToken.mint(recepient, reward), "mint must succeed");
            }
        }
        emit cloverClaimed(tokenId, moves, msg.sender, recepient, reward, symmetries, keep);
        return true;
    }


    /**
    * @dev Convert a bytes16 board into a uint256.
    * @param _board The board being converted.
    * @return number the uint256 being converted.
    */
    function convertBytes16ToUint(bytes16 _board) public pure returns(uint256 number) {
        for(uint i=0;i<_board.length;i++){
            number = number + uint(uint8(_board[i]))*(2**(8*(_board.length-(i+1))));
        }
    }


    /**
    * @dev Challenge a Clover for being invalid.
    * @param tokenId The board being challenged.
    * @return A boolean representing whether or not the challenge was successful.
    */
    function challengeClover(uint256 tokenId) public returns (bool) {
        require(clovers.exists(tokenId), "Clover must exist to be challenged");
        bool valid = true;
        bytes28[2] memory moves = clovers.getCloverMoves(tokenId);
        address payable _owner = address(uint160(owner()));
        if (msg.sender != _owner && msg.sender != oracle) {
            Reversi.Game memory game = Reversi.playGame(moves);
            if(convertBytes16ToUint(game.board) != tokenId) {
                valid = false;
            }
            if(valid && isValidGame(game.error, game.complete)) {
                uint256 symmetries = clovers.getSymmetries(tokenId);
                valid = (symmetries >> 4 & 1) > 0 == game.RotSym ? valid : false;
                valid = (symmetries >> 3 & 1) > 0 == game.Y0Sym ? valid : false;
                valid = (symmetries >> 2 & 1) > 0 == game.X0Sym ? valid : false;
                valid = (symmetries >> 1 & 1) > 0 == game.XYSym ? valid : false;
                valid = (symmetries & 1) > 0 == game.XnYSym ? valid : false;
            } else {
                valid = false;
            }
            require(!valid, "Must be invalid to challenge");
        }

        removeSymmetries(tokenId);
        address committer = clovers.ownerOf(tokenId);
        emit cloverChallenged(tokenId, moves, committer, msg.sender);
        clovers.deleteClover(tokenId);
        return true;
    }

    function updateSalePrice(uint256 tokenId, uint256 _price) public onlyOwner {
        simpleCloversMarket.sell(tokenId, _price);
    }

    /**
    * @dev Moves clovers without explicit allow permission for use by simpleCloversMarket
    * in order to avoid double transaction (allow, transferFrom)
    * @param _from The current owner of the Clover
    * @param _to The future owner of the Clover
    * @param tokenId The Clover
    */
    function transferFrom(address _from, address _to, uint256 tokenId) public {
        require(msg.sender == address(simpleCloversMarket), "transferFrom can only be done by simpleCloversMarket");
        clovers.transferFrom(_from, _to, tokenId);
    }

    /**
    * @dev Updates pause boolean.
    * @param _paused The new puased boolean.
    */
    function updatePaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    /**
    * @dev Updates oracle Address.
    * @param _oracle The new oracle Address.
    */
    function updateOracle(address _oracle) public onlyOwner {
        oracle = _oracle;
    }

    /**
    * @dev Updates simpleCloversMarket Address.
    * @param _simpleCloversMarket The new simpleCloversMarket address.
    */
    function updateSimpleCloversMarket(ISimpleCloversMarket _simpleCloversMarket) public onlyOwner {
        simpleCloversMarket = _simpleCloversMarket;
    }

    /**
    * @dev Updates clubTokenController Address.
    * @param _clubTokenController The new clubTokenController address.
    */
    function updateClubTokenController(IClubTokenController _clubTokenController) public onlyOwner {
        clubTokenController = _clubTokenController;
    }
    /**
    * @dev Updates the pay multiplier, used to calculate token reward.
    * @param _payMultiplier The uint256 value of pay multiplier.
    */
    function updatePayMultipier(uint256 _payMultiplier) public onlyOwner {
        payMultiplier = _payMultiplier;
    }
    /**
    * @dev Updates the price multiplier, used to calculate the clover price (multiplied by the original reward).
    * @param _priceMultiplier The uint256 value of the price multiplier.
    */
    function updatePriceMultipier(uint256 _priceMultiplier) public onlyOwner {
        priceMultiplier = _priceMultiplier;
    }
    /**
    * @dev Updates the base price, used to calculate the clover cost.
    * @param _basePrice The uint256 value of the base price.
    */
    function updateBasePrice(uint256 _basePrice) public onlyOwner {
        basePrice = _basePrice;
    }

    /**
    * @dev Adds new tallys of the totals numbers of clover symmetries.
    * @param symmetries The symmetries which needs to be added.
    */
    function addSymmetries(uint256 symmetries) private {
        uint256 Symmetricals;
        uint256 RotSym;
        uint256 Y0Sym;
        uint256 X0Sym;
        uint256 XYSym;
        uint256 XnYSym;
        (Symmetricals,
        RotSym,
        Y0Sym,
        X0Sym,
        XYSym,
        XnYSym) = clovers.getAllSymmetries();
        Symmetricals = Symmetricals.add(symmetries > 0 ? 1 : 0);
        RotSym = RotSym.add(uint256(symmetries >> 4 & 1));
        Y0Sym = Y0Sym.add(uint256(symmetries >> 3 & 1));
        X0Sym = X0Sym.add(uint256(symmetries >> 2 & 1));
        XYSym = XYSym.add(uint256(symmetries >> 1 & 1));
        XnYSym = XnYSym.add(uint256(symmetries & 1));
        clovers.setAllSymmetries(Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym);
    }
    /**
    * @dev Remove false tallys of the totals numbers of clover symmetries.
    * @param tokenId The token which needs to be examined.
    */
    function removeSymmetries(uint256 tokenId) private {
        uint256 Symmetricals;
        uint256 RotSym;
        uint256 Y0Sym;
        uint256 X0Sym;
        uint256 XYSym;
        uint256 XnYSym;
        (Symmetricals,
        RotSym,
        Y0Sym,
        X0Sym,
        XYSym,
        XnYSym) = clovers.getAllSymmetries();
        uint256 symmetries = clovers.getSymmetries(tokenId);
        Symmetricals = Symmetricals.sub(symmetries > 0 ? 1 : 0);
        RotSym = RotSym.sub(uint256(symmetries >> 4 & 1));
        Y0Sym = Y0Sym.sub(uint256(symmetries >> 3 & 1));
        X0Sym = X0Sym.sub(uint256(symmetries >> 2 & 1));
        XYSym = XYSym.sub(uint256(symmetries >> 1 & 1));
        XnYSym = XnYSym.sub(uint256(symmetries & 1));
        clovers.setAllSymmetries(Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym);
    }

    function checkSignature(
        uint256 tokenId,
        bytes28[2] memory moves,
        uint256 symmetries,
        bool keep,
        address recepient,
        bytes memory signature,
        address signer
    ) public pure returns (bool) {
        bytes32 hash = toEthSignedMessageHash(getHash(tokenId, moves, symmetries, keep, recepient));
        address result = recover(hash, signature);
        return (result != address(0) && result == signer);
    }

    function getHash(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, bool keep, address recepient) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(tokenId, moves, symmetries, keep, recepient));
    }
    function recover(bytes32 hash, bytes memory signature) public pure returns (address) {
        return hash.recover(signature);
    }
    function toEthSignedMessageHash(bytes32 hash) public pure returns (bytes32) {
        return hash.toEthSignedMessageHash();
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_paused","type":"bool"}],"name":"updatePaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"getGame","outputs":[{"name":"error","type":"bool"},{"name":"complete","type":"bool"},{"name":"symmetrical","type":"bool"},{"name":"board","type":"bytes16"},{"name":"currentPlayer","type":"uint8"},{"name":"moveKey","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"clovers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"signature","type":"bytes"}],"name":"recover","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"moves","type":"bytes28[2]"},{"name":"keep","type":"bool"}],"name":"claimCloverWithVerification","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_oracle","type":"address"}],"name":"updateOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"getMovesHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"error","type":"bool"},{"name":"complete","type":"bool"}],"name":"isValidGame","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"isValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"payMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"commits","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"updateSalePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"recepient","type":"address"}],"name":"getHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"movesHashWithRecepient","type":"bytes32"}],"name":"claimCloverSecurelyPartOne","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"recepient","type":"address"},{"name":"signature","type":"bytes"},{"name":"signer","type":"address"}],"name":"checkSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"challengeClover","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasLastUpdated_fastGasPrice_averageGasPrice_safeLowGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_payMultiplier","type":"uint256"}],"name":"updatePayMultipier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"}],"name":"toEthSignedMessageHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_clubTokenController","type":"address"}],"name":"updateClubTokenController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simpleCloversMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"signature","type":"bytes"}],"name":"claimCloverWithSignature","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gasBlockMargin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_board","type":"bytes16"}],"name":"convertBytes16ToUint","outputs":[{"name":"number","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_priceMultiplier","type":"uint256"}],"name":"updatePriceMultipier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"clubTokenController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"movesHash","type":"bytes32"}],"name":"claimCloverSecurelyPartTwo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_simpleCloversMarket","type":"address"}],"name":"updateSimpleCloversMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"symmetries","type":"uint256"}],"name":"calculateReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"clubToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"symmetries","type":"uint256"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"movesHash","type":"bytes32"},{"name":"recepient","type":"address"}],"name":"getMovesHashWithRecepient","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_basePrice","type":"uint256"}],"name":"updateBasePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_clovers","type":"address"},{"name":"_clubToken","type":"address"},{"name":"_clubTokenController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"movesHash","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"cloverCommitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"moves","type":"bytes28[2]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"recepient","type":"address"},{"indexed":false,"name":"reward","type":"uint256"},{"indexed":false,"name":"symmetries","type":"uint256"},{"indexed":false,"name":"keep","type":"bool"}],"name":"cloverClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"moves","type":"bytes28[2]"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"challenger","type":"address"}],"name":"cloverChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260f060075534801561001557600080fd5b5060405162004802380380620048028339818101604052606081101561003a57600080fd5b5080516020820151604092830151600080546001600160a01b031916331780825594519394929391926001600160a01b0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600480549190931691161790556000805460ff60a01b1916740100000000000000000000000000000000000000001790556146ff80620001036000396000f3fe6080604052600436106102d15760003560e01c80638a05aafa11610179578063a89b55da116100d6578063d50cb88b1161008a578063f1b4bce911610064578063f1b4bce914610c2d578063f2fde38b14610c66578063fd5baa8814610c99576102d1565b8063d50cb88b14610bd9578063d76bbd5214610bee578063e757223014610c03576102d1565b8063c7876ea4116100bb578063c7876ea414610b67578063d010ed7014610b7c578063d2d7231f14610baf576102d1565b8063a89b55da14610b28578063c434968414610b3d576102d1565b8063975e4b2a1161012d578063a069870611610112578063a069870614610aac578063a4a83ca614610ac1578063a7e901b014610afe576102d1565b8063975e4b2a146109af5780639a0d981e146109c4576102d1565b80638f32d59b1161015e5780638f32d59b1461093d578063918a15cf146109525780639564e1801461097c576102d1565b80638a05aafa146108fe5780638da5cb5b14610928576102d1565b80633afcba96116102325780636e1258e7116101e65780637b7db9fa116101c05780637b7db9fa146108aa5780637cce4656146108d45780637dc0d1d0146108e9576102d1565b80636e1258e71461075b5780636e88f21f14610785578063715018a614610895576102d1565b80634896672e116102175780634896672e146106a0578063580bdd8c146106d05780635c975abb14610746576102d1565b80633afcba96146106615780634788578114610676576102d1565b80631cb44dfc11610289578063225c35b21161026e578063225c35b21461059257806323b872dd146105c6578063271eff9414610609576102d1565b80631cb44dfc146104f55780631ce5145614610528576102d1565b80630d576bfa116102ba5780630d576bfa146103a957806319045a25146103da57806319faa73014610494576102d1565b806308cdc2a8146102d657806308d27c7f14610304575b600080fd5b3480156102e257600080fd5b50610302600480360360208110156102f957600080fd5b50351515610cc3565b005b34801561031057600080fd5b5061035c6004803603604081101561032757600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610d669350505050565b6040805196151587529415156020870152921515858501526fffffffffffffffffffffffffffffffff19909116606085015260ff90811660808501521660a0830152519081900360c00190f35b3480156103b557600080fd5b506103be610db4565b604080516001600160a01b039092168252519081900360200190f35b3480156103e657600080fd5b506103be600480360360408110156103fd57600080fd5b8135919081019060408101602082013564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc3945050505050565b6104e1600480360360608110156104aa57600080fd5b6040805180820182529183019291818301918390600290839083908082843760009201919091525091945050503515159050610dde565b604080519115158252519081900360200190f35b34801561050157600080fd5b506103026004803603602081101561051857600080fd5b50356001600160a01b031661114a565b34801561053457600080fd5b506105806004803603604081101561054b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506111dd9350505050565b60408051918252519081900360200190f35b34801561059e57600080fd5b506104e1600480360360408110156105b557600080fd5b508035151590602001351515611233565b3480156105d257600080fd5b50610302600480360360608110156105e957600080fd5b506001600160a01b03813581169160208101359091169060400135611254565b34801561061557600080fd5b506104e16004803603604081101561062c57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506113309350505050565b34801561066d57600080fd5b5061058061135e565b34801561068257600080fd5b506103be6004803603602081101561069957600080fd5b5035611364565b3480156106ac57600080fd5b50610302600480360360408110156106c357600080fd5b508035906020013561137f565b3480156106dc57600080fd5b50610580600480360360c08110156106f357600080fd5b6040805180820182528335939283019291606083019190602084019060029083908390808284376000920191909152509194505081359250506020810135151590604001356001600160a01b0316611461565b34801561075257600080fd5b506104e16114f6565b34801561076757600080fd5b506103026004803603602081101561077e57600080fd5b5035611517565b34801561079157600080fd5b506104e160048036036101008110156107a957600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515946001600160a01b0360408201351694509192509060808101906060013564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184600183028401116401000000008311171561084957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506115929050565b3480156108a157600080fd5b506103026115f1565b3480156108b657600080fd5b506104e1600480360360208110156108cd57600080fd5b50356116ac565b3480156108e057600080fd5b50610580611c00565b3480156108f557600080fd5b506103be611c06565b34801561090a57600080fd5b506103026004803603602081101561092157600080fd5b5035611c15565b34801561093457600080fd5b506103be611c73565b34801561094957600080fd5b506104e1611c82565b34801561095e57600080fd5b506105806004803603602081101561097557600080fd5b5035611c93565b34801561098857600080fd5b506103026004803603602081101561099f57600080fd5b50356001600160a01b0316611c9e565b3480156109bb57600080fd5b506103be611d31565b6104e1600480360360c08110156109da57600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515949193509150606081019060400135640100000000811115610a3757600080fd5b820183602082011115610a4957600080fd5b80359060200191846001830284011164010000000083111715610a6b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d40945050505050565b348015610ab857600080fd5b50610580612005565b348015610acd57600080fd5b5061058060048036036020811015610ae457600080fd5b50356fffffffffffffffffffffffffffffffff191661200b565b348015610b0a57600080fd5b5061030260048036036020811015610b2157600080fd5b5035612049565b348015610b3457600080fd5b506103be6120a7565b348015610b4957600080fd5b5061030260048036036020811015610b6057600080fd5b50356120b6565b348015610b7357600080fd5b506105806121fa565b348015610b8857600080fd5b5061030260048036036020811015610b9f57600080fd5b50356001600160a01b0316612200565b348015610bbb57600080fd5b5061058060048036036020811015610bd257600080fd5b5035612293565b348015610be557600080fd5b5061058061246a565b348015610bfa57600080fd5b506103be612470565b348015610c0f57600080fd5b5061058060048036036020811015610c2657600080fd5b503561247f565b348015610c3957600080fd5b5061058060048036036040811015610c5057600080fd5b50803590602001356001600160a01b031661249c565b348015610c7257600080fd5b5061030260048036036020811015610c8957600080fd5b50356001600160a01b03166124ee565b348015610ca557600080fd5b5061030260048036036020811015610cbc57600080fd5b5035612553565b610ccb611c82565b610d1c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080600080600080610d776144d1565b610d80886125b1565b80516020820151604083015161010084015161016085015161018090950151939d929c50909a509850919650945092505050565b6002546001600160a01b031681565b6000610dd5838363ffffffff6127d916565b90505b92915050565b600080610dea846111dd565b6000818152600b60205260409020549091506001600160a01b0316801580610e1a57506001600160a01b03811633145b610e6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b610e736144d1565b610e7c866125b1565b9050610e9081600001518260200151611233565b610ee1576040805162461bcd60e51b815260206004820152600c60248201527f496e76616c69642067616d650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610ef182610100015161200b565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691634f558e7991602480820192602092909190829003018186803b158015610f5957600080fd5b505afa158015610f6d573d6000803e3d6000fd5b505050506040513d6020811015610f8357600080fd5b505115610fd7576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b6060820151608083015160a084015160c085015160e0860151604080517fa250cc3400000000000000000000000000000000000000000000000000000000815295151560048701529315156024860152911515604485015215156064840152151560848301525160009173b03b3533420c154acb4298614566b391269ace689163a250cc349160a480820192602092909190829003018186803b15801561107d57600080fd5b505af4158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b505190506110b8828983338b612903565b611109576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b505050600091825250600b6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550600192915050565b611152611c82565b6111a3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000816040516020018082600260200280838360005b8381101561120b5781810151838201526020016111f3565b505050509050019150506040516020818303038152906040528051906020012090505b919050565b6000828061123f575081155b1561124c57506000610dd8565b506001610dd8565b6005546001600160a01b0316331461129d5760405162461bcd60e51b81526004018080602001828103825260348152602001806146526034913960400191505060405180910390fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b50505050505050565b600061133a6144d1565b611343836125b1565b905061135781600001518260200151611233565b9392505050565b600a5481565b600b602052600090815260409020546001600160a01b031681565b611387611c82565b6113d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600554604080517fd79875eb000000000000000000000000000000000000000000000000000000008152600481018590526024810184905290516001600160a01b039092169163d79875eb9160448082019260009290919082900301818387803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050505050565b600085858585856040516020018086815260200185600260200280838360005b83811015611499578181015183820152602001611481565b50505050905001848152602001831515151560f81b8152600101826001600160a01b03166001600160a01b031660601b81526014019550505050505060405160208183030381529060405280519060200120905095945050505050565b60005474010000000000000000000000000000000000000000900460ff1681565b6000908152600b60208181526040808420805460017fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915581513360601b81850152825160148183030181526034909101835280519084012085529290915290912080549091166001600160a01b034316179055565b6000806115aa6115a58a8a8a8a8a611461565b611c93565b905060006115b88286610dc3565b90506001600160a01b038116158015906115e35750836001600160a01b0316816001600160a01b0316145b9a9950505050505050505050565b6115f9611c82565b61164a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290516000926001600160a01b031691634f558e79916024808301926020929190829003018186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d602081101561173b57600080fd5b50516117785760405162461bcd60e51b81526004018080602001828103825260228152602001806146306022913960400191505060405180910390fd5b600161178261454d565b600254604080517f62f9acf90000000000000000000000000000000000000000000000000000000081526004810187905281516001600160a01b03909316926362f9acf992602480840193919291829003018186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250604081101561181d57600080fd5b509050600061182a611c73565b9050336001600160a01b0382161480159061185057506001546001600160a01b03163314155b15611a3d5761185d6144d1565b611866836125b1565b90508561187782610100015161200b565b1461188157600093505b83801561189b575061189b81600001518260200151611233565b156119e357600254604080517fc53b4bf90000000000000000000000000000000000000000000000000000000081526004810189905290516000926001600160a01b03169163c53b4bf9916024808301926020929190829003018186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d602081101561192f57600080fd5b505160608301519091501515600482901c600116151514611951576000611953565b845b9450816080015115156000600383901c60011611151514611975576000611977565b845b94508160a0015115156000600283901c6001161115151461199957600061199b565b845b60c08301519095501515600182811c161515146119b95760006119bb565b845b94508160e001511515600082600116111515146119d95760006119db565b845b9450506119e8565b600093505b8315611a3b576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520696e76616c696420746f206368616c6c656e676500000000604482015290519081900360640190fd5b505b611a4685613070565b600254604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905290516000926001600160a01b031691636352211e916024808301926020929190829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b5051604080518881529192507f36b306723b6493a90002bbf27460db864a9ac8ce1af82ad1f0183f83c0cecc39918891869185913391906020820190859080838360005b83811015611b31578181015183820152602001611b19565b50505050905001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200194505050505060405180910390a1600254604080517f0e8310d60000000000000000000000000000000000000000000000000000000081526004810189905290516001600160a01b0390921691630e8310d69160248082019260009290919082900301818387803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b5060019998505050505050505050565b60065481565b6001546001600160a01b031681565b611c1d611c82565b611c6e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600a55565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6000610dd88261331c565b611ca6611c82565b611cf7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000805474010000000000000000000000000000000000000000900460ff1615611db1576040805162461bcd60e51b815260206004820152601260248201527f4d757374206e6f74206265207061757365640000000000000000000000000000604482015290519081900360640190fd5b6000600b6000611dc0886111dd565b81526020810191909152604001600020546001600160a01b03169050801580611df157506001600160a01b03811633145b611e42576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b600254604080517f4f558e79000000000000000000000000000000000000000000000000000000008152600481018a905290516001600160a01b0390921691634f558e7991602480820192602092909190829003018186803b158015611ea757600080fd5b505afa158015611ebb573d6000803e3d6000fd5b505050506040513d6020811015611ed157600080fd5b505115611f25576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b611f49878787873388600160009054906101000a90046001600160a01b0316611592565b611f9a576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b611fa78787873388612903565b611ff8576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b5060019695505050505050565b60075481565b6000805b60108110156120435780600101601060ff160360080260020a83826010811061203457fe5b1a02919091019060010161200f565b50919050565b612051611c82565b6120a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600955565b6004546001600160a01b031681565b604080513360601b60208083019190915282516014818403018152603490920183528151918101919091206000908152600b9091522054436001600160a01b039091161061214b576040805162461bcd60e51b815260206004820152601e60248201527f43616e277420636f6d62696e6520737465703120776974682073746570320000604482015290519081900360640190fd5b6000612157823361249c565b6000818152600b60205260409020549091506001600160a01b0316600181146121b15760405162461bcd60e51b815260040180806020018281038252604c8152602001806145e4604c913960600191505060405180910390fd5b506000908152600b602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091559282529020805490911633179055565b60085481565b612208611c82565b612259576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d60c081101561231657600080fd5b508051602082015160408301516060840151608085015160a090950151939a509198509650945090925090506000600160048a901c811614156123915761238e612381876001016123758a600101600a5461336d90919063ffffffff16565b9063ffffffff6133c616565b829063ffffffff61343016565b90505b600389901c600116600114156123c6576123c3612381866001016123758a600101600a5461336d90919063ffffffff16565b90505b600289901c600116600114156123fb576123f8612381856001016123758a600101600a5461336d90919063ffffffff16565b90505b600189811c8116141561242d5761242a612381846001016123758a600101600a5461336d90919063ffffffff16565b90505b886001166001141561245e5761245b612381836001016123758a600101600a5461336d90919063ffffffff16565b90505b98975050505050505050565b60095481565b6003546001600160a01b031681565b6000610dd861248d83612293565b6008549063ffffffff61343016565b6040805160208082019490945260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016828201528051808303603401815260549092019052805191012090565b6124f6611c82565b612547576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6125508161348a565b50565b61255b611c82565b6125ac576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600855565b6125b96144d1565b6125c16144d1565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009081166101208301526020808501519091166101408301526000610180830181905260026101a084018190526101c084015280835290820152600161016082015261262d613542565b6fffffffffffffffffffffffffffffffff1916610100820152600080808080805b603c8260ff1610801561265f575085155b156127af57602087610180015160ff161061267f57866101400151612686565b8661012001515b90506126a681602089610180015160ff168161269e57fe5b066020613566565b94506126b1856135c4565b90945092506126bf856135ff565b15955060ff82161580156126e557508360ff1660021415806126e557508260ff16600314155b156126f257600180885295505b85158015612703575060088460ff16105b8015612712575060088360ff16105b801561271c575060015b8015612726575060015b156127a45761273687858561360c565b6101808101805160010160ff1690528051909750156127a4576127588761387b565b6127a4576000875261016087015160ff166001141561277e576002610160880152612787565b60016101608801525b61279287858561360c565b8051909750156127a457600180885295505b60019091019061264e565b86516127cc576127be87613979565b96506127c987613ae9565b96505b5094979650505050505050565b600081516041146127ec57506000610dd8565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156128325760009350505050610dd8565b8060ff16601b1415801561284a57508060ff16601c14155b1561285b5760009350505050610dd8565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a08084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156128d0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600254604080517f0b628395000000000000000000000000000000000000000000000000000000008152600481018881526000936001600160a01b031692630b628395928a928a9290916024019083908083838b5b83811015612970578181015183820152602001612958565b5050505090500192505050600060405180830381600087803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b5050600254604080517f76e4a87f000000000000000000000000000000000000000000000000000000008152600481018b9052861515602482015290516001600160a01b0390921693506376e4a87f925060448082019260009290919082900301818387803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050600080851115612b5c57600254604080517fdc3f7758000000000000000000000000000000000000000000000000000000008152600481018a90526024810188905290516001600160a01b039092169163dc3f77589160448082019260009290919082900301818387803b158015612aaa57600080fd5b505af1158015612abe573d6000803e3d6000fd5b50505050612acb85612293565b600254604080517fa47bd496000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905290519293506001600160a01b039091169163a47bd4969160448082019260009290919082900301818387803b158015612b3b57600080fd5b505af1158015612b4f573d6000803e3d6000fd5b50505050612b5c85613d7a565b600854600090612b72908363ffffffff61343016565b9050838015612b815750600081115b15612d3757600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d6020811015612c1357600080fd5b50511015612cb25760048054604080517ff088d5470000000000000000000000000000000000000000000000000000000081523393810193909352516001600160a01b039091169163f088d54791349160248082019260209290919082900301818588803b158015612c8457600080fd5b505af1158015612c98573d6000803e3d6000fd5b50505050506040513d6020811015612caf57600080fd5b50505b600354604080517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015612d1e57600080fd5b505af1158015612d32573d6000803e3d6000fd5b505050505b8315612dc857600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015612dab57600080fd5b505af1158015612dbf573d6000803e3d6000fd5b50505050612fc6565b600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301819052602483018b9052905190916340c10f1991604480830192600092919082900301818387803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b50506005546009546001600160a01b03909116925063d79875eb91508a90612e7c9061248d90879063ffffffff61336d16565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b505050506000821115612fc657600354604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015612f4957600080fd5b505af1158015612f5d573d6000803e3d6000fd5b505050506040513d6020811015612f7357600080fd5b5051612fc6576040805162461bcd60e51b815260206004820152601160248201527f6d696e74206d7573742073756363656564000000000000000000000000000000604482015290519081900360640190fd5b7fbffd4880cee44a71d4266cf8dcf3179608df035c1883808a2370a9cfd180f6ed88883388868b8a6040518088815260200187600260200280838360005b8381101561301c578181015183820152602001613004565b5050506001600160a01b03998a16939091019283525050949095166020850152604080850193909352606084019190915215156080830152519081900360a0019350915050a1506001979650505050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156130c757600080fd5b505afa1580156130db573d6000803e3d6000fd5b505050506040513d60c08110156130f157600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809650819750829850839950849a50859b505050505050506000600260009054906101000a90046001600160a01b03166001600160a01b031663c53b4bf9896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156131a757600080fd5b505afa1580156131bb573d6000803e3d6000fd5b505050506040513d60208110156131d157600080fd5b505190506131f7816131e45760006131e7565b60015b889060ff1663ffffffff613f6d16565b9650613210866001600484901c1663ffffffff613f6d16565b9550613229856001600384901c1663ffffffff613f6d16565b9450613242846001600284901c1663ffffffff613f6d16565b935061325983600183811c1663ffffffff613f6d16565b925061326e826001831663ffffffff613f6d16565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018b9052602481018a905260448101899052606481018890526084810187905260a4810184905290519294506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b1580156132fa57600080fd5b505af115801561330e573d6000803e3d6000fd5b505050505050505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008261337c57506000610dd8565b8282028284828161338957fe5b0414610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806146aa6021913960400191505060405180910390fd5b600080821161341c576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161342757fe5b04949350505050565b600082820183811015610dd5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0381166134cf5760405162461bcd60e51b815260040180806020018281038252602681526020018061459a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ffffffffffffffe7ffdbfffffffffffff0000000000000000000000000000000090565b607f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000093909316600792830291909202037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90160ff161c60201c1690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081810160071692600860ff93859003909201929092160490565b604060ff82161015919050565b6136146144d1565b600360ff166136298561010001518585613fca565b60ff161461363c57506001835282611357565b61364461456b565b6000613651868686614010565b909250905060ff811661366b575050600184525082611357565b60008080808080805b8760ff168160ff1610156137bf5760009650600095506136a98d8a8360ff166008811061369d57fe5b60200201518e8e6141ed565b9097509550600092505b8560ff168360ff1610156137b757816136cb57600191505b6136de6136d9888589613566565b6135c4565b80955081965050506136fc8d61010001518e61016001518787614318565b6fffffffffffffffffffffffffffffffff19166101008e01526101608d015160ff166002141561376b576101c08d01805160010160ff9081169091526101a08e0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911690526137ac565b6101c08d0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff9081169091526101a08e01805160010190911690525b6001909201916136b3565b600101613674565b50801561382f576137dc8c61010001518d61016001518d8d614318565b6fffffffffffffffffffffffffffffffff19166101008d01526101608c015160ff166002141561381a576101c08c01805160010160ff16905261382a565b6101a08c01805160010160ff1690525b613844565b505060018a5250889550611357945050505050565b6101608c015160ff16600114156138625760026101608d015261386b565b60016101608d01525b50999a9950505050505050505050565b6101008101516000908190815b60408160ff16108015613899575082155b15613970576138a661454d565b60405180604001604052806008808560ff16816138bf57fe5b06850360ff16816138cc57fe5b0460ff1660ff16815260200160088460ff16816138e557fe5b0660ff1690526101008701519091506000906139109083835b60200201518460016020020151613fca565b905060ff8116600314156139665760008088526fffffffffffffffffffffffffffffffff19851661010089015261395890889084905b6020020151846001602002015161360c565b805190975061396657600194505b5050600101613888565b50909392505050565b6139816144d1565b81610180015160ff16603c14156139a05750600160208201528061122e565b61010082015160009081905b60408360ff161080156139bd575081155b15613ac5576139ca61454d565b60405180604001604052806008808760ff16816139e357fe5b06870360ff16816139f057fe5b0460ff1660ff16815260200160088660ff1681613a0957fe5b0660ff169052610100870151909150600090613a269083836138fe565b905060ff811660031415613ab857600161016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613a689088908490613946565b8051909750613a7657600193505b600261016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613aaa9088908490613946565b8051909750613ab857600193505b50506001909201916139ac565b8115613ad45760018552613ae0565b60016020860152600085525b50929392505050565b613af16144d1565b60018080808060005b60088160ff16108015613b2957508580613b115750845b80613b195750835b80613b215750825b80613b295750815b15613d185760005b60088160ff16108015613b6057508680613b485750855b80613b505750845b80613b585750835b80613b605750825b15613d0f57613b7b8961010001518360070383600703614402565b6fffffffffffffffffffffffffffffffff1916613b9e8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613bbb57600096505b613bce8961010001518383600703614402565b6fffffffffffffffffffffffffffffffff1916613bf18a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613c0e57600095505b613c218961010001518360070383614402565b6fffffffffffffffffffffffffffffffff1916613c448a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613c6157600094505b613c778961010001518260070384600703614402565b6fffffffffffffffffffffffffffffffff1916613c9a8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613cb757600093505b613cc78961010001518284614402565b6fffffffffffffffffffffffffffffffff1916613cea8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613d0757600092505b600101613b31565b50600101613afa565b508480613d225750835b80613d2a5750825b80613d325750815b80613d3a5750805b15613d6f57600160408801528415156060880152831515608088015282151560a088015281151560c088015280151560e08801525b509495945050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b158015613dd157600080fd5b505afa158015613de5573d6000803e3d6000fd5b505050506040513d60c0811015613dfb57600080fd5b508051602082015160408301516060840151608085015160a090950151939a50919850965094509092509050613e4987613e36576000613e39565b60015b879060ff1663ffffffff61343016565b9550613e6285600160048a901c1663ffffffff61343016565b9450613e7b84600160038a901c1663ffffffff61343016565b9350613e9483600160028a901c1663ffffffff61343016565b9250613eab82600189811c1663ffffffff61343016565b9150613ec0816001891663ffffffff61343016565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260448101889052606481018790526084810186905260a4810184905290519293506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b158015613f4c57600080fd5b505af1158015613f60573d6000803e3d6000fd5b5050505050505050505050565b600082821115613fc4576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600080613fd78484614455565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c60801c6003169150509392505050565b61401861456b565b600061402261456b565b600061402c61456b565b5060408051610140810182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010082018181526000610120840181905290835283518085018552828152600160208281018290528086019290925285518087018752838152808301829052858701528551808701875281815280830182905260608601528551808701875281815280830184905260808601528551808701875290815280820184905260a08501528451808601865282815280820184905260c0850152845180860190955282855284019190915260e0820192909252908061411461454d565b6000805b60088160ff1610156141da57858160ff166008811061413357fe5b6020020151925082600060200201518c01935082600160200201518b01945060078560000b1380614167575060008560000b125b80614175575060078460000b135b80614183575060008460000b125b6141d2576141978d61010001518587613fca565b91508c610160015160ff168260ff16146141d25760ff82166003146141d25782888860ff16600881106141c657fe5b60200201526001909601955b600101614118565b50959b949a509398505050505050505050565b600080600080600090506000600160ff1689610160015160ff16141561421557506002614219565b5060015b600080808060015b60098160ff16101561430457846142fc578c5160208e01519082028d01945081028b0192506007600085900b138061425c575060008460000b125b8061426a575060078360000b135b80614278575060008360000b125b1561428e576000975060009650600194506142fc565b61429e8e61010001518585613fca565b91508560ff168260ff1614156142c4576142ba8888868661448a565b90985096506142fc565b8d610160015160ff168260ff161480156142e1575060018160ff16115b156142ef57600194506142fc565b6000975060009650600194505b600101614221565b50959c949b50939950505050505050505050565b600060078360ff16111561435d5760405162461bcd60e51b81526004018080602001828103825260248152602001806145c06024913960400191505060405180910390fd5b60078260ff1611156143a05760405162461bcd60e51b81526004018080602001828103825260248152602001806146866024913960400191505060405180910390fd5b60006143ac8484614455565b7003000000000000000000000000000000006fffffffffffffffffffffffffffffffff90911690811b87189096169570ff00000000000000000000000000000000608087901b16901b8617915050949350505050565b60008061440f8484614455565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c700300000000000000000000000000000000169150509392505050565b600891909102016040037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160020260ff1690565b6008020160400160201b64ff000000001660079290921b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000016919091179160019190910190565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b60405180604001604052806002906020820280388339509192915050565b6040518061020001604052806008905b61458361454d565b81526020019060019003908161457b579050509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737363616e2774207475726e2074696c65206f757473696465206f6620626f61726420636f6c496e76616c696420636f6d6d69744f664d6f7665734861736857697468526563657069656e742c20706c6561736520646f20636c61696d436c6f7665725365637572656c79506172744f6e65436c6f766572206d75737420657869737420746f206265206368616c6c656e6765647472616e7366657246726f6d2063616e206f6e6c7920626520646f6e652062792073696d706c65436c6f766572734d61726b657463616e2774207475726e2074696c65206f757473696465206f6620626f61726420726f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a72305820a1384626a88d9d844ae04a694e75dc7e22a96eae21c39a2fbca28181889237f864736f6c63430005090032000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd10000000000000000000000001754a612ca578f72d678196bcc16710f01db7655

Deployed Bytecode

0x6080604052600436106102d15760003560e01c80638a05aafa11610179578063a89b55da116100d6578063d50cb88b1161008a578063f1b4bce911610064578063f1b4bce914610c2d578063f2fde38b14610c66578063fd5baa8814610c99576102d1565b8063d50cb88b14610bd9578063d76bbd5214610bee578063e757223014610c03576102d1565b8063c7876ea4116100bb578063c7876ea414610b67578063d010ed7014610b7c578063d2d7231f14610baf576102d1565b8063a89b55da14610b28578063c434968414610b3d576102d1565b8063975e4b2a1161012d578063a069870611610112578063a069870614610aac578063a4a83ca614610ac1578063a7e901b014610afe576102d1565b8063975e4b2a146109af5780639a0d981e146109c4576102d1565b80638f32d59b1161015e5780638f32d59b1461093d578063918a15cf146109525780639564e1801461097c576102d1565b80638a05aafa146108fe5780638da5cb5b14610928576102d1565b80633afcba96116102325780636e1258e7116101e65780637b7db9fa116101c05780637b7db9fa146108aa5780637cce4656146108d45780637dc0d1d0146108e9576102d1565b80636e1258e71461075b5780636e88f21f14610785578063715018a614610895576102d1565b80634896672e116102175780634896672e146106a0578063580bdd8c146106d05780635c975abb14610746576102d1565b80633afcba96146106615780634788578114610676576102d1565b80631cb44dfc11610289578063225c35b21161026e578063225c35b21461059257806323b872dd146105c6578063271eff9414610609576102d1565b80631cb44dfc146104f55780631ce5145614610528576102d1565b80630d576bfa116102ba5780630d576bfa146103a957806319045a25146103da57806319faa73014610494576102d1565b806308cdc2a8146102d657806308d27c7f14610304575b600080fd5b3480156102e257600080fd5b50610302600480360360208110156102f957600080fd5b50351515610cc3565b005b34801561031057600080fd5b5061035c6004803603604081101561032757600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610d669350505050565b6040805196151587529415156020870152921515858501526fffffffffffffffffffffffffffffffff19909116606085015260ff90811660808501521660a0830152519081900360c00190f35b3480156103b557600080fd5b506103be610db4565b604080516001600160a01b039092168252519081900360200190f35b3480156103e657600080fd5b506103be600480360360408110156103fd57600080fd5b8135919081019060408101602082013564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc3945050505050565b6104e1600480360360608110156104aa57600080fd5b6040805180820182529183019291818301918390600290839083908082843760009201919091525091945050503515159050610dde565b604080519115158252519081900360200190f35b34801561050157600080fd5b506103026004803603602081101561051857600080fd5b50356001600160a01b031661114a565b34801561053457600080fd5b506105806004803603604081101561054b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506111dd9350505050565b60408051918252519081900360200190f35b34801561059e57600080fd5b506104e1600480360360408110156105b557600080fd5b508035151590602001351515611233565b3480156105d257600080fd5b50610302600480360360608110156105e957600080fd5b506001600160a01b03813581169160208101359091169060400135611254565b34801561061557600080fd5b506104e16004803603604081101561062c57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506113309350505050565b34801561066d57600080fd5b5061058061135e565b34801561068257600080fd5b506103be6004803603602081101561069957600080fd5b5035611364565b3480156106ac57600080fd5b50610302600480360360408110156106c357600080fd5b508035906020013561137f565b3480156106dc57600080fd5b50610580600480360360c08110156106f357600080fd5b6040805180820182528335939283019291606083019190602084019060029083908390808284376000920191909152509194505081359250506020810135151590604001356001600160a01b0316611461565b34801561075257600080fd5b506104e16114f6565b34801561076757600080fd5b506103026004803603602081101561077e57600080fd5b5035611517565b34801561079157600080fd5b506104e160048036036101008110156107a957600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515946001600160a01b0360408201351694509192509060808101906060013564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184600183028401116401000000008311171561084957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506115929050565b3480156108a157600080fd5b506103026115f1565b3480156108b657600080fd5b506104e1600480360360208110156108cd57600080fd5b50356116ac565b3480156108e057600080fd5b50610580611c00565b3480156108f557600080fd5b506103be611c06565b34801561090a57600080fd5b506103026004803603602081101561092157600080fd5b5035611c15565b34801561093457600080fd5b506103be611c73565b34801561094957600080fd5b506104e1611c82565b34801561095e57600080fd5b506105806004803603602081101561097557600080fd5b5035611c93565b34801561098857600080fd5b506103026004803603602081101561099f57600080fd5b50356001600160a01b0316611c9e565b3480156109bb57600080fd5b506103be611d31565b6104e1600480360360c08110156109da57600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515949193509150606081019060400135640100000000811115610a3757600080fd5b820183602082011115610a4957600080fd5b80359060200191846001830284011164010000000083111715610a6b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d40945050505050565b348015610ab857600080fd5b50610580612005565b348015610acd57600080fd5b5061058060048036036020811015610ae457600080fd5b50356fffffffffffffffffffffffffffffffff191661200b565b348015610b0a57600080fd5b5061030260048036036020811015610b2157600080fd5b5035612049565b348015610b3457600080fd5b506103be6120a7565b348015610b4957600080fd5b5061030260048036036020811015610b6057600080fd5b50356120b6565b348015610b7357600080fd5b506105806121fa565b348015610b8857600080fd5b5061030260048036036020811015610b9f57600080fd5b50356001600160a01b0316612200565b348015610bbb57600080fd5b5061058060048036036020811015610bd257600080fd5b5035612293565b348015610be557600080fd5b5061058061246a565b348015610bfa57600080fd5b506103be612470565b348015610c0f57600080fd5b5061058060048036036020811015610c2657600080fd5b503561247f565b348015610c3957600080fd5b5061058060048036036040811015610c5057600080fd5b50803590602001356001600160a01b031661249c565b348015610c7257600080fd5b5061030260048036036020811015610c8957600080fd5b50356001600160a01b03166124ee565b348015610ca557600080fd5b5061030260048036036020811015610cbc57600080fd5b5035612553565b610ccb611c82565b610d1c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080600080600080610d776144d1565b610d80886125b1565b80516020820151604083015161010084015161016085015161018090950151939d929c50909a509850919650945092505050565b6002546001600160a01b031681565b6000610dd5838363ffffffff6127d916565b90505b92915050565b600080610dea846111dd565b6000818152600b60205260409020549091506001600160a01b0316801580610e1a57506001600160a01b03811633145b610e6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b610e736144d1565b610e7c866125b1565b9050610e9081600001518260200151611233565b610ee1576040805162461bcd60e51b815260206004820152600c60248201527f496e76616c69642067616d650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610ef182610100015161200b565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691634f558e7991602480820192602092909190829003018186803b158015610f5957600080fd5b505afa158015610f6d573d6000803e3d6000fd5b505050506040513d6020811015610f8357600080fd5b505115610fd7576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b6060820151608083015160a084015160c085015160e0860151604080517fa250cc3400000000000000000000000000000000000000000000000000000000815295151560048701529315156024860152911515604485015215156064840152151560848301525160009173b03b3533420c154acb4298614566b391269ace689163a250cc349160a480820192602092909190829003018186803b15801561107d57600080fd5b505af4158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b505190506110b8828983338b612903565b611109576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b505050600091825250600b6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550600192915050565b611152611c82565b6111a3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000816040516020018082600260200280838360005b8381101561120b5781810151838201526020016111f3565b505050509050019150506040516020818303038152906040528051906020012090505b919050565b6000828061123f575081155b1561124c57506000610dd8565b506001610dd8565b6005546001600160a01b0316331461129d5760405162461bcd60e51b81526004018080602001828103825260348152602001806146526034913960400191505060405180910390fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b50505050505050565b600061133a6144d1565b611343836125b1565b905061135781600001518260200151611233565b9392505050565b600a5481565b600b602052600090815260409020546001600160a01b031681565b611387611c82565b6113d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600554604080517fd79875eb000000000000000000000000000000000000000000000000000000008152600481018590526024810184905290516001600160a01b039092169163d79875eb9160448082019260009290919082900301818387803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050505050565b600085858585856040516020018086815260200185600260200280838360005b83811015611499578181015183820152602001611481565b50505050905001848152602001831515151560f81b8152600101826001600160a01b03166001600160a01b031660601b81526014019550505050505060405160208183030381529060405280519060200120905095945050505050565b60005474010000000000000000000000000000000000000000900460ff1681565b6000908152600b60208181526040808420805460017fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915581513360601b81850152825160148183030181526034909101835280519084012085529290915290912080549091166001600160a01b034316179055565b6000806115aa6115a58a8a8a8a8a611461565b611c93565b905060006115b88286610dc3565b90506001600160a01b038116158015906115e35750836001600160a01b0316816001600160a01b0316145b9a9950505050505050505050565b6115f9611c82565b61164a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290516000926001600160a01b031691634f558e79916024808301926020929190829003018186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d602081101561173b57600080fd5b50516117785760405162461bcd60e51b81526004018080602001828103825260228152602001806146306022913960400191505060405180910390fd5b600161178261454d565b600254604080517f62f9acf90000000000000000000000000000000000000000000000000000000081526004810187905281516001600160a01b03909316926362f9acf992602480840193919291829003018186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250604081101561181d57600080fd5b509050600061182a611c73565b9050336001600160a01b0382161480159061185057506001546001600160a01b03163314155b15611a3d5761185d6144d1565b611866836125b1565b90508561187782610100015161200b565b1461188157600093505b83801561189b575061189b81600001518260200151611233565b156119e357600254604080517fc53b4bf90000000000000000000000000000000000000000000000000000000081526004810189905290516000926001600160a01b03169163c53b4bf9916024808301926020929190829003018186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d602081101561192f57600080fd5b505160608301519091501515600482901c600116151514611951576000611953565b845b9450816080015115156000600383901c60011611151514611975576000611977565b845b94508160a0015115156000600283901c6001161115151461199957600061199b565b845b60c08301519095501515600182811c161515146119b95760006119bb565b845b94508160e001511515600082600116111515146119d95760006119db565b845b9450506119e8565b600093505b8315611a3b576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520696e76616c696420746f206368616c6c656e676500000000604482015290519081900360640190fd5b505b611a4685613070565b600254604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905290516000926001600160a01b031691636352211e916024808301926020929190829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b5051604080518881529192507f36b306723b6493a90002bbf27460db864a9ac8ce1af82ad1f0183f83c0cecc39918891869185913391906020820190859080838360005b83811015611b31578181015183820152602001611b19565b50505050905001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200194505050505060405180910390a1600254604080517f0e8310d60000000000000000000000000000000000000000000000000000000081526004810189905290516001600160a01b0390921691630e8310d69160248082019260009290919082900301818387803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b5060019998505050505050505050565b60065481565b6001546001600160a01b031681565b611c1d611c82565b611c6e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600a55565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6000610dd88261331c565b611ca6611c82565b611cf7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000805474010000000000000000000000000000000000000000900460ff1615611db1576040805162461bcd60e51b815260206004820152601260248201527f4d757374206e6f74206265207061757365640000000000000000000000000000604482015290519081900360640190fd5b6000600b6000611dc0886111dd565b81526020810191909152604001600020546001600160a01b03169050801580611df157506001600160a01b03811633145b611e42576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b600254604080517f4f558e79000000000000000000000000000000000000000000000000000000008152600481018a905290516001600160a01b0390921691634f558e7991602480820192602092909190829003018186803b158015611ea757600080fd5b505afa158015611ebb573d6000803e3d6000fd5b505050506040513d6020811015611ed157600080fd5b505115611f25576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b611f49878787873388600160009054906101000a90046001600160a01b0316611592565b611f9a576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b611fa78787873388612903565b611ff8576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b5060019695505050505050565b60075481565b6000805b60108110156120435780600101601060ff160360080260020a83826010811061203457fe5b1a02919091019060010161200f565b50919050565b612051611c82565b6120a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600955565b6004546001600160a01b031681565b604080513360601b60208083019190915282516014818403018152603490920183528151918101919091206000908152600b9091522054436001600160a01b039091161061214b576040805162461bcd60e51b815260206004820152601e60248201527f43616e277420636f6d62696e6520737465703120776974682073746570320000604482015290519081900360640190fd5b6000612157823361249c565b6000818152600b60205260409020549091506001600160a01b0316600181146121b15760405162461bcd60e51b815260040180806020018281038252604c8152602001806145e4604c913960600191505060405180910390fd5b506000908152600b602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091559282529020805490911633179055565b60085481565b612208611c82565b612259576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d60c081101561231657600080fd5b508051602082015160408301516060840151608085015160a090950151939a509198509650945090925090506000600160048a901c811614156123915761238e612381876001016123758a600101600a5461336d90919063ffffffff16565b9063ffffffff6133c616565b829063ffffffff61343016565b90505b600389901c600116600114156123c6576123c3612381866001016123758a600101600a5461336d90919063ffffffff16565b90505b600289901c600116600114156123fb576123f8612381856001016123758a600101600a5461336d90919063ffffffff16565b90505b600189811c8116141561242d5761242a612381846001016123758a600101600a5461336d90919063ffffffff16565b90505b886001166001141561245e5761245b612381836001016123758a600101600a5461336d90919063ffffffff16565b90505b98975050505050505050565b60095481565b6003546001600160a01b031681565b6000610dd861248d83612293565b6008549063ffffffff61343016565b6040805160208082019490945260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016828201528051808303603401815260549092019052805191012090565b6124f6611c82565b612547576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6125508161348a565b50565b61255b611c82565b6125ac576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600855565b6125b96144d1565b6125c16144d1565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009081166101208301526020808501519091166101408301526000610180830181905260026101a084018190526101c084015280835290820152600161016082015261262d613542565b6fffffffffffffffffffffffffffffffff1916610100820152600080808080805b603c8260ff1610801561265f575085155b156127af57602087610180015160ff161061267f57866101400151612686565b8661012001515b90506126a681602089610180015160ff168161269e57fe5b066020613566565b94506126b1856135c4565b90945092506126bf856135ff565b15955060ff82161580156126e557508360ff1660021415806126e557508260ff16600314155b156126f257600180885295505b85158015612703575060088460ff16105b8015612712575060088360ff16105b801561271c575060015b8015612726575060015b156127a45761273687858561360c565b6101808101805160010160ff1690528051909750156127a4576127588761387b565b6127a4576000875261016087015160ff166001141561277e576002610160880152612787565b60016101608801525b61279287858561360c565b8051909750156127a457600180885295505b60019091019061264e565b86516127cc576127be87613979565b96506127c987613ae9565b96505b5094979650505050505050565b600081516041146127ec57506000610dd8565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156128325760009350505050610dd8565b8060ff16601b1415801561284a57508060ff16601c14155b1561285b5760009350505050610dd8565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a08084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156128d0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600254604080517f0b628395000000000000000000000000000000000000000000000000000000008152600481018881526000936001600160a01b031692630b628395928a928a9290916024019083908083838b5b83811015612970578181015183820152602001612958565b5050505090500192505050600060405180830381600087803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b5050600254604080517f76e4a87f000000000000000000000000000000000000000000000000000000008152600481018b9052861515602482015290516001600160a01b0390921693506376e4a87f925060448082019260009290919082900301818387803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050600080851115612b5c57600254604080517fdc3f7758000000000000000000000000000000000000000000000000000000008152600481018a90526024810188905290516001600160a01b039092169163dc3f77589160448082019260009290919082900301818387803b158015612aaa57600080fd5b505af1158015612abe573d6000803e3d6000fd5b50505050612acb85612293565b600254604080517fa47bd496000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905290519293506001600160a01b039091169163a47bd4969160448082019260009290919082900301818387803b158015612b3b57600080fd5b505af1158015612b4f573d6000803e3d6000fd5b50505050612b5c85613d7a565b600854600090612b72908363ffffffff61343016565b9050838015612b815750600081115b15612d3757600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612be957600080fd5b505afa158015612bfd573d6000803e3d6000fd5b505050506040513d6020811015612c1357600080fd5b50511015612cb25760048054604080517ff088d5470000000000000000000000000000000000000000000000000000000081523393810193909352516001600160a01b039091169163f088d54791349160248082019260209290919082900301818588803b158015612c8457600080fd5b505af1158015612c98573d6000803e3d6000fd5b50505050506040513d6020811015612caf57600080fd5b50505b600354604080517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015612d1e57600080fd5b505af1158015612d32573d6000803e3d6000fd5b505050505b8315612dc857600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015612dab57600080fd5b505af1158015612dbf573d6000803e3d6000fd5b50505050612fc6565b600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301819052602483018b9052905190916340c10f1991604480830192600092919082900301818387803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b50506005546009546001600160a01b03909116925063d79875eb91508a90612e7c9061248d90879063ffffffff61336d16565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015612eb957600080fd5b505af1158015612ecd573d6000803e3d6000fd5b505050506000821115612fc657600354604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015612f4957600080fd5b505af1158015612f5d573d6000803e3d6000fd5b505050506040513d6020811015612f7357600080fd5b5051612fc6576040805162461bcd60e51b815260206004820152601160248201527f6d696e74206d7573742073756363656564000000000000000000000000000000604482015290519081900360640190fd5b7fbffd4880cee44a71d4266cf8dcf3179608df035c1883808a2370a9cfd180f6ed88883388868b8a6040518088815260200187600260200280838360005b8381101561301c578181015183820152602001613004565b5050506001600160a01b03998a16939091019283525050949095166020850152604080850193909352606084019190915215156080830152519081900360a0019350915050a1506001979650505050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156130c757600080fd5b505afa1580156130db573d6000803e3d6000fd5b505050506040513d60c08110156130f157600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809650819750829850839950849a50859b505050505050506000600260009054906101000a90046001600160a01b03166001600160a01b031663c53b4bf9896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156131a757600080fd5b505afa1580156131bb573d6000803e3d6000fd5b505050506040513d60208110156131d157600080fd5b505190506131f7816131e45760006131e7565b60015b889060ff1663ffffffff613f6d16565b9650613210866001600484901c1663ffffffff613f6d16565b9550613229856001600384901c1663ffffffff613f6d16565b9450613242846001600284901c1663ffffffff613f6d16565b935061325983600183811c1663ffffffff613f6d16565b925061326e826001831663ffffffff613f6d16565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018b9052602481018a905260448101899052606481018890526084810187905260a4810184905290519294506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b1580156132fa57600080fd5b505af115801561330e573d6000803e3d6000fd5b505050505050505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008261337c57506000610dd8565b8282028284828161338957fe5b0414610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806146aa6021913960400191505060405180910390fd5b600080821161341c576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161342757fe5b04949350505050565b600082820183811015610dd5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0381166134cf5760405162461bcd60e51b815260040180806020018281038252602681526020018061459a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ffffffffffffffe7ffdbfffffffffffff0000000000000000000000000000000090565b607f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000093909316600792830291909202037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90160ff161c60201c1690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081810160071692600860ff93859003909201929092160490565b604060ff82161015919050565b6136146144d1565b600360ff166136298561010001518585613fca565b60ff161461363c57506001835282611357565b61364461456b565b6000613651868686614010565b909250905060ff811661366b575050600184525082611357565b60008080808080805b8760ff168160ff1610156137bf5760009650600095506136a98d8a8360ff166008811061369d57fe5b60200201518e8e6141ed565b9097509550600092505b8560ff168360ff1610156137b757816136cb57600191505b6136de6136d9888589613566565b6135c4565b80955081965050506136fc8d61010001518e61016001518787614318565b6fffffffffffffffffffffffffffffffff19166101008e01526101608d015160ff166002141561376b576101c08d01805160010160ff9081169091526101a08e0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911690526137ac565b6101c08d0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff9081169091526101a08e01805160010190911690525b6001909201916136b3565b600101613674565b50801561382f576137dc8c61010001518d61016001518d8d614318565b6fffffffffffffffffffffffffffffffff19166101008d01526101608c015160ff166002141561381a576101c08c01805160010160ff16905261382a565b6101a08c01805160010160ff1690525b613844565b505060018a5250889550611357945050505050565b6101608c015160ff16600114156138625760026101608d015261386b565b60016101608d01525b50999a9950505050505050505050565b6101008101516000908190815b60408160ff16108015613899575082155b15613970576138a661454d565b60405180604001604052806008808560ff16816138bf57fe5b06850360ff16816138cc57fe5b0460ff1660ff16815260200160088460ff16816138e557fe5b0660ff1690526101008701519091506000906139109083835b60200201518460016020020151613fca565b905060ff8116600314156139665760008088526fffffffffffffffffffffffffffffffff19851661010089015261395890889084905b6020020151846001602002015161360c565b805190975061396657600194505b5050600101613888565b50909392505050565b6139816144d1565b81610180015160ff16603c14156139a05750600160208201528061122e565b61010082015160009081905b60408360ff161080156139bd575081155b15613ac5576139ca61454d565b60405180604001604052806008808760ff16816139e357fe5b06870360ff16816139f057fe5b0460ff1660ff16815260200160088660ff1681613a0957fe5b0660ff169052610100870151909150600090613a269083836138fe565b905060ff811660031415613ab857600161016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613a689088908490613946565b8051909750613a7657600193505b600261016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613aaa9088908490613946565b8051909750613ab857600193505b50506001909201916139ac565b8115613ad45760018552613ae0565b60016020860152600085525b50929392505050565b613af16144d1565b60018080808060005b60088160ff16108015613b2957508580613b115750845b80613b195750835b80613b215750825b80613b295750815b15613d185760005b60088160ff16108015613b6057508680613b485750855b80613b505750845b80613b585750835b80613b605750825b15613d0f57613b7b8961010001518360070383600703614402565b6fffffffffffffffffffffffffffffffff1916613b9e8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613bbb57600096505b613bce8961010001518383600703614402565b6fffffffffffffffffffffffffffffffff1916613bf18a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613c0e57600095505b613c218961010001518360070383614402565b6fffffffffffffffffffffffffffffffff1916613c448a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613c6157600094505b613c778961010001518260070384600703614402565b6fffffffffffffffffffffffffffffffff1916613c9a8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613cb757600093505b613cc78961010001518284614402565b6fffffffffffffffffffffffffffffffff1916613cea8a61010001518484614402565b6fffffffffffffffffffffffffffffffff191614613d0757600092505b600101613b31565b50600101613afa565b508480613d225750835b80613d2a5750825b80613d325750815b80613d3a5750805b15613d6f57600160408801528415156060880152831515608088015282151560a088015281151560c088015280151560e08801525b509495945050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b158015613dd157600080fd5b505afa158015613de5573d6000803e3d6000fd5b505050506040513d60c0811015613dfb57600080fd5b508051602082015160408301516060840151608085015160a090950151939a50919850965094509092509050613e4987613e36576000613e39565b60015b879060ff1663ffffffff61343016565b9550613e6285600160048a901c1663ffffffff61343016565b9450613e7b84600160038a901c1663ffffffff61343016565b9350613e9483600160028a901c1663ffffffff61343016565b9250613eab82600189811c1663ffffffff61343016565b9150613ec0816001891663ffffffff61343016565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260448101889052606481018790526084810186905260a4810184905290519293506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b158015613f4c57600080fd5b505af1158015613f60573d6000803e3d6000fd5b5050505050505050505050565b600082821115613fc4576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600080613fd78484614455565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c60801c6003169150509392505050565b61401861456b565b600061402261456b565b600061402c61456b565b5060408051610140810182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010082018181526000610120840181905290835283518085018552828152600160208281018290528086019290925285518087018752838152808301829052858701528551808701875281815280830182905260608601528551808701875281815280830184905260808601528551808701875290815280820184905260a08501528451808601865282815280820184905260c0850152845180860190955282855284019190915260e0820192909252908061411461454d565b6000805b60088160ff1610156141da57858160ff166008811061413357fe5b6020020151925082600060200201518c01935082600160200201518b01945060078560000b1380614167575060008560000b125b80614175575060078460000b135b80614183575060008460000b125b6141d2576141978d61010001518587613fca565b91508c610160015160ff168260ff16146141d25760ff82166003146141d25782888860ff16600881106141c657fe5b60200201526001909601955b600101614118565b50959b949a509398505050505050505050565b600080600080600090506000600160ff1689610160015160ff16141561421557506002614219565b5060015b600080808060015b60098160ff16101561430457846142fc578c5160208e01519082028d01945081028b0192506007600085900b138061425c575060008460000b125b8061426a575060078360000b135b80614278575060008360000b125b1561428e576000975060009650600194506142fc565b61429e8e61010001518585613fca565b91508560ff168260ff1614156142c4576142ba8888868661448a565b90985096506142fc565b8d610160015160ff168260ff161480156142e1575060018160ff16115b156142ef57600194506142fc565b6000975060009650600194505b600101614221565b50959c949b50939950505050505050505050565b600060078360ff16111561435d5760405162461bcd60e51b81526004018080602001828103825260248152602001806145c06024913960400191505060405180910390fd5b60078260ff1611156143a05760405162461bcd60e51b81526004018080602001828103825260248152602001806146866024913960400191505060405180910390fd5b60006143ac8484614455565b7003000000000000000000000000000000006fffffffffffffffffffffffffffffffff90911690811b87189096169570ff00000000000000000000000000000000608087901b16901b8617915050949350505050565b60008061440f8484614455565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c700300000000000000000000000000000000169150509392505050565b600891909102016040037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160020260ff1690565b6008020160400160201b64ff000000001660079290921b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000016919091179160019190910190565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b60405180604001604052806002906020820280388339509192915050565b6040518061020001604052806008905b61458361454d565b81526020019060019003908161457b579050509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737363616e2774207475726e2074696c65206f757473696465206f6620626f61726420636f6c496e76616c696420636f6d6d69744f664d6f7665734861736857697468526563657069656e742c20706c6561736520646f20636c61696d436c6f7665725365637572656c79506172744f6e65436c6f766572206d75737420657869737420746f206265206368616c6c656e6765647472616e7366657246726f6d2063616e206f6e6c7920626520646f6e652062792073696d706c65436c6f766572734d61726b657463616e2774207475726e2074696c65206f757473696465206f6620626f61726420726f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a72305820a1384626a88d9d844ae04a694e75dc7e22a96eae21c39a2fbca28181889237f864736f6c63430005090032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd10000000000000000000000001754a612ca578f72d678196bcc16710f01db7655

-----Decoded View---------------
Arg [0] : _clovers (address): 0xB55C5cAc5014C662fDBF21A2C59Cd45403C482Fd
Arg [1] : _clubToken (address): 0x1A94656A6245379bC0d9c64C402197528EdB2bD1
Arg [2] : _clubTokenController (address): 0x1754a612cA578F72d678196bcC16710f01DB7655

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd
Arg [1] : 0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd1
Arg [2] : 0000000000000000000000001754a612ca578f72d678196bcc16710f01db7655


Deployed Bytecode Sourcemap

29030:17440:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41736:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41736:88:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41736:88:0;;;;:::i;:::-;;31645:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31645:495:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31645:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;31645:495:0;;-1:-1:-1;31645:495:0;;-1:-1:-1;;;;31645:495:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31645:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29496:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29496:23:0;;;:::i;:::-;;;;-1:-1:-1;;;;;29496:23:0;;;;;;;;;;;;;;46196:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46196:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46196:134:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;46196:134:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46196:134:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46196:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46196:134:0;;-1:-1:-1;46196:134:0;;-1:-1:-1;;;;;46196:134:0:i;34954:885::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34954:885:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;34954:885:0;;-1:-1:-1;;;34954:885:0;;;;-1:-1:-1;34954:885:0;:::i;:::-;;;;;;;;;;;;;;;;;;41931:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41931:91:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41931:91:0;-1:-1:-1;;;;;41931:91:0;;:::i;30464:137::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30464:137:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30464:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;30464:137:0;;-1:-1:-1;30464:137:0;;-1:-1:-1;;;;30464:137:0:i;:::-;;;;;;;;;;;;;;;;31437:200;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31437:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31437:200:0;;;;;;;;;;;:::i;41378:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41378:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41378:252:0;;;;;;;;;;;;;;;;;:::i;30994:194::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30994:194:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30994:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;30994:194:0;;-1:-1:-1;30994:194:0;;-1:-1:-1;;;;30994:194:0:i;29926:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29926:28:0;;;:::i;29963:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29963:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29963:40:0;;:::i;40927:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40927:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40927:135:0;;;;;;;:::i;45953:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45953:237:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45953:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;45953:237:0;;-1:-1:-1;;45953:237:0;;;-1:-1:-1;;45953:237:0;;;;;;;;;;-1:-1:-1;;;;;45953:237:0;;:::i;29443:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29443:18:0;;;:::i;33783:221::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33783:221:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33783:221:0;;:::i;45470:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45470:475:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45470:475:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;45470:475:0;;;;;;;;;;;;-1:-1:-1;;;;;45470:475:0;;;;;;-1:-1:-1;45470:475:0;;-1:-1:-1;45470:475:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45470:475:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45470:475:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45470:475:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45470:475:0;;-1:-1:-1;;;45470:475:0;;-1:-1:-1;;;;;45470:475:0;;-1:-1:-1;45470:475:0;;-1:-1:-1;45470:475:0:i;24277:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24277:140:0;;;:::i;39461:1458::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39461:1458:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39461:1458:0;;:::i;29702:74::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29702:74:0;;;:::i;29468:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29468:21:0;;;:::i;42787:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42787:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42787:118:0;;:::i;23466:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23466:79:0;;;:::i;23832:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23832:92:0;;;:::i;46336:131::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46336:131:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46336:131:0;;:::i;42470:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42470:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42470:156:0;-1:-1:-1;;;;;42470:156:0;;:::i;29614:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29614:47:0;;;:::i;36496:676::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36496:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;36496:676:0;;;;;;;;;;;;;;-1:-1:-1;36496:676:0;-1:-1:-1;36496:676:0;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;36496:676:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36496:676:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36496:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36496:676:0;;-1:-1:-1;36496:676:0;;-1:-1:-1;;;;;36496:676:0:i;29783:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29783:35:0;;;:::i;39020:231::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39020:231:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39020:231:0;-1:-1:-1;;39020:231:0;;:::i;43116:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43116:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43116:126:0;;:::i;29560:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29560:47:0;;;:::i;34329:617::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34329:617:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34329:617:0;;:::i;29858:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29858:24:0;;;:::i;42168:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42168:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42168:156:0;-1:-1:-1;;;;;42168:156:0;;:::i;32419:958::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32419:958:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32419:958:0;;:::i;29889:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29889:30:0;;;:::i;29526:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29526:27:0;;;:::i;33385:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33385:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33385:135:0;;:::i;30609:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30609:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30609:178:0;;;;;;-1:-1:-1;;;;;30609:178:0;;:::i;24572:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24572:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24572:109:0;-1:-1:-1;;;;;24572:109:0;;:::i;43398:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43398:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43398:103:0;;:::i;41736:88::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41800:6;:16;;;;;;;;;;;;;;;;;41736:88::o;31645:495::-;31709:10;31721:13;31736:16;31754:13;31769:19;31790:13;31859:24;;:::i;:::-;31886:23;31903:5;31886:16;:23::i;:::-;31942:10;;31967:13;;;;31995:16;;;;32026:10;;;;32051:18;;;;32084:12;;;;;31942:10;;31967:13;;-1:-1:-1;31995:16:0;;-1:-1:-1;32026:10:0;-1:-1:-1;32051:18:0;;-1:-1:-1;32084:12:0;-1:-1:-1;31645:495:0;-1:-1:-1;;;31645:495:0:o;29496:23::-;;;-1:-1:-1;;;;;29496:23:0;;:::o;46196:134::-;46272:7;46299:23;:4;46312:9;46299:23;:12;:23;:::i;:::-;46292:30;;46196:134;;;;;:::o;34954:885::-;35051:4;35068:17;35088:19;35101:5;35088:12;:19::i;:::-;35118:26;35147:18;;;:7;:18;;;;;;35068:39;;-1:-1:-1;;;;;;35147:18:0;35184:32;;;:68;;-1:-1:-1;;;;;;35220:32:0;;35242:10;35220:32;35184:68;35176:107;;;;;-1:-1:-1;;;35176:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35296:24;;:::i;:::-;35323:23;35340:5;35323:16;:23::i;:::-;35296:50;;35365:38;35377:4;:10;;;35389:4;:13;;;35365:11;:38::i;:::-;35357:63;;;;;-1:-1:-1;;;35357:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35431:15;35449:32;35470:4;:10;;;35449:20;:32::i;:::-;35501:7;;:23;;;;;;;;;;;;;;35431:50;;-1:-1:-1;;;;;;35501:7:0;;;;:14;;:23;;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;35501:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35501:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35501:23:0;35500:24;35492:58;;;;;-1:-1:-1;;;35492:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35611:11;;;;35624:10;;;;35636;;;;35648;;;;35660:11;;;;35584:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35563:18;;35584:7;;:26;;:88;;;;;;;;;;;;;;;:7;:88;;;5:2:-1;;;;30:1;27;20:12;5:2;35584:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35584:88:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35584:88:0;;-1:-1:-1;35691:58:0;35704:7;35713:5;35584:88;35732:10;35744:4;35691:12;:58::i;:::-;35683:89;;;;;-1:-1:-1;;;35683:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35790:18:0;;;;-1:-1:-1;35790:7:0;:18;;;;;35783:26;;;;;;-1:-1:-1;35783:26:0;34954:885;;;;:::o;41931:91::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41998:6;:16;;;;-1:-1:-1;;;;;41998:16:0;;;;;;;;;;41931:91::o;30464:137::-;30532:7;30586:5;30569:23;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30569:23:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30569:23:0;;;30559:34;;;;;;30552:41;;30464:137;;;;:::o;31437:200::-;31506:4;31527:5;:18;;;;31537:8;31536:9;31527:18;31523:107;;;-1:-1:-1;31569:5:0;31562:12;;31523:107;-1:-1:-1;31614:4:0;31607:11;;41378:252;41493:19;;-1:-1:-1;;;;;41493:19:0;41471:10;:42;41463:107;;;;-1:-1:-1;;;41463:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41581:7;;:41;;;;;;-1:-1:-1;;;;;41581:41:0;;;;;;;;;;;;;;;;;;;;;;:7;;;;;:20;;:41;;;;;:7;;:41;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;41581:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41581:41:0;;;;41378:252;;;:::o;30994:194::-;31057:4;31074:24;;:::i;:::-;31101:23;31118:5;31101:16;:23::i;:::-;31074:50;;31142:38;31154:4;:10;;;31166:4;:13;;;31142:11;:38::i;:::-;31135:45;30994:194;-1:-1:-1;;;30994:194:0:o;29926:28::-;;;;:::o;29963:40::-;;;;;;;;;;;;-1:-1:-1;;;;;29963:40:0;;:::o;40927:135::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41013:19;;:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41013:19:0;;;;:24;;:41;;;;;:19;;:41;;;;;;;;:19;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;41013:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41013:41:0;;;;40927:135;;:::o;45953:237::-;46083:7;46137;46146:5;46153:10;46165:4;46171:9;46120:61;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46120:61:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46120:61:0;-1:-1:-1;;;;;46120:61:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46120:61:0;;;46110:72;;;;;;46103:79;;45953:237;;;;;;;:::o;29443:18::-;;;;;;;;;:::o;33783:221::-;33869:31;;;;:7;:31;;;;;;;;:44;;33911:1;33869:44;;;;;;;;33942:28;;33959:10;33942:28;;;;;;;;;26:21:-1;;;22:32;6:49;;33942:28:0;;;;;;33932:39;;;;;;33924:48;;;;;;;;;:72;;;;;-1:-1:-1;;;;;33983:12:0;33924:72;;;;33783:221::o;45470:475::-;45717:4;45734:12;45749:76;45772:52;45780:7;45789:5;45796:10;45808:4;45814:9;45772:7;:52::i;:::-;45749:22;:76::i;:::-;45734:91;;45836:14;45853:24;45861:4;45867:9;45853:7;:24::i;:::-;45836:41;-1:-1:-1;;;;;;45896:20:0;;;;;;:40;;;45930:6;-1:-1:-1;;;;;45920:16:0;:6;-1:-1:-1;;;;;45920:16:0;;45896:40;45888:49;45470:475;-1:-1:-1;;;;;;;;;;45470:475:0:o;24277:140::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24376:1;24360:6;;24339:40;;-1:-1:-1;;;;;24360:6:0;;;;24339:40;;24376:1;;24339:40;24407:1;24390:19;;;;;;24277:140::o;39461:1458::-;39544:7;;:23;;;;;;;;;;;;;;39519:4;;-1:-1:-1;;;;;39544:7:0;;:14;;:23;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39544:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39544:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39544:23:0;39536:70;;;;-1:-1:-1;;;39536:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39630:4;39645:23;;:::i;:::-;39671:7;;:31;;;;;;;;;;;;;;-1:-1:-1;;;;;39671:7:0;;;;:22;;:31;;;;;;;;;;;;;:7;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;39671:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39671:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39671:31:0;-1:-1:-1;39713:22:0;39754:7;:5;:7::i;:::-;39713:50;-1:-1:-1;39778:10:0;-1:-1:-1;;;;;39778:20:0;;;;;;:44;;-1:-1:-1;39816:6:0;;-1:-1:-1;;;;;39816:6:0;39802:10;:20;;39778:44;39774:912;;;39839:24;;:::i;:::-;39866:23;39883:5;39866:16;:23::i;:::-;39839:50;;39943:7;39907:32;39928:4;:10;;;39907:20;:32::i;:::-;:43;39904:96;;39979:5;39971:13;;39904:96;40017:5;:47;;;;;40026:38;40038:4;:10;;;40050:4;:13;;;40026:11;:38::i;:::-;40014:599;;;40106:7;;:30;;;;;;;;;;;;;;40085:18;;-1:-1:-1;;;;;40106:7:0;;:21;;:30;;;;;;;;;;;;;;:7;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;40106:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40106:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40106:30:0;40192:11;;;;40106:30;;-1:-1:-1;40163:40:0;;40178:1;40164:15;;;40182:1;40164:19;40163:25;;:40;:56;;40214:5;40163:56;;;40206:5;40163:56;40155:64;;40275:4;:10;;;40246:39;;40270:1;40261;40247:10;:15;;40265:1;40247:19;40246:25;:39;;;:55;;40296:5;40246:55;;;40288:5;40246:55;40238:63;;40357:4;:10;;;40328:39;;40352:1;40343;40329:10;:15;;40347:1;40329:19;40328:25;:39;;;:55;;40378:5;40328:55;;;40370:5;40328:55;40439:10;;;;40320:63;;-1:-1:-1;40410:39:0;;40425:1;40411:15;;;:19;40410:25;;:39;:55;;40460:5;40410:55;;;40452:5;40410:55;40402:63;;40516:4;:11;;;40492:35;;40511:1;40493:10;40506:1;40493:14;40492:20;:35;;;:51;;40538:5;40492:51;;;40530:5;40492:51;40484:59;;40014:599;;;;40592:5;40584:13;;40014:599;40636:5;40635:6;40627:47;;;;;-1:-1:-1;;;40627:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39774:912;;40698:25;40715:7;40698:16;:25::i;:::-;40754:7;;:24;;;;;;;;;;;;;;40734:17;;-1:-1:-1;;;;;40754:7:0;;:15;;:24;;;;;;;;;;;;;;:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;40754:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40754:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40754:24:0;40794:55;;;;;;40754:24;;-1:-1:-1;40794:55:0;;40811:7;;40820:5;;40754:24;;40838:10;;40794:55;40754:24;40794:55;;;40820:5;;40794:55;;40820:5;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40794:55:0;;;;;;;-1:-1:-1;;;;;40794:55:0;-1:-1:-1;;;;;40794:55:0;;;;;;-1:-1:-1;;;;;40794:55:0;-1:-1:-1;;;;;40794:55:0;;;;;;;;;;;;;;;;;;40860:7;;:29;;;;;;;;;;;;;;-1:-1:-1;;;;;40860:7:0;;;;:20;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40860:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;40907:4:0;;39461:1458;-1:-1:-1;;;;;;;;;39461:1458:0:o;29702:74::-;;;;:::o;29468:21::-;;;-1:-1:-1;;;;;29468:21:0;;:::o;42787:118::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42867:13;:30;42787:118::o;23466:79::-;23504:7;23531:6;-1:-1:-1;;;;;23531:6:0;23466:79;:::o;23832:92::-;23872:4;23910:6;-1:-1:-1;;;;;23910:6:0;23896:10;:20;;23832:92::o;46336:131::-;46403:7;46430:29;:4;:27;:29::i;42470:156::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42576:19;:42;;;;-1:-1:-1;;;;;42576:42:0;;;;;;;;;;42470:156::o;29614:47::-;;;-1:-1:-1;;;;;29614:47:0;;:::o;36496:676::-;36661:4;30053:6;;;;;;;30052:7;30044:38;;;;;-1:-1:-1;;;30044:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36678:26;36707:7;:28;36715:19;36728:5;36715:12;:19::i;:::-;36707:28;;;;;;;;;;;-1:-1:-1;36707:28:0;;-1:-1:-1;;;;;36707:28:0;;-1:-1:-1;36754:32:0;;;:68;;-1:-1:-1;;;;;;36790:32:0;;36812:10;36790:32;36754:68;36746:107;;;;;-1:-1:-1;;;36746:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36873:7;;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;36873:7:0;;;;:14;;:23;;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;36873:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36873:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36873:23:0;36872:24;36864:58;;;;;-1:-1:-1;;;36864:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36941:79;36956:7;36965:5;36972:10;36984:4;36990:10;37002:9;37013:6;;;;;;;;;-1:-1:-1;;;;;37013:6:0;36941:14;:79::i;:::-;36933:109;;;;;-1:-1:-1;;;36933:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37061:58;37074:7;37083:5;37090:10;37102;37114:4;37061:12;:58::i;:::-;37053:89;;;;;-1:-1:-1;;;37053:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37160:4:0;;36496:676;-1:-1:-1;;;;;;36496:676:0:o;29783:35::-;;;;:::o;39020:231::-;39086:14;;39113:131;39128:13;39126:15;;39113:131;;;39225:1;39227;39225:3;39210:13;:19;;;39207:1;:23;39203:1;:28;39190:6;39197:1;39190:9;;;;;;;;39179:53;39170:62;;;;;39142:3;;39113:131;;;;39020:231;;;:::o;43116:126::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43200:15;:34;43116:126::o;29560:47::-;;;-1:-1:-1;;;;;29560:47:0;;:::o;34329:617::-;34436:28;;;34453:10;34436:28;;;;;;;;;;;;;26:21:-1;;;22:32;6:49;;34436:28:0;;;;;;34426:39;;;;;;;;;34418:48;;;;:7;:48;;;;;34470:12;-1:-1:-1;;;;;34418:48:0;;;34410:72;34402:115;;;;;-1:-1:-1;;;34402:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34528:18;34549:48;34575:9;34586:10;34549:25;:48::i;:::-;34608:38;34649:19;;;:7;:19;;;;;;34528:69;;-1:-1:-1;;;;;;34649:19:0;;34701:53;;34679:179;;;;-1:-1:-1;;;34679:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34876:19:0;;;;:7;:19;;;;;;34869:27;;;;;;;;;34907:18;;;;;:31;;;;;34928:10;34907:31;;;34329:617::o;29858:24::-;;;;:::o;42168:156::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42274:19;:42;;;;-1:-1:-1;;;;;42274:42:0;;;;;;;;;;42168:156::o;32419:958::-;32485:7;32505:20;32536:14;32561:13;32585;32609;32633:14;32757:7;;;;;;;;;-1:-1:-1;;;;;32757:7:0;-1:-1:-1;;;;;32757:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32757:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32757:26:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;32757:26:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32757:26:0;;-1:-1:-1;32757:26:0;-1:-1:-1;32757:26:0;-1:-1:-1;32757:26:0;;-1:-1:-1;32757:26:0;-1:-1:-1;32794:12:0;32843:1;32839;32825:15;;;:19;;:24;32821:98;;;32858:61;32867:51;32907:6;32916:1;32907:10;32867:35;32885:12;32900:1;32885:16;32867:13;;:17;;:35;;;;:::i;:::-;:39;:51;:39;:51;:::i;:::-;32858:4;;:61;:8;:61;:::i;:::-;32851:68;;32821:98;32948:1;32934:10;:15;;32952:1;32934:19;32957:1;32934:24;32930:97;;;32967:60;32976:50;33016:5;33024:1;33016:9;32976:35;32994:12;33009:1;32994:16;32976:13;;:17;;:35;;;;:::i;32967:60::-;32960:67;;32930:97;33056:1;33042:10;:15;;33060:1;33042:19;33065:1;33042:24;33038:97;;;33075:60;33084:50;33124:5;33132:1;33124:9;33084:35;33102:12;33117:1;33102:16;33084:13;;:17;;:35;;;;:::i;33075:60::-;33068:67;;33038:97;33164:1;33150:15;;;:19;;:24;33146:97;;;33183:60;33192:50;33232:5;33240:1;33232:9;33192:35;33210:12;33225:1;33210:16;33192:13;;:17;;:35;;;;:::i;33183:60::-;33176:67;;33146:97;33258:10;33271:1;33258:14;33276:1;33258:19;33254:93;;;33286:61;33295:51;33335:6;33344:1;33335:10;33295:35;33313:12;33328:1;33313:16;33295:13;;:17;;:35;;;;:::i;33286:61::-;33279:68;;33254:93;33365:4;32419:958;-1:-1:-1;;;;;;;;32419:958:0:o;29889:30::-;;;;:::o;29526:27::-;;;-1:-1:-1;;;;;29526:27:0;;:::o;33385:135::-;33443:7;33470:42;33484:27;33500:10;33484:15;:27::i;:::-;33470:9;;;:42;:13;:42;:::i;30609:178::-;30740:38;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;30740:38:0;;;;;;30730:49;;;;;;30609:178::o;24572:109::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24645:28;24664:8;24645:18;:28::i;:::-;24572:109;:::o;43398:103::-;23678:9;:7;:9::i;:::-;23670:54;;;;;-1:-1:-1;;;23670:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43471:9;:22;43398:103::o;1987:2149::-;2054:11;;:::i;:::-;2079:16;;:::i;:::-;2128:8;;2108:28;;;;:17;;;:28;2128:8;2164;;;;2147:25;;;:14;;;:25;2134:1;2183:12;;;:16;;;2228:1;2210:15;;;:19;;;2240:15;;;:19;2272:18;;;2301:13;;;:21;2170:1;-1:-1:-1;2333:18:0;;:26;2385:12;:10;:12::i;:::-;-1:-1:-1;;2372:25:0;:10;;;:25;2410:9;;;;;;2542:1447;2558:2;2554:1;:6;;;:15;;;;;2565:4;2564:5;2554:15;2542:1447;;;2621:2;2606:4;:12;;;:17;;;:54;;2646:4;:14;;;2606:54;;;2626:4;:17;;;2606:54;2591:69;;2682:45;2691:12;2720:2;2705:4;:12;;;:17;;;;;;;;2724:2;2682:8;:45::i;:::-;2675:52;;2755:17;2767:4;2755:11;:17::i;:::-;2742:30;;-1:-1:-1;2742:30:0;-1:-1:-1;2795:15:0;2805:4;2795:9;:15::i;:::-;2794:16;;-1:-1:-1;2829:6:0;;;;:32;;;;;2840:3;:8;;2847:1;2840:8;;:20;;;;2852:3;:8;;2859:1;2852:8;;2840:20;2825:225;;;2889:4;3017:17;;;2889:4;-1:-1:-1;2825:225:0;3069:4;3068:5;:16;;;;;3083:1;3077:3;:7;;;3068:16;:27;;;;;3094:1;3088:3;:7;;;3068:27;:39;;;;-1:-1:-1;3099:8:0;3068:39;:51;;;;-1:-1:-1;3111:8:0;3068:51;3064:914;;;3193:24;3202:4;3208:3;3213;3193:8;:24::i;:::-;3251:12;;;;;3266:1;3251:16;3236:31;;;;3290:10;;3251:12;;-1:-1:-1;3286:677:0;;;3330:22;3347:4;3330:16;:22::i;:::-;3325:619;;3462:5;3449:18;;3498;;;;:27;;3449:18;3498:27;3494:209;;;267:1;3558:18;;;:26;3494:209;;;223:1;3649:18;;;:26;3494:209;3736:24;3745:4;3751:3;3756;3736:8;:24::i;:::-;3791:10;;3729:31;;-1:-1:-1;3787:134:0;;;3847:4;3834:17;;;3847:4;-1:-1:-1;3787:134:0;2571:3;;;;;2542:1447;;;4004:10;;3999:108;;4038:16;4049:4;4038:10;:16::i;:::-;4031:23;;4076:19;4090:4;4076:13;:19::i;:::-;4069:26;;3999:108;-1:-1:-1;4124:4:0;;1987:2149;-1:-1:-1;;;;;;;1987:2149:0:o;26338:1930::-;26416:7;26479:9;:16;26499:2;26479:22;26475:74;;-1:-1:-1;26534:1:0;26518:19;;26475:74;26910:4;26895:20;;26889:27;26956:4;26941:20;;26935:27;27010:4;26995:20;;26989:27;26618:9;26981:36;27940:66;27927:79;;27923:129;;;28038:1;28023:17;;;;;;;27923:129;28068:1;:7;;28073:2;28068:7;;:18;;;;;28079:1;:7;;28084:2;28079:7;;28068:18;28064:68;;;28118:1;28103:17;;;;;;;28064:68;28236:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28236:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28236:24:0;;;;;;26338:1930;-1:-1:-1;;;;;;;26338:1930:0:o;37180:1662::-;37329:7;;:38;;;;;;;;;;;;37312:4;;-1:-1:-1;;;;;37329:7:0;;:22;;37352:7;;37361:5;;37329:38;;;;;37361:5;;37329:38;;37361:5;37312:4;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37329:38:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37329:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37378:7:0;;:30;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37378:7:0;;;;-1:-1:-1;37378:15:0;;-1:-1:-1;37378:30:0;;;;;:7;;:30;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;37378:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37378:30:0;;;;37419:14;37461:1;37448:10;:14;37444:229;;;37479:7;;:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37479:7:0;;;;:21;;:42;;;;;:7;;:42;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;37479:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37479:42:0;;;;37545:27;37561:10;37545:15;:27::i;:::-;37587:7;;:34;;;;;;;;;;;;;;;;;;;;37536:36;;-1:-1:-1;;;;;;37587:7:0;;;;:17;;:34;;;;;:7;;:34;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;37587:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37587:34:0;;;;37636:25;37650:10;37636:13;:25::i;:::-;37699:9;;37683:13;;37699:21;;37713:6;37699:21;:13;:21;:::i;:::-;37683:37;;37735:4;:17;;;;;37751:1;37743:5;:9;37735:17;37731:368;;;37912:9;;:31;;;;;;37932:10;37912:31;;;;;;37946:5;;-1:-1:-1;;;;;37912:9:0;;:19;;:31;;;;;;;;;;;;;;:9;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;37912:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37912:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37912:31:0;:39;37908:132;;;37972:19;;;:52;;;;;;38013:10;37972:52;;;;;;;;-1:-1:-1;;;;;37972:19:0;;;;:23;;38002:9;;37972:52;;;;;;;;;;;;;;;38002:9;37972:19;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;37972:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37972:52:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;37908:132:0;38054:9;;:33;;;;;;38069:10;38054:33;;;;;;;;;;;;-1:-1:-1;;;;;38054:9:0;;;;:14;;:33;;;;;:9;;:33;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;38054:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38054:33:0;;;;37731:368;38115:4;38111:608;;;38191:7;;:32;;;;;;-1:-1:-1;;;;;38191:32:0;;;;;;;;;;;;;;;:7;;;;;:12;;:32;;;;;:7;;:32;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;38191:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38191:32:0;;;;38111:608;;;38448:7;;:39;;;;;;-1:-1:-1;;;;;38448:7:0;;;:39;;;;;;;;;;;;;;:7;;:12;;:39;;;;;:7;;:39;;;;;;;:7;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;38448:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38502:19:0;;38561:15;;-1:-1:-1;;;;;38502:19:0;;;;-1:-1:-1;38502:24:0;;-1:-1:-1;38527:7:0;;38536:42;;38550:27;;:6;;:27;:10;:27;:::i;38536:42::-;38502:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38502:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38502:77:0;;;;38607:1;38598:6;:10;38594:114;;;38637:9;;:33;;;;;;-1:-1:-1;;;;;38637:33:0;;;;;;;;;;;;;;;:9;;;;;:14;;:33;;;;;;;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;38637:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38637:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38637:33:0;38629:63;;;;;-1:-1:-1;;;38629:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38734:78;38748:7;38757:5;38764:10;38776:9;38787:6;38795:10;38807:4;38734:78;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;;;;;;;38734:78:0;;;;;;;;;;-1:-1:-1;;38734:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38734:78:0;-1:-1:-1;;38734:78:0;-1:-1:-1;38830:4:0;;37180:1662;-1:-1:-1;;;;;;;37180:1662:0:o;44611:851::-;44673:20;44704:14;44729:13;44753;44777;44801:14;44925:7;;;;;;;;;-1:-1:-1;;;;;44925:7:0;-1:-1:-1;;;;;44925:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44925:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44925:26:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44925:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44826:125;;;;;;;;;;;;;;;;;;;;;;;;44962:18;44983:7;;;;;;;;;-1:-1:-1;;;;;44983:7:0;-1:-1:-1;;;;;44983:21:0;;45005:7;44983:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44983:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44983:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44983:30:0;;-1:-1:-1;45039:40:0;45056:14;:22;;45077:1;45056:22;;;45073:1;45056:22;45039:12;;:40;;;:16;:40;:::i;:::-;45024:55;-1:-1:-1;45099:40:0;:6;45136:1;45132;45118:15;;;:19;45099:40;:10;:40;:::i;:::-;45090:49;-1:-1:-1;45158:39:0;:5;45194:1;45190;45176:15;;;:19;45158:39;:9;:39;:::i;:::-;45150:47;-1:-1:-1;45216:39:0;:5;45252:1;45248;45234:15;;;:19;45216:39;:9;:39;:::i;:::-;45208:47;-1:-1:-1;45274:39:0;:5;45306:1;45292:15;;;:19;45274:39;:9;:39;:::i;:::-;45266:47;-1:-1:-1;45333:35:0;:6;45365:1;45352:14;;45333:35;:10;:35;:::i;:::-;45379:7;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45324:44;;-1:-1:-1;;;;;;45379:7:0;;;;:24;;:75;;;;;:7;;:75;;;;;;;;:7;;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;45379:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45379:75:0;;;;44611:851;;;;;;;;:::o;28544:269::-;28746:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28746:58:0;;;;;;;28736:69;;;;;;28544:269::o;20679:471::-;20737:7;20982:6;20978:47;;-1:-1:-1;21012:1:0;21005:8;;20978:47;21049:5;;;21053:1;21049;:5;:1;21073:5;;;;;:10;21065:56;;;;-1:-1:-1;;;21065:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21618:333;21676:7;21775:1;21771;:5;21763:44;;;;;-1:-1:-1;;;21763:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21818:9;21834:1;21830;:5;;;;;;;21618:333;-1:-1:-1;;;;21618:333:0:o;19788:181::-;19846:7;19878:5;;;19902:6;;;;19894:46;;;;;-1:-1:-1;;;19894:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24787:229;-1:-1:-1;;;;;24861:22:0;;24853:73;;;;-1:-1:-1;;;24853:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24963:6;;;24942:38;;-1:-1:-1;;;;;24942:38:0;;;;24963:6;;;24942:38;;;24991:6;:17;;;;-1:-1:-1;;;;;24991:17:0;;;;;;;;;;24787:229::o;1719:260::-;1874:57;1719:260;:::o;15752:281::-;15896:3;15995:20;;;;;15961:1;15946:11;;;15926:15;;;;15925:33;:37;;15995:20;;;15880:21;15986:38;;;15752:281::o;16530:201::-;16616:9;;;;16648:8;;;16655:1;16648:8;16680:10;;;;;;;16679:16;;;;;;16530:201::o;16426:96::-;16512:2;16504:10;;;;;16426:96;;;:::o;4849:2389::-;4931:11;;:::i;:::-;311:1;4999:41;;:32;5010:4;:10;;;5022:3;5027;4999:10;:32::i;:::-;:41;;;4995:188;;-1:-1:-1;5069:4:0;5056:17;;:4;5160:11;;4995:188;5193:36;;:::i;:::-;5240:31;5331:37;5353:4;5359:3;5364;5331:21;:37::i;:::-;5282:86;;-1:-1:-1;5282:86:0;-1:-1:-1;5415:29:0;;;5411:176;;-1:-1:-1;;5474:4:0;5461:17;;-1:-1:-1;5461:4:0;5564:11;;5411:176;5599:16;;;;;;;5758:802;5780:24;5776:28;;:1;:28;;;5758:802;;;5826:15;;;5856:21;;;5921:56;5939:4;5945:18;5964:1;5945:21;;;;;;;;;;;;;5968:3;5973;5921:17;:56::i;:::-;5892:85;;-1:-1:-1;5892:85:0;-1:-1:-1;6001:1:0;;-1:-1:-1;5992:557:0;6008:14;6004:18;;:1;:18;;;5992:557;;;6053:5;6048:24;;6068:4;6060:12;;6048:24;6118:50;6130:37;6139:8;6149:1;6152:14;6130:8;:37::i;:::-;6118:11;:50::i;:::-;6091:77;;;;;;;;6200:64;6209:4;:10;;;6221:4;:18;;;6241:10;6253;6200:8;:64::i;:::-;-1:-1:-1;;6187:77:0;:10;;;:77;6287:18;;;;:27;;267:1;6287:27;6283:251;;;6339:15;;;:20;;6358:1;6339:20;;;;;;;;6382:15;;;:20;;;;;;;;;6283:251;;;6451:15;;;:20;;;;;;;;;;;6494:15;;;:20;;6470:1;6494:20;;;;;;6283:251;6024:3;;;;;5992:557;;;5806:3;;5758:802;;;;6616:5;6612:413;;;6651:50;6660:4;:10;;;6672:4;:18;;;6692:3;6697;6651:8;:50::i;:::-;-1:-1:-1;;6638:63:0;:10;;;:63;6720:18;;;;:27;;267:1;6720:27;6716:149;;;6768:15;;;:20;;6787:1;6768:20;;;;;6716:149;;;6829:15;;;:20;;6848:1;6829:20;;;;;6716:149;6612:413;;;-1:-1:-1;;6910:4:0;6897:17;;-1:-1:-1;6897:4:0;;-1:-1:-1;7002:11:0;;-1:-1:-1;;;;;7002:11:0;6612:413;7068:18;;;;:27;;223:1;7068:27;7064:145;;;267:1;7112:18;;;:26;7064:145;;;223:1;7171:18;;;:26;7064:145;-1:-1:-1;7226:4:0;;4849:2389;-1:-1:-1;;;;;;;;;;4849:2389:0:o;4144:697::-;4285:10;;;;4212:4;;;;;4324:476;4340:2;4336:1;:6;;;:27;;;;;4347:16;4346:17;4336:27;4324:476;;;4385:20;;:::i;:::-;:53;;;;;;;;4426:1;4420;4416;:5;;;;;;;;4411:1;:11;4410:17;;;;;;;;4385:53;;;;;;;;4435:1;4431;:5;;;;;;;;4385:53;;;;4477:10;;;;4385:53;;-1:-1:-1;4453:10:0;;4466:40;;4385:53;4453:10;4489:7;;;;;4498:4;4503:1;4498:7;;;;4466:10;:40::i;:::-;4453:53;-1:-1:-1;4525:13:0;;;311:1;4525:13;4521:268;;;4572:5;4559:18;;;-1:-1:-1;;4596:18:0;;:10;;;:18;4640:32;;4559:4;;4655;;:7;;;;;4664:4;4669:1;4664:7;;;;4640:8;:32::i;:::-;4696:10;;4633:39;;-1:-1:-1;4691:83:0;;4750:4;4731:23;;4691:83;-1:-1:-1;;4365:3:0;;4324:476;;;-1:-1:-1;4817:16:0;;4144:697;-1:-1:-1;;;4144:697:0:o;10978:1572::-;11040:11;;:::i;:::-;11068:4;:12;;;:18;;11084:2;11068:18;11064:1457;;;-1:-1:-1;11159:4:0;11143:13;;;:20;:4;11178:11;;11064:1457;11305:10;;;;11222:7;;;;11330:878;11346:2;11342:1;:6;;;:28;;;;;11353:17;11352:18;11342:28;11330:878;;;11396:20;;:::i;:::-;:53;;;;;;;;11437:1;11431;11427;:5;;;;;;;;11422:1;:11;11421:17;;;;;;;;11396:53;;;;;;;;11446:1;11442;:5;;;;;;;;11396:53;;;;11492:10;;;;11396:53;;-1:-1:-1;11468:10:0;;11481:40;;11396:53;11468:10;11504:7;;11481:40;11468:53;-1:-1:-1;11544:13:0;;;311:1;11544:13;11540:653;;;223:1;11582:18;;;:26;11644:5;11631:18;;;-1:-1:-1;;11672:18:0;;:10;;;:18;11720:32;;11582:4;;11735;;:7;;11720:32;11780:10;;11713:39;;-1:-1:-1;11775:92:0;;11839:4;11819:24;;11775:92;267:1;11889:18;;;:26;11951:5;11938:18;;;-1:-1:-1;;11979:18:0;;:10;;;:18;12027:32;;11889:4;;12042;;:7;;12027:32;12087:10;;12020:39;;-1:-1:-1;12082:92:0;;12146:4;12126:24;;12082:92;-1:-1:-1;;11372:3:0;;;;;11330:878;;;12226:17;12222:288;;;12277:4;12264:17;;12222:288;;;12453:4;12437:13;;;:20;;12476:18;;12222:288;-1:-1:-1;12538:4:0;;10978:1572;-1:-1:-1;;;10978:1572:0:o;12558:1681::-;12623:11;;:::i;:::-;12661:4;;;;;12647:11;12789:1143;12811:1;12807;:5;;;:54;;;;;12817:6;:15;;;;12827:5;12817:15;:24;;;;12836:5;12817:24;:33;;;;12845:5;12817:33;:43;;;;12854:6;12817:43;12789:1143;;;12888:7;12883:1038;12905:1;12901;:5;;;:54;;;;;12911:6;:15;;;;12921:5;12911:15;:24;;;;12930:5;12911:24;:33;;;;12939:5;12911:33;:43;;;;12948:6;12911:43;12883:1038;;;13060:41;13072:4;:10;;;13089:1;13085;:5;13098:1;13094;:5;13060:11;:41::i;:::-;13027:74;;;:29;13039:4;:10;;;13051:1;13054;13027:11;:29::i;:::-;-1:-1:-1;;13027:74:0;;13023:137;;13135:5;13126:14;;13023:137;13253:35;13265:4;:10;;;13277:1;13285;13281;:5;13253:11;:35::i;:::-;13220:68;;;:29;13232:4;:10;;;13244:1;13247;13220:11;:29::i;:::-;-1:-1:-1;;13220:68:0;;13216:130;;13321:5;13313:13;;13216:130;13439:35;13451:4;:10;;;13468:1;13464;:5;13472:1;13439:11;:35::i;:::-;13406:68;;;:29;13418:4;:10;;;13430:1;13433;13406:11;:29::i;:::-;-1:-1:-1;;13406:68:0;;13402:130;;13507:5;13499:13;;13402:130;13625:41;13637:4;:10;;;13654:1;13650;:5;13663:1;13659;:5;13625:11;:41::i;:::-;13592:74;;;:29;13604:4;:10;;;13616:1;13619;13592:11;:29::i;:::-;-1:-1:-1;;13592:74:0;;13588:136;;13699:5;13691:13;;13588:136;13818:29;13830:4;:10;;;13842:1;13845;13818:11;:29::i;:::-;13785:62;;;:29;13797:4;:10;;;13809:1;13812;13785:11;:29::i;:::-;-1:-1:-1;;13785:62:0;;13781:125;;13881:5;13872:14;;13781:125;12957:3;;12883:1038;;;-1:-1:-1;12863:3:0;;12789:1143;;;;13946:6;:15;;;;13956:5;13946:15;:24;;;;13965:5;13946:24;:33;;;;13974:5;13946:33;:43;;;;13983:6;13946:43;13942:268;;;14025:4;14006:16;;;:23;14044:20;;;:11;;;:20;14079:18;;;:10;;;:18;14112;;;:10;;;:18;14145;;;:10;;;:18;14178:20;;;:11;;;:20;13942:268;-1:-1:-1;14227:4:0;;12558:1681;-1:-1:-1;;;;;12558:1681:0:o;43663:789::-;43725:20;43756:14;43781:13;43805;43829;43853:14;43977:7;;;;;;;;;-1:-1:-1;;;;;43977:7:0;-1:-1:-1;;;;;43977:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43977:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43977:26:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43977:26:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43977:26:0;;-1:-1:-1;43977:26:0;-1:-1:-1;43977:26:0;-1:-1:-1;43977:26:0;;-1:-1:-1;43977:26:0;-1:-1:-1;44029:40:0;44046:14;:22;;44067:1;44046:22;;;44063:1;44046:22;44029:12;;:40;;;:16;:40;:::i;:::-;44014:55;-1:-1:-1;44089:40:0;:6;44126:1;44122;44108:15;;;:19;44089:40;:10;:40;:::i;:::-;44080:49;-1:-1:-1;44148:39:0;:5;44184:1;44180;44166:15;;;:19;44148:39;:9;:39;:::i;:::-;44140:47;-1:-1:-1;44206:39:0;:5;44242:1;44238;44224:15;;;:19;44206:39;:9;:39;:::i;:::-;44198:47;-1:-1:-1;44264:39:0;:5;44296:1;44282:15;;;:19;44264:39;:9;:39;:::i;:::-;44256:47;-1:-1:-1;44323:35:0;:6;44355:1;44342:14;;44323:35;:10;:35;:::i;:::-;44369:7;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44314:44;;-1:-1:-1;;;;;;44369:7:0;;;;:24;;:75;;;;;:7;;:75;;;;;;;;:7;;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;44369:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44369:75:0;;;;43663:789;;;;;;;:::o;20244:184::-;20302:7;20335:1;20330;:6;;20322:49;;;;;-1:-1:-1;;;20322:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20394:5:0;;;20244:184::o;15341:253::-;15420:5;15437:12;15452:19;15462:3;15467;15452:9;:19::i;:::-;-1:-1:-1;;15498:13:0;;;;;;;15516:19;15559:13;15532:1;15559:13;;-1:-1:-1;;15341:253:0;;;;;:::o;7246:1605::-;7340:17;;:::i;:::-;7359:5;7378:36;;:::i;:::-;7425:30;7470:22;;:::i;:::-;-1:-1:-1;7470:350:0;;;;;;;;7516:2;7470:350;;;;;;-1:-1:-1;7470:350:0;;;;;;;;;;;;;;;;;;;7565:1;7470:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7470:350:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7470:350:0;;;;;-1:-1:-1;7889:18:0;;:::i;:::-;7918:16;;7947:833;7969:1;7965;:5;;;7947:833;;;7998:4;8003:1;7998:7;;;;;;;;;;;;;;-1:-1:-1;7998:7:0;8052:1;8048:6;;;;8036:18;;;-1:-1:-1;8097:3:0;8101:1;8097:6;;;;8090:3;8085:18;8069:34;;8206:1;8190:13;:17;;;:38;;;;8227:1;8211:13;:17;;;8190:38;:59;;;;8248:1;8232:13;:17;;;8190:59;:80;;;;8269:1;8253:13;:17;;;8190:80;8184:585;;8305:66;8316:4;:10;;;8334:13;8356;8305:10;:66::i;:::-;8292:79;;8513:4;:18;;;8499:32;;:10;:32;;;8495:259;;8560:19;;;311:1;8560:19;8556:179;;8655:3;8608:18;8627:24;8608:44;;;;;;;;;;;;:50;8685:26;;;;;8556:179;7972:3;;7947:833;;;-1:-1:-1;8798:18:0;;8818:24;;-1:-1:-1;7246:1605:0;;-1:-1:-1;;;;;;;;;7246:1605:0:o;8859:2111::-;8969:7;8978:5;8996:22;9029:26;9058:1;9029:30;;9070:19;223:1;9104:27;;:4;:18;;;:27;;;9100:135;;;-1:-1:-1;267:1:0;9100:135;;;-1:-1:-1;223:1:0;9100:135;9374:9;;;;9484:1;9469:1438;9491:1;9487;:5;;;9469:1438;;;9519:4;9514:1382;;9565:6;;;9624;;;9555:16;;;9554:30;;;-1:-1:-1;9614:16:0;;9613:30;;;-1:-1:-1;9743:1:0;9569;9733:11;;;;;:26;;;9758:1;9748:7;:11;;;9733:26;:41;;;;9773:1;9763:7;:11;;;9733:41;:56;;;;9788:1;9778:7;:11;;;9733:56;9729:1152;;;9814:21;;;9881:1;9858:24;;9912:4;9905:11;;9729:1152;;;9973:54;9984:4;:10;;;10002:7;10018;9973:10;:54::i;:::-;9966:61;;10064:13;10056:21;;:4;:21;;;10052:810;;;10253:77;10261:14;10277:20;10305:7;10321;10253;:77::i;:::-;10212:118;;-1:-1:-1;10212:118:0;-1:-1:-1;10052:810:0;;;10372:4;:18;;;10364:26;;:4;:26;;;:35;;;;;10398:1;10394;:5;;;10364:35;10360:502;;;10520:4;10513:11;;10360:502;;;10725:21;;;10773:27;;;10834:4;10827:11;;10360:502;9494:3;;9469:1438;;;-1:-1:-1;10925:14:0;;10941:20;;-1:-1:-1;8859:2111:0;;-1:-1:-1;;;;;;;;;;8859:2111:0:o;14861:472::-;14953:7;14982:1;14976:3;:7;;;14972:59;;;14985:46;;-1:-1:-1;;;14985:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14972:59;15052:1;15046:3;:7;;;15042:59;;;15055:46;;-1:-1:-1;;;15055:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15042:59;15112:12;15127:19;15137:3;15142;15127:9;:19::i;:::-;15172;:27;;;;;;;15242:12;;15241:22;;;;15293:23;15172:19;15293:23;;;;:31;;15284:41;;;-1:-1:-1;;14861:472:0;;;;;;:::o;14654:199::-;14736:7;14756:12;14771:19;14781:3;14786;14771:9;:19::i;:::-;-1:-1:-1;;14809:13:0;;;;;;;14826:19;14808:37;;-1:-1:-1;;14654:199:0;;;;;:::o;15602:142::-;15711:1;:7;;;;15710:15;15703:2;15702:28;;;15734:1;15701:34;15693:43;;;15602:142::o;16041:377::-;16199:1;16193:7;16186:15;16204:2;16186:20;16232:21;;;;16295:1;16279:17;;;;;;16322:19;;;;;16352:13;;;;;;16041:377::o;29030:17440::-;;;;;;;;;-1:-1:-1;29030:17440:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29030:17440:0;;;-1:-1:-1;;29030:17440:0:o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://a1384626a88d9d844ae04a694e75dc7e22a96eae21c39a2fbca28181889237f8

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.