Contract 0xf0C8376065fadfACB706caFbaaC96B321069C015

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x780f415fc2749199ca5f0c8bcb3bb8ad8cd8191ce7ba357c21ced16d729218cbHeartbeat403053932023-03-13 17:15:028 days 20 hrs ago zahidul02.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.196366230732 139.485951855
0x483335495d2c2d46421dd6a8bd3517c12bdd10ad96bb1ccc60078b78b0f71a9fHeartbeat400783952023-03-07 17:49:3414 days 20 hrs ago0xfb7ff07f37ae0f1fafdd3cb8c6b7956f3b3619ba IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.063805837022 86.579195786
0xf64c4df8a85751131415145221d0dd113183007e34a4b72daa2677b47ef8b443Heartbeat399622492023-03-04 17:37:0017 days 20 hrs ago0x7359d046576e285458c73260cb0172d542c37669 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.121734562778 78.182570801
0x111bbdecdb3e16d0d30843c6a33f6c8ab9c8b0ae8c48149a214f6b17353b0003Heartbeat397094452023-02-25 22:12:3324 days 15 hrs ago0x0851dae86b9504adb9aca6bb7031e178d0236faf IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.233689819721 121.048626021
0xc873c786512df61f77e29cd65dadfa3b0fb4da779592025144e5623f1de3ff15Heartbeat393971012023-02-17 14:14:4932 days 23 hrs ago zubair42008066.nft  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.356948243968184.895065367
0x4ed159dbf4d37c71eb75498f061c149df7145ff49f1ab9341b56b1ce245ee6d1Heartbeat390904842023-02-09 8:57:2241 days 5 hrs ago0xea3246957e3548fadf56301af6e020fa288af8ba IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.300664202271
0xaefce5d2d0d5742f38c3f14176bd98b3a39a091a18aecfe0bafbaa0d2cbd669cHeartbeat389116842023-02-04 19:27:2545 days 18 hrs ago cryptokoh11.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.233653422006101.390600431
0x77347032725eb46b115cf66edc42e96d2a08c0b379a4b03357cd37e38af0b68fHeartbeat385120162023-01-25 14:25:1055 days 23 hrs ago0x64e6236fb72bbe4deb5c7b881386944207f80d8b IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.014181020802 65.583950213
0x230f0e6d6523baf44c4d969a8936ce646f795a909680956e9aef5dc40863d39cHeartbeat384869502023-01-24 23:25:1456 days 14 hrs ago makesomenoises.blockchain  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.021502104421 99.442273268
0xe690642dfc517372b04b079cec5e7cb9223873fca525ead978b4336b7d4b1cf4Heartbeat384594292023-01-24 6:44:3757 days 7 hrs ago nagaraj007.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.010000933956 46.252012729
0x68a437db1549427aff674ed4243d581c1d59b0e4a5cb05c71f202bcac4c161cfHeartbeat384304172023-01-23 13:24:2858 days 33 mins ago cryptomario21.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.042482137667 57.644715376
0x93e8b4f743182f7002dcf39a0597021e93bfa969c5df8f82e4642a5fc9c2e919Heartbeat383170262023-01-20 17:10:5260 days 20 hrs ago0x92abbdc63374711db3ebef48f5fb7fcbc8790cb5 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.008742428921 61.605880682
0x41d160da22ecebafb270a95b3f8ca55939d8d4eaf3c61ece01c848ede7f564c1Heartbeat383091442023-01-20 12:25:1961 days 1 hr ago0x590be3e862809b80c9c23511e60d0a04ca5d8948 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.061765617272 55.671683458
0x7c0d3bdac30ea07d0a5369ed4a426d601dee7e0686a6cf5a9f79f1cdd67db913Heartbeat381118432023-01-15 13:57:4466 days ago0x6ea0e36beeb42641e2e3b4a88219e77fe54e0712 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.074175016893 77.232738233
0x855f61f001239e8f7e11dc00da6e5269d6716da2f3d8924b1ebc4e9471220b35Heartbeat379564662023-01-11 20:19:0769 days 17 hrs ago0x7ef06ad8625e5f9f356d17888fe92a925486c9b8 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.005660932275 39.891284385
0x35621a2f52d7f874c82871963bdfad104b41a84cc51c9cc4579f2a1001c0eac5Heartbeat379345292023-01-11 7:35:5270 days 6 hrs ago 221102.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.045731887897 44.188515613
0x0519f6fac0ab8abbbcdc49d052310bc9484b51e4061e5f9f5fc232087c5c74b7Heartbeat377574012023-01-06 21:43:4674 days 16 hrs ago0x62424dc663c2e8a4df2e24897d0cc590f4370541 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.052537185708 71.288576402
0xb29b8303b445fee696910dc874484cc84ef5abcfca2e78f81f939de538d633b6Heartbeat376410972023-01-03 23:46:1577 days 14 hrs ago0xea3246957e3548fadf56301af6e020fa288af8ba IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.014528250
0x6e918178a81553d36cfaa14e053ce42f8dc098c5f8dd4f377ba04b05c86ba11eHeartbeat375976152023-01-02 21:54:0578 days 16 hrs ago0x235d59d3d10797aa3b5be4e7be4d155115381b52 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.004878668373 34.378851048
0x70c4c26aaa86660c9f037f9a710bcd99c60b4d16a37198bba484ea7b349bd5beHeartbeat375902412023-01-02 17:40:1878 days 20 hrs ago0xdb1b98a4ce93895e9a553368d66f94a111212b3e IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.006002565049 42.298691767
0x998d58cd3069e61c2a92698d8ba53384c282ace6f32b7947dad84851501636e5Heartbeat375778592023-01-02 10:17:2779 days 3 hrs ago readthisplease85.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.036112027556 40.762636788
0x17a838c2d80a55ec2eea6c88c4877bc1e0fd9da721709ccb00e892c4f203c31bHeartbeat374321882022-12-29 19:56:2482 days 18 hrs ago jesiigh9.nft  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.007382775713 52.024718048
0xda5ea8dfef40b9c0ed853b35cc10ce7d7139cef974dc1cb2affb016b45cc07adHeartbeat374192192022-12-29 12:21:4183 days 1 hr ago0x14def438f2224a33c6bfa20aaa091e8fb43293e0 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.009285488728 42.943243577
0x86fff4101a99c01babc2e566c57f29adc75236a59c068e6b0f1b77e6bdd6bb94Heartbeat373851642022-12-28 16:07:0283 days 21 hrs ago boredape123.wallet  IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.057708005745 71.119071249
0x2c728897d1f1f73b4e2c1565418476d9ebe6224eba4dac6b1543b0127e80d869Heartbeat372534122022-12-25 9:22:0687 days 4 hrs ago0x9ed5d17b65c22361213dc05cfb7cf699d5fa5be5 IN  0xf0c8376065fadfacb706cafbaac96b321069c0150 MATIC0.045671397135 51.553089067
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Celeste

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-11-29
*/

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/Uint256Helpers.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity ^0.5.8;


library Uint256Helpers {
    uint256 private constant MAX_UINT8 = uint8(-1);
    uint256 private constant MAX_UINT64 = uint64(-1);

    string private constant ERROR_UINT8_NUMBER_TOO_BIG = "UINT8_NUMBER_TOO_BIG";
    string private constant ERROR_UINT64_NUMBER_TOO_BIG = "UINT64_NUMBER_TOO_BIG";

    function toUint8(uint256 a) internal pure returns (uint8) {
        require(a <= MAX_UINT8, ERROR_UINT8_NUMBER_TOO_BIG);
        return uint8(a);
    }

    function toUint64(uint256 a) internal pure returns (uint64) {
        require(a <= MAX_UINT64, ERROR_UINT64_NUMBER_TOO_BIG);
        return uint64(a);
    }
}

// File: contracts/lib/os/IsContract.sol

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/IsContract.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity ^0.5.8;


contract IsContract {
    /*
    * NOTE: this should NEVER be used for authentication
    * (see pitfalls: https://github.com/fergarrui/ethereum-security/tree/master/contracts/extcodesize).
    *
    * This is only intended to be used as a sanity check that an address is actually a contract,
    * RATHER THAN an address not being a contract.
    */
    function isContract(address _target) internal view returns (bool) {
        if (_target == address(0)) {
            return false;
        }

        uint256 size;
        assembly { size := extcodesize(_target) }
        return size > 0;
    }
}

// File: contracts/lib/os/SafeMath64.sol

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/math/SafeMath64.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity ^0.5.8;


/**
 * @title SafeMath64
 * @dev Math operations for uint64 with safety checks that revert on error
 */
library SafeMath64 {
    string private constant ERROR_ADD_OVERFLOW = "MATH64_ADD_OVERFLOW";
    string private constant ERROR_SUB_UNDERFLOW = "MATH64_SUB_UNDERFLOW";
    string private constant ERROR_MUL_OVERFLOW = "MATH64_MUL_OVERFLOW";
    string private constant ERROR_DIV_ZERO = "MATH64_DIV_ZERO";

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint64 _a, uint64 _b) internal pure returns (uint64) {
        uint256 c = uint256(_a) * uint256(_b);
        require(c < 0x010000000000000000, ERROR_MUL_OVERFLOW); // 2**64 (less gas this way)

        return uint64(c);
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint64 _a, uint64 _b) internal pure returns (uint64) {
        require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0
        uint64 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint64 _a, uint64 _b) internal pure returns (uint64) {
        require(_b <= _a, ERROR_SUB_UNDERFLOW);
        uint64 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint64 _a, uint64 _b) internal pure returns (uint64) {
        uint64 c = _a + _b;
        require(c >= _a, ERROR_ADD_OVERFLOW);

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b != 0, ERROR_DIV_ZERO);
        return a % b;
    }
}

// File: contracts/lib/os/TimeHelpers.sol

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/TimeHelpers.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity ^0.5.8;



contract TimeHelpers {
    using Uint256Helpers for uint256;

    /**
    * @dev Returns the current block number.
    *      Using a function rather than `block.number` allows us to easily mock the block number in
    *      tests.
    */
    function getBlockNumber() internal view returns (uint256) {
        return block.number;
    }

    /**
    * @dev Returns the current block number, converted to uint64.
    *      Using a function rather than `block.number` allows us to easily mock the block number in
    *      tests.
    */
    function getBlockNumber64() internal view returns (uint64) {
        return getBlockNumber().toUint64();
    }

    /**
    * @dev Returns the current timestamp.
    *      Using a function rather than `block.timestamp` allows us to easily mock it in
    *      tests.
    */
    function getTimestamp() internal view returns (uint256) {
        return block.timestamp; // solium-disable-line security/no-block-members
    }

    /**
    * @dev Returns the current timestamp, converted to uint64.
    *      Using a function rather than `block.timestamp` allows us to easily mock it in
    *      tests.
    */
    function getTimestamp64() internal view returns (uint64) {
        return getTimestamp().toUint64();
    }
}

// File: contracts/lib/os/ERC20.sol

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/token/ERC20.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity ^0.5.8;


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
    function totalSupply() public view returns (uint256);

    function balanceOf(address _who) public view returns (uint256);

    function allowance(address _owner, address _spender) public view returns (uint256);

    function transfer(address _to, uint256 _value) public returns (bool);

    function approve(address _spender, uint256 _value) public returns (bool);

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool);

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// File: contracts/court/clock/IClock.sol

pragma solidity ^0.5.8;


interface IClock {
    /**
    * @dev Ensure that the current term of the clock is up-to-date
    * @return Identification number of the current term
    */
    function ensureCurrentTerm() external returns (uint64);

    /**
    * @dev Transition up to a certain number of terms to leave the clock up-to-date
    * @param _maxRequestedTransitions Max number of term transitions allowed by the sender
    * @return Identification number of the term ID after executing the heartbeat transitions
    */
    function heartbeat(uint64 _maxRequestedTransitions) external returns (uint64);

    /**
    * @dev Ensure that a certain term has its randomness set
    * @return Randomness of the current term
    */
    function ensureCurrentTermRandomness() external returns (bytes32);

    /**
    * @dev Tell the last ensured term identification number
    * @return Identification number of the last ensured term
    */
    function getLastEnsuredTermId() external view returns (uint64);

    /**
    * @dev Tell the current term identification number. Note that there may be pending term transitions.
    * @return Identification number of the current term
    */
    function getCurrentTermId() external view returns (uint64);

    /**
    * @dev Tell the number of terms the clock should transition to be up-to-date
    * @return Number of terms the clock should transition to be up-to-date
    */
    function getNeededTermTransitions() external view returns (uint64);

    /**
    * @dev Tell the information related to a term based on its ID
    * @param _termId ID of the term being queried
    * @return startTime Term start time
    * @return randomnessBN Block number used for randomness in the requested term
    * @return randomness Randomness computed for the requested term
    * @return celesteTokenTotalSupply Total supply of the Celeste token
    */
    function getTerm(uint64 _termId) external view returns (uint64 startTime, uint64 randomnessBN, bytes32 randomness, uint256 celesteTokenTotalSupply);

    /**
    * @dev Tell the randomness of a term even if it wasn't computed yet
    * @param _termId Identification number of the term being queried
    * @return Randomness of the requested term
    */
    function getTermRandomness(uint64 _termId) external view returns (bytes32);

    /**
    * @dev Tell the total supply of the celeste token at a specific term
    * @param _termId Identification number of the term being queried
    * @return Total supply of celeste token
    */
    function getTermTokenTotalSupply(uint64 _termId) external view returns (uint256);
}

// File: contracts/court/clock/CourtClock.sol

pragma solidity ^0.5.8;






contract CourtClock is IClock, TimeHelpers {
    using SafeMath64 for uint64;

    string private constant ERROR_TERM_DOES_NOT_EXIST = "CLK_TERM_DOES_NOT_EXIST";
    string private constant ERROR_TERM_DURATION_TOO_LONG = "CLK_TERM_DURATION_TOO_LONG";
    string private constant ERROR_TERM_RANDOMNESS_NOT_YET = "CLK_TERM_RANDOMNESS_NOT_YET";
    string private constant ERROR_TERM_RANDOMNESS_UNAVAILABLE = "CLK_TERM_RANDOMNESS_UNAVAILABLE";
    string private constant ERROR_BAD_FIRST_TERM_START_TIME = "CLK_BAD_FIRST_TERM_START_TIME";
    string private constant ERROR_TOO_MANY_TRANSITIONS = "CLK_TOO_MANY_TRANSITIONS";
    string private constant ERROR_INVALID_TRANSITION_TERMS = "CLK_INVALID_TRANSITION_TERMS";
    string private constant ERROR_CANNOT_DELAY_STARTED_COURT = "CLK_CANNOT_DELAY_STARTED_COURT";
    string private constant ERROR_CANNOT_DELAY_PAST_START_TIME = "CLK_CANNOT_DELAY_PAST_START_TIME";

    // Maximum number of term transitions a callee may have to assume in order to call certain functions that require the Court being up-to-date
    uint64 internal constant MAX_AUTO_TERM_TRANSITIONS_ALLOWED = 1;

    // Max duration in seconds that a term can last
    uint64 internal constant MAX_TERM_DURATION = 365 days;

    // Max time until first term starts since contract is deployed
    uint64 internal constant MAX_FIRST_TERM_DELAY_PERIOD = 2 * MAX_TERM_DURATION;

    struct Term {
        uint64 startTime;              // Timestamp when the term started
        uint64 randomnessBN;           // Block number for entropy
        bytes32 randomness;            // Entropy from randomnessBN block hash
        uint256 celesteTokenTotalSupply;
    }

    // Duration in seconds for each term of the Court
    uint64 private termDuration;

    // Last ensured term id
    uint64 private termId;

    // List of Court terms indexed by id
    mapping (uint64 => Term) private terms;

    event Heartbeat(uint64 previousTermId, uint64 currentTermId);
    event StartTimeDelayed(uint64 previousStartTime, uint64 currentStartTime);

    /**
    * @dev Ensure a certain term has already been processed
    * @param _termId Identification number of the term to be checked
    */
    modifier termExists(uint64 _termId) {
        require(_termId <= termId, ERROR_TERM_DOES_NOT_EXIST);
        _;
    }

    /**
    * @dev Constructor function
    * @param _termParams Array containing:
    *        0. _termDuration Duration in seconds per term
    *        1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding)
    */
    constructor(uint64[2] memory _termParams, ERC20 _celesteToken) public {
        uint64 _termDuration = _termParams[0];
        uint64 _firstTermStartTime = _termParams[1];

        require(_termDuration < MAX_TERM_DURATION, ERROR_TERM_DURATION_TOO_LONG);
        require(_firstTermStartTime >= getTimestamp64() + _termDuration, ERROR_BAD_FIRST_TERM_START_TIME);
        require(_firstTermStartTime <= getTimestamp64() + MAX_FIRST_TERM_DELAY_PERIOD, ERROR_BAD_FIRST_TERM_START_TIME);

        termDuration = _termDuration;

        // No need for SafeMath: we already checked values above
        terms[0].startTime = _firstTermStartTime - _termDuration;
        terms[0].celesteTokenTotalSupply = _celesteToken.totalSupply();
    }

    /**
    * @notice Ensure that the current term of the Court is up-to-date. If the Court is outdated by more than `MAX_AUTO_TERM_TRANSITIONS_ALLOWED`
    *         terms, the heartbeat function must be called manually instead.
    * @return Identification number of the current term
    */
    function ensureCurrentTerm() external returns (uint64) {
        return _ensureCurrentTerm();
    }

    /**
    * @notice Transition up to `_maxRequestedTransitions` terms
    * @param _maxRequestedTransitions Max number of term transitions allowed by the sender
    * @return Identification number of the term ID after executing the heartbeat transitions
    */
    function heartbeat(uint64 _maxRequestedTransitions) external returns (uint64) {
        return _heartbeat(_maxRequestedTransitions);
    }

    /**
    * @notice Ensure that a certain term has its randomness set. As we allow to draft disputes requested for previous terms, if there
    *      were mined more than 256 blocks for the current term, the blockhash of its randomness BN is no longer available, given
    *      round will be able to be drafted in the following term.
    * @return Randomness of the current term
    */
    function ensureCurrentTermRandomness() external returns (bytes32) {
        // If the randomness for the given term was already computed, return
        uint64 currentTermId = termId;
        Term storage term = terms[currentTermId];
        bytes32 termRandomness = term.randomness;
        if (termRandomness != bytes32(0)) {
            return termRandomness;
        }

        // Compute term randomness
        bytes32 newRandomness = _computeTermRandomness(currentTermId);
        require(newRandomness != bytes32(0), ERROR_TERM_RANDOMNESS_UNAVAILABLE);
        term.randomness = newRandomness;
        return newRandomness;
    }

    /**
    * @dev Tell the term duration of the Court
    * @return Duration in seconds of the Court term
    */
    function getTermDuration() external view returns (uint64) {
        return termDuration;
    }

    /**
    * @dev Tell the last ensured term identification number
    * @return Identification number of the last ensured term
    */
    function getLastEnsuredTermId() external view returns (uint64) {
        return _lastEnsuredTermId();
    }

    /**
    * @dev Tell the current term identification number. Note that there may be pending term transitions.
    * @return Identification number of the current term
    */
    function getCurrentTermId() external view returns (uint64) {
        return _currentTermId();
    }

    /**
    * @dev Tell the number of terms the Court should transition to be up-to-date
    * @return Number of terms the Court should transition to be up-to-date
    */
    function getNeededTermTransitions() external view returns (uint64) {
        return _neededTermTransitions();
    }

    /**
    * @dev Tell the information related to a term based on its ID. Note that if the term has not been reached, the
    *      information returned won't be computed yet. This function allows querying future terms that were not computed yet.
    * @param _termId ID of the term being queried
    * @return startTime Term start time
    * @return randomnessBN Block number used for randomness in the requested term
    * @return randomness Randomness computed for the requested term
    * @return celesteTokenTotalSupply Total supply of the Celeste token
    */
    function getTerm(uint64 _termId) external view returns (uint64 startTime, uint64 randomnessBN, bytes32 randomness, uint256 celesteTokenTotalSupply) {
        Term storage term = terms[_termId];
        return (term.startTime, term.randomnessBN, term.randomness, term.celesteTokenTotalSupply);
    }

    /**
    * @dev Tell the randomness of a term even if it wasn't computed yet
    * @param _termId Identification number of the term being queried
    * @return Randomness of the requested term
    */
    function getTermRandomness(uint64 _termId) external view termExists(_termId) returns (bytes32) {
        return _computeTermRandomness(_termId);
    }

    /**
    * @dev Tell the total supply of the celeste token at a specific term
    * @param _termId Identification number of the term being queried
    * @return Total supply of celeste token
    */
    function getTermTokenTotalSupply(uint64 _termId) external view termExists(_termId) returns (uint256) {
        return terms[_termId].celesteTokenTotalSupply;
    }

    /**
    * @dev Internal function to ensure that the current term of the Court is up-to-date. If the Court is outdated by more than
    *      `MAX_AUTO_TERM_TRANSITIONS_ALLOWED` terms, the heartbeat function must be called manually.
    * @return Identification number of the resultant term ID after executing the corresponding transitions
    */
    function _ensureCurrentTerm() internal returns (uint64) {
        // Check the required number of transitions does not exceeds the max allowed number to be processed automatically
        uint64 requiredTransitions = _neededTermTransitions();
        require(requiredTransitions <= MAX_AUTO_TERM_TRANSITIONS_ALLOWED, ERROR_TOO_MANY_TRANSITIONS);

        // If there are no transitions pending, return the last ensured term id
        if (uint256(requiredTransitions) == 0) {
            return termId;
        }

        // Process transition if there is at least one pending
        return _heartbeat(requiredTransitions);
    }

    /**
    * @dev Internal function to transition the Court terms up to a requested number of terms
    * @param _maxRequestedTransitions Max number of term transitions allowed by the sender
    * @return Identification number of the resultant term ID after executing the requested transitions
    */
    function _heartbeat(uint64 _maxRequestedTransitions) internal returns (uint64) {
        // Transition the minimum number of terms between the amount requested and the amount actually needed
        uint64 neededTransitions = _neededTermTransitions();
        uint256 transitions = uint256(_maxRequestedTransitions < neededTransitions ? _maxRequestedTransitions : neededTransitions);
        require(transitions > 0, ERROR_INVALID_TRANSITION_TERMS);

        uint64 blockNumber = getBlockNumber64();
        uint64 previousTermId = termId;
        uint64 currentTermId = previousTermId;
        for (uint256 transition = 1; transition <= transitions; transition++) {
            // Term IDs are incremented by one based on the number of time periods since the Court started. Since time is represented in uint64,
            // even if we chose the minimum duration possible for a term (1 second), we can ensure terms will never reach 2^64 since time is
            // already assumed to fit in uint64.
            Term storage previousTerm = terms[currentTermId++];
            Term storage currentTerm = terms[currentTermId];
            (ERC20 feeToken,,,,,, uint256[4] memory jurorsParams) = _getConfig(currentTermId);
            _onTermTransitioned(currentTermId);

            // Set the start time of the new term. Note that we are using a constant term duration value to guarantee
            // equally long terms, regardless of heartbeats.
            currentTerm.startTime = previousTerm.startTime.add(termDuration);

            // In order to draft a random number of jurors in a term, we use a randomness factor for each term based on a
            // block number that is set once the term has started. Note that this information could not be known beforehand.
            currentTerm.randomnessBN = blockNumber + 1;

            // We check if the feeTokenTotalSupply is set, which means this networks feeToken doesn't have an accurate
            // totalSupply so we will use the hardcoded value
            currentTerm.celesteTokenTotalSupply = jurorsParams[3] > 0 ? jurorsParams[3] : feeToken.totalSupply();
        }

        termId = currentTermId;
        emit Heartbeat(previousTermId, currentTermId);
        return currentTermId;
    }

    /**
    * @dev Internal function to delay the first term start time only if it wasn't reached yet
    * @param _newFirstTermStartTime New timestamp in seconds when the court will open
    */
    function _delayStartTime(uint64 _newFirstTermStartTime) internal {
        require(_currentTermId() == 0, ERROR_CANNOT_DELAY_STARTED_COURT);

        Term storage term = terms[0];
        uint64 currentFirstTermStartTime = term.startTime.add(termDuration);
        require(_newFirstTermStartTime > currentFirstTermStartTime, ERROR_CANNOT_DELAY_PAST_START_TIME);

        // No need for SafeMath: we already checked above that `_newFirstTermStartTime` > `currentFirstTermStartTime` >= `termDuration`
        term.startTime = _newFirstTermStartTime - termDuration;
        emit StartTimeDelayed(currentFirstTermStartTime, _newFirstTermStartTime);
    }

    /**
    * @dev Internal function to notify when a term has been transitioned. This function must be overridden to provide custom behavior.
    * @param _termId Identification number of the new current term that has been transitioned
    */
    function _onTermTransitioned(uint64 _termId) internal;

    /**
    * @dev Internal function to tell the last ensured term identification number
    * @return Identification number of the last ensured term
    */
    function _lastEnsuredTermId() internal view returns (uint64) {
        return termId;
    }

    /**
    * @dev Internal function to tell the current term identification number. Note that there may be pending term transitions.
    * @return Identification number of the current term
    */
    function _currentTermId() internal view returns (uint64) {
        return termId.add(_neededTermTransitions());
    }

    /**
    * @dev Internal function to tell the number of terms the Court should transition to be up-to-date
    * @return Number of terms the Court should transition to be up-to-date
    */
    function _neededTermTransitions() internal view returns (uint64) {
        // Note that the Court is always initialized providing a start time for the first-term in the future. If that's the case,
        // no term transitions are required.
        uint64 currentTermStartTime = terms[termId].startTime;
        if (getTimestamp64() < currentTermStartTime) {
            return uint64(0);
        }

        // No need for SafeMath: we already know that the start time of the current term is in the past
        return (getTimestamp64() - currentTermStartTime) / termDuration;
    }

    /**
    * @dev Internal function to compute the randomness that will be used to draft jurors for the given term. This
    *      function assumes the given term exists. To determine the randomness factor for a term we use the hash of a
    *      block number that is set once the term has started to ensure it cannot be known beforehand. Note that the
    *      hash function being used only works for the 256 most recent block numbers.
    * @param _termId Identification number of the term being queried
    * @return Randomness computed for the given term
    */
    function _computeTermRandomness(uint64 _termId) internal view returns (bytes32) {
        Term storage term = terms[_termId];
        require(getBlockNumber64() > term.randomnessBN, ERROR_TERM_RANDOMNESS_NOT_YET);
        return blockhash(term.randomnessBN);
    }

    /**
    * @dev Tell the full Court configuration parameters at a certain term
    * @param _termId Identification number of the term querying the Court config of
    * @return token Address of the token used to pay for fees
    * @return fees Array containing:
    *         0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *         1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *         2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @return maxRulingOptions Max number of selectable outcomes for each dispute
    * @return roundParams Array containing durations of phases of a dispute and other params for rounds:
    *         0. evidenceTerms Max submitting evidence period duration in terms
    *         1. commitTerms Commit period duration in terms
    *         2. revealTerms Reveal period duration in terms
    *         3. appealTerms Appeal period duration in terms
    *         4. appealConfirmationTerms Appeal confirmation period duration in terms
    *         5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *         6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *         7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *         8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @return pcts Array containing:
    *         0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *         1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @return appealCollateralParams Array containing params for appeal collateral:
    *         0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *         1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @return jurorsParams Array containing params for juror registry:
    *         0. minActiveBalance Minimum amount of juror tokens that can be activated
    *         1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *         2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *         3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do

    */
    function _getConfig(uint64 _termId) internal view returns (
        ERC20 feeToken,
        uint256[3] memory fees,
        uint8 maxRulingOptions,
        uint64[9] memory roundParams,
        uint16[2] memory pcts,
        uint256[2] memory appealCollateralParams,
        uint256[4] memory jurorsParams
    );
}

// File: contracts/court/config/IConfig.sol

pragma solidity ^0.5.8;



interface IConfig {

    /**
    * @dev Tell the full Court configuration parameters at a certain term
    * @param _termId Identification number of the term querying the Court config of
    * @return token Address of the token used to pay for fees
    * @return fees Array containing:
    *         0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *         1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *         2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @return maxRulingOptions Max number of selectable outcomes for each dispute
    * @return roundParams Array containing durations of phases of a dispute and other params for rounds:
    *         0. evidenceTerms Max submitting evidence period duration in terms
    *         1. commitTerms Commit period duration in terms
    *         2. revealTerms Reveal period duration in terms
    *         3. appealTerms Appeal period duration in terms
    *         4. appealConfirmationTerms Appeal confirmation period duration in terms
    *         5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *         6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *         7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *         8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @return pcts Array containing:
    *         0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *         1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @return appealCollateralParams Array containing params for appeal collateral:
    *         0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *         1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @return jurorsParams Array containing params for juror registry:
    *         0. minActiveBalance Minimum amount of juror tokens that can be activated
    *         1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *         2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *         3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function getConfig(uint64 _termId) external view
        returns (
            ERC20 feeToken,
            uint256[3] memory fees,
            uint8 maxRulingOptions,
            uint64[9] memory roundParams,
            uint16[2] memory pcts,
            uint256[2] memory appealCollateralParams,
            uint256[4] memory jurorsParams
        );

    /**
    * @dev Tell the draft config at a certain term
    * @param _termId Identification number of the term querying the draft config of
    * @return feeToken Address of the token used to pay for fees
    * @return draftFee Amount of fee tokens per juror to cover the drafting cost
    * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    */
    function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct);

    /**
    * @dev Tell the min active balance config at a certain term
    * @param _termId Term querying the min active balance config of
    * @return Minimum amount of tokens jurors have to activate to participate in the Court
    */
    function getMinActiveBalance(uint64 _termId) external view returns (uint256);

    /**
    * @dev Tell whether a certain holder accepts automatic withdrawals of tokens or not
    * @return True if the given holder accepts automatic withdrawals of their tokens, false otherwise
    */
    function areWithdrawalsAllowedFor(address _holder) external view returns (bool);
}

// File: contracts/court/config/CourtConfigData.sol

pragma solidity ^0.5.8;



contract CourtConfigData {

    struct Config {
        FeesConfig fees;                        // Full fees-related config
        DisputesConfig disputes;                // Full disputes-related config
        JurorsConfig jurors;                    // Full juror-related config
    }

    struct FeesConfig {
        ERC20 token;                            // ERC20 token to be used for the fees of the Court
        uint16 finalRoundReduction;             // Permyriad of fees reduction applied for final appeal round (‱ - 1/10,000)
        uint256 jurorFee;                       // Amount of tokens paid to draft a juror to adjudicate a dispute
        uint256 draftFee;                       // Amount of tokens paid per round to cover the costs of drafting jurors
        uint256 settleFee;                      // Amount of tokens paid per round to cover the costs of slashing jurors
    }

    struct DisputesConfig {
        uint8 maxRulingOptions;                 // Max number of ruling options selectable by jurors for a dispute
        uint64 evidenceTerms;                   // Max submitting evidence period duration in terms
        uint64 commitTerms;                     // Committing period duration in terms
        uint64 revealTerms;                     // Revealing period duration in terms
        uint64 appealTerms;                     // Appealing period duration in terms
        uint64 appealConfirmTerms;              // Confirmation appeal period duration in terms
        uint16 penaltyPct;                      // Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
        uint64 firstRoundJurorsNumber;          // Number of jurors drafted on first round
        uint64 appealStepFactor;                // Factor in which the jurors number is increased on each appeal
        uint64 finalRoundLockTerms;             // Period a coherent juror in the final round will remain locked
        uint256 maxRegularAppealRounds;         // Before the final appeal
        uint256 appealCollateralFactor;         // Permyriad multiple of dispute fees required to appeal a preliminary ruling (‱ - 1/10,000)
        uint256 appealConfirmCollateralFactor;  // Permyriad multiple of dispute fees required to confirm appeal (‱ - 1/10,000)
    }

    struct JurorsConfig {
        uint256 minActiveBalance;               // Minimum amount of tokens jurors have to activate to participate in the Court
        uint256 minMaxPctTotalSupply;           // Minimum max percent of the total supply a juror can activate, applied for total supply active stake
        uint256 maxMaxPctTotalSupply;           // Maximum max percent of the total supply a juror can activate, applied for 0 active stake
        uint256 feeTokenTotalSupply;            // Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    }

    struct DraftConfig {
        ERC20 feeToken;                         // ERC20 token to be used for the fees of the Court
        uint16 penaltyPct;                      // Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
        uint256 draftFee;                       // Amount of tokens paid per round to cover the costs of drafting jurors
    }
}

// File: contracts/lib/os/SafeMath.sol

// Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/math/SafeMath.sol
// Adapted to use pragma ^0.5.8 and satisfy our linter rules

pragma solidity >=0.4.24 <0.6.0;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {
    string private constant ERROR_ADD_OVERFLOW = "MATH_ADD_OVERFLOW";
    string private constant ERROR_SUB_UNDERFLOW = "MATH_SUB_UNDERFLOW";
    string private constant ERROR_MUL_OVERFLOW = "MATH_MUL_OVERFLOW";
    string private constant ERROR_DIV_ZERO = "MATH_DIV_ZERO";

    /**
    * @dev Multiplies two numbers, reverts on 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-solidity/pull/522
        if (_a == 0) {
            return 0;
        }

        uint256 c = _a * _b;
        require(c / _a == _b, ERROR_MUL_OVERFLOW);

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0
        uint256 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b <= _a, ERROR_SUB_UNDERFLOW);
        uint256 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
        uint256 c = _a + _b;
        require(c >= _a, ERROR_ADD_OVERFLOW);

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, ERROR_DIV_ZERO);
        return a % b;
    }
}

// File: contracts/lib/PctHelpers.sol

pragma solidity ^0.5.8;



library PctHelpers {
    using SafeMath for uint256;

    uint256 internal constant PCT_BASE = 10000; // ‱ (1 / 10,000)
    uint256 internal constant PCT_BASE_HIGH_PRECISION = 1e18; // 100%

    function isValid(uint16 _pct) internal pure returns (bool) {
        return _pct <= PCT_BASE;
    }

    function isValidHighPrecision(uint256 _pct) internal pure returns (bool) {
        return _pct <= PCT_BASE_HIGH_PRECISION;
    }

    function pct(uint256 self, uint16 _pct) internal pure returns (uint256) {
        return self.mul(uint256(_pct)) / PCT_BASE;
    }

    function pct256(uint256 self, uint256 _pct) internal pure returns (uint256) {
        return self.mul(_pct) / PCT_BASE;
    }

    function pctHighPrecision(uint256 self, uint256 _pct) internal pure returns (uint256) {
        return self.mul(_pct) / PCT_BASE_HIGH_PRECISION;
    }

    function pctIncrease(uint256 self, uint16 _pct) internal pure returns (uint256) {
        // No need for SafeMath: for addition note that `PCT_BASE` is lower than (2^256 - 2^16)
        return self.mul(PCT_BASE + uint256(_pct)) / PCT_BASE;
    }
}

// File: contracts/court/config/CourtConfig.sol

pragma solidity ^0.5.8;







contract CourtConfig is IConfig, CourtConfigData {
    using SafeMath64 for uint64;
    using PctHelpers for uint256;

    string private constant ERROR_TOO_OLD_TERM = "CONF_TOO_OLD_TERM";
    string private constant ERROR_RULING_OPTIONS_LESS_THAN_MIN = "CONF_RULING_OPTIONS_LESS_THAN_MIN";
    string private constant ERROR_RULING_OPTIONS_MORE_THAN_MAX = "CONF_RULING_OPTIONS_MORE_THAN_MAX";
    string private constant ERROR_INVALID_PENALTY_PCT = "CONF_INVALID_PENALTY_PCT";
    string private constant ERROR_INVALID_FINAL_ROUND_REDUCTION_PCT = "CONF_INVALID_FINAL_ROUND_RED_PCT";
    string private constant ERROR_INVALID_MAX_APPEAL_ROUNDS = "CONF_INVALID_MAX_APPEAL_ROUNDS";
    string private constant ERROR_LARGE_ROUND_PHASE_DURATION = "CONF_LARGE_ROUND_PHASE_DURATION";
    string private constant ERROR_BAD_INITIAL_JURORS_NUMBER = "CONF_BAD_INITIAL_JURORS_NUMBER";
    string private constant ERROR_BAD_APPEAL_STEP_FACTOR = "CONF_BAD_APPEAL_STEP_FACTOR";
    string private constant ERROR_ZERO_COLLATERAL_FACTOR = "CONF_ZERO_COLLATERAL_FACTOR";
    string private constant ERROR_ZERO_MIN_ACTIVE_BALANCE = "CONF_ZERO_MIN_ACTIVE_BALANCE";
    string private constant ERROR_MIN_MAX_TOTAL_SUPPLY_ZERO = "CONF_MIN_MAX_TOTAL_SUPPLY_ZERO";
    string private constant ERROR_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT = "CONF_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT";
    string private constant ERROR_MIN_MORE_THAN_MAX_ACTIVE_PCT = "CONF_MIN_MORE_THAN_MAX_ACTIVE_PCT";

    // Max number of terms that each of the different adjudication states can last (if lasted 1h, this would be a year)
    uint64 internal constant MAX_ADJ_STATE_DURATION = 8670;

    // Cap the max number of regular appeal rounds
    uint256 internal constant MAX_REGULAR_APPEAL_ROUNDS_LIMIT = 10;

    // Future term ID in which a config change has been scheduled
    uint64 private configChangeTermId;

    // List of all the configs used in the Court
    Config[] private configs;

    // List of configs indexed by id
    mapping (uint64 => uint256) private configIdByTerm;

    // Holders opt-in config for automatic withdrawals
    mapping (address => bool) private withdrawalsAllowed;

    event NewConfig(uint64 fromTermId, uint64 courtConfigId);
    event AutomaticWithdrawalsAllowedChanged(address indexed holder, bool allowed);

    /**
    * @dev Constructor function
    * @param _feeToken Address of the token contract that is used to pay for fees
    * @param _fees Array containing:
    *        0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *        1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *        2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @param _maxRulingOptions Max number of selectable outcomes for each dispute
    * @param _roundParams Array containing durations of phases of a dispute and other params for rounds:
    *        0. evidenceTerms Max submitting evidence period duration in terms
    *        1. commitTerms Commit period duration in terms
    *        2. revealTerms Reveal period duration in terms
    *        3. appealTerms Appeal period duration in terms
    *        4. appealConfirmationTerms Appeal confirmation period duration in terms
    *        5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *        6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *        7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *        8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @param _pcts Array containing:
    *        0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *        1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @param _appealCollateralParams Array containing params for appeal collateral:
    *        0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *        1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @param _jurorsParams Array containing params for juror registry:
    *        0. minActiveBalance Minimum amount of juror tokens that can be activated
    *        1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *        2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *        3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    constructor(
        ERC20 _feeToken,
        uint256[3] memory _fees,
        uint8 _maxRulingOptions,
        uint64[9] memory _roundParams,
        uint16[2] memory _pcts,
        uint256[2] memory _appealCollateralParams,
        uint256[4] memory _jurorsParams
    )
        public
    {
        // Leave config at index 0 empty for non-scheduled config changes
        configs.length = 1;
        _setConfig(
            0,
            0,
            _feeToken,
            _fees,
            _maxRulingOptions,
            _roundParams,
            _pcts,
            _appealCollateralParams,
            _jurorsParams
        );
    }

    /**
    * @notice Set the automatic withdrawals config for the sender to `_allowed`
    * @param _allowed Whether or not the automatic withdrawals are allowed by the sender
    */
    function setAutomaticWithdrawals(bool _allowed) external {
        withdrawalsAllowed[msg.sender] = _allowed;
        emit AutomaticWithdrawalsAllowedChanged(msg.sender, _allowed);
    }

    /**
    * @dev Tell the full Court configuration parameters at a certain term
    * @param _termId Identification number of the term querying the Court config of
    * @return token Address of the token used to pay for fees
    * @return fees Array containing:
    *         0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *         1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *         2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @return maxRulingOptions Max number of selectable outcomes for each dispute
    * @return roundParams Array containing durations of phases of a dispute and other params for rounds:
    *         0. evidenceTerms Max submitting evidence period duration in terms
    *         1. commitTerms Commit period duration in terms
    *         2. revealTerms Reveal period duration in terms
    *         3. appealTerms Appeal period duration in terms
    *         4. appealConfirmationTerms Appeal confirmation period duration in terms
    *         5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *         6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *         7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *         8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @return pcts Array containing:
    *         0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *         1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @return appealCollateralParams Array containing params for appeal collateral:
    *         0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *         1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @return jurorsParams Array containing params for juror registry:
    *         0. minActiveBalance Minimum amount of juror tokens that can be activated
    *         1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *         2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *         3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function getConfig(uint64 _termId) external view
        returns (
            ERC20 feeToken,
            uint256[3] memory fees,
            uint8 maxRulingOptions,
            uint64[9] memory roundParams,
            uint16[2] memory pcts,
            uint256[2] memory appealCollateralParams,
            uint256[4] memory jurorsParams
        );

    /**
    * @dev Tell the draft config at a certain term
    * @param _termId Identification number of the term querying the draft config of
    * @return feeToken Address of the token used to pay for fees
    * @return draftFee Amount of fee tokens per juror to cover the drafting cost
    * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    */
    function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct);

    /**
    * @dev Tell the min active balance config at a certain term
    * @param _termId Term querying the min active balance config of
    * @return Minimum amount of tokens jurors have to activate to participate in the Court
    */
    function getMinActiveBalance(uint64 _termId) external view returns (uint256);

    /**
    * @dev Tell whether a certain holder accepts automatic withdrawals of tokens or not
    * @param _holder Address of the token holder querying if withdrawals are allowed for
    * @return True if the given holder accepts automatic withdrawals of their tokens, false otherwise
    */
    function areWithdrawalsAllowedFor(address _holder) external view returns (bool) {
        return withdrawalsAllowed[_holder];
    }

    /**
    * @dev Tell the term identification number of the next scheduled config change
    * @return Term identification number of the next scheduled config change
    */
    function getConfigChangeTermId() external view returns (uint64) {
        return configChangeTermId;
    }

    /**
    * @dev Internal to make sure to set a config for the new term, it will copy the previous term config if none
    * @param _termId Identification number of the new current term that has been transitioned
    */
    function _ensureTermConfig(uint64 _termId) internal {
        // If the term being transitioned had no config change scheduled, keep the previous one
        uint256 currentConfigId = configIdByTerm[_termId];
        if (currentConfigId == 0) {
            uint256 previousConfigId = configIdByTerm[_termId.sub(1)];
            configIdByTerm[_termId] = previousConfigId;
        }
    }

    /**
    * @dev Assumes that sender it's allowed (either it's from governor or it's on init)
    * @param _termId Identification number of the current Court term
    * @param _fromTermId Identification number of the term in which the config will be effective at
    * @param _feeToken Address of the token contract that is used to pay for fees.
    * @param _fees Array containing:
    *        0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *        1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *        2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @param _maxRulingOptions Max number of selectable outcomes for each dispute
    * @param _roundParams Array containing durations of phases of a dispute and other params for rounds:
    *        0. evidenceTerms Max submitting evidence period duration in terms
    *        1. commitTerms Commit period duration in terms
    *        2. revealTerms Reveal period duration in terms
    *        3. appealTerms Appeal period duration in terms
    *        4. appealConfirmationTerms Appeal confirmation period duration in terms
    *        5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *        6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *        7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *        8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @param _pcts Array containing:
    *        0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *        1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @param _appealCollateralParams Array containing params for appeal collateral:
    *        0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *        1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @param _jurorsParams Array containing params for juror registry:
    *        0. minActiveBalance Minimum amount of juror tokens that can be activated
    *        1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *        2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *        3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function _setConfig(
        uint64 _termId,
        uint64 _fromTermId,
        ERC20 _feeToken,
        uint256[3] memory _fees,
        uint8 _maxRulingOptions,
        uint64[9] memory _roundParams,
        uint16[2] memory _pcts,
        uint256[2] memory _appealCollateralParams,
        uint256[4] memory _jurorsParams
    )
        internal
    {
        // If the current term is not zero, changes must be scheduled at least after the current period.
        // No need to ensure delays for on-going disputes since these already use their creation term for that.
        require(_termId == 0 || _fromTermId > _termId, ERROR_TOO_OLD_TERM);

        require(_maxRulingOptions >= 2, ERROR_RULING_OPTIONS_LESS_THAN_MIN);
        // Ruling options 0, 1 and 2 are reserved for special cases.
        require(_maxRulingOptions <= uint8(-1) - 3, ERROR_RULING_OPTIONS_MORE_THAN_MAX);

        // Make sure appeal collateral factors are greater than zero
        require(_appealCollateralParams[0] > 0 && _appealCollateralParams[1] > 0, ERROR_ZERO_COLLATERAL_FACTOR);

        // Make sure the given penalty and final round reduction pcts are not greater than 100%
        require(PctHelpers.isValid(_pcts[0]), ERROR_INVALID_PENALTY_PCT);
        require(PctHelpers.isValid(_pcts[1]), ERROR_INVALID_FINAL_ROUND_REDUCTION_PCT);

        // Disputes must request at least one juror to be drafted initially
        require(_roundParams[5] > 0, ERROR_BAD_INITIAL_JURORS_NUMBER);

        // Prevent that further rounds have zero jurors
        require(_roundParams[6] > 0, ERROR_BAD_APPEAL_STEP_FACTOR);

        // Make sure the max number of appeals allowed does not reach the limit
        uint256 _maxRegularAppealRounds = _roundParams[7];
        bool isMaxAppealRoundsValid = _maxRegularAppealRounds > 0 && _maxRegularAppealRounds <= MAX_REGULAR_APPEAL_ROUNDS_LIMIT;
        require(isMaxAppealRoundsValid, ERROR_INVALID_MAX_APPEAL_ROUNDS);

        // Make sure each adjudication round phase duration is valid
        for (uint i = 0; i < 5; i++) {
            require(_roundParams[i] > 0 && _roundParams[i] < MAX_ADJ_STATE_DURATION, ERROR_LARGE_ROUND_PHASE_DURATION);
        }

        // Make sure min active balance is not zero
        require(_jurorsParams[0] > 0, ERROR_ZERO_MIN_ACTIVE_BALANCE);
        // Make sure min max pct of total supply active balance is not zero
        require(_jurorsParams[1] > 0, ERROR_MIN_MAX_TOTAL_SUPPLY_ZERO);
        // Make sure the max max pct of total supply active balance is less than 100%
        require(PctHelpers.isValidHighPrecision(_jurorsParams[2]), ERROR_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT);
        // Make sure min max pct of total supply active balance is less than the max max pct of total supply active balance
        require(_jurorsParams[1] < _jurorsParams[2], ERROR_MIN_MORE_THAN_MAX_ACTIVE_PCT);

        // If there was a config change already scheduled, reset it (in that case we will overwrite last array item).
        // Otherwise, schedule a new config.
        if (configChangeTermId > _termId) {
            configIdByTerm[configChangeTermId] = 0;
        } else {
            configs.length++;
        }

        uint64 courtConfigId = uint64(configs.length - 1);
        Config storage config = configs[courtConfigId];

        config.fees = FeesConfig({
            token: _feeToken,
            jurorFee: _fees[0],
            draftFee: _fees[1],
            settleFee: _fees[2],
            finalRoundReduction: _pcts[1]
        });

        config.disputes = DisputesConfig({
            maxRulingOptions: _maxRulingOptions,
            evidenceTerms: _roundParams[0],
            commitTerms: _roundParams[1],
            revealTerms: _roundParams[2],
            appealTerms: _roundParams[3],
            appealConfirmTerms: _roundParams[4],
            penaltyPct: _pcts[0],
            firstRoundJurorsNumber: _roundParams[5],
            appealStepFactor: _roundParams[6],
            maxRegularAppealRounds: _maxRegularAppealRounds,
            finalRoundLockTerms: _roundParams[8],
            appealCollateralFactor: _appealCollateralParams[0],
            appealConfirmCollateralFactor: _appealCollateralParams[1]
        });

        config.jurors = JurorsConfig({
            minActiveBalance: _jurorsParams[0],
            minMaxPctTotalSupply: _jurorsParams[1],
            maxMaxPctTotalSupply: _jurorsParams[2],
            feeTokenTotalSupply: _jurorsParams[3]
        });

        configIdByTerm[_fromTermId] = courtConfigId;
        configChangeTermId = _fromTermId;

        emit NewConfig(_fromTermId, courtConfigId);
    }

    /**
    * @dev Internal function to get the Court config for a given term
    * @param _termId Identification number of the term querying the Court config of
    * @param _lastEnsuredTermId Identification number of the last ensured term of the Court
    * @return token Address of the token used to pay for fees
    * @return fees Array containing:
    *         0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *         1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *         2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @return maxRulingOptions Max number of selectable outcomes for each dispute
    * @return roundParams Array containing durations of phases of a dispute and other params for rounds:
    *         0. evidenceTerms Max submitting evidence period duration in terms
    *         1. commitTerms Commit period duration in terms
    *         2. revealTerms Reveal period duration in terms
    *         3. appealTerms Appeal period duration in terms
    *         4. appealConfirmationTerms Appeal confirmation period duration in terms
    *         5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *         6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *         7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *         8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @return pcts Array containing:
    *         0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *         1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @return appealCollateralParams Array containing params for appeal collateral:
    *         0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *         1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @return jurorsParams Array containing params for juror registry:
    *         0. minActiveBalance Minimum amount of juror tokens that can be activated
    *         1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *         2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *         3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function _getConfigAt(uint64 _termId, uint64 _lastEnsuredTermId) internal view
        returns (
            ERC20 feeToken,
            uint256[3] memory fees,
            uint8 maxRulingOptions,
            uint64[9] memory roundParams,
            uint16[2] memory pcts,
            uint256[2] memory appealCollateralParams,
            uint256[4] memory jurorsParams
        )
    {
        Config storage config = _getConfigFor(_termId, _lastEnsuredTermId);

        FeesConfig storage feesConfig = config.fees;
        feeToken = feesConfig.token;
        fees = [feesConfig.jurorFee, feesConfig.draftFee, feesConfig.settleFee];

        DisputesConfig storage disputesConfig = config.disputes;
        maxRulingOptions = disputesConfig.maxRulingOptions;
        roundParams = [
            disputesConfig.evidenceTerms,
            disputesConfig.commitTerms,
            disputesConfig.revealTerms,
            disputesConfig.appealTerms,
            disputesConfig.appealConfirmTerms,
            disputesConfig.firstRoundJurorsNumber,
            disputesConfig.appealStepFactor,
            uint64(disputesConfig.maxRegularAppealRounds),
            disputesConfig.finalRoundLockTerms
        ];
        pcts = [disputesConfig.penaltyPct, feesConfig.finalRoundReduction];
        appealCollateralParams = [disputesConfig.appealCollateralFactor, disputesConfig.appealConfirmCollateralFactor];

        JurorsConfig storage jurorsConfig = config.jurors;
        jurorsParams = [
            jurorsConfig.minActiveBalance,
            jurorsConfig.minMaxPctTotalSupply,
            jurorsConfig.maxMaxPctTotalSupply,
            jurorsConfig.feeTokenTotalSupply
        ];
    }

    /**
    * @dev Tell the draft config at a certain term
    * @param _termId Identification number of the term querying the draft config of
    * @param _lastEnsuredTermId Identification number of the last ensured term of the Court
    * @return feeToken Address of the token used to pay for fees
    * @return draftFee Amount of fee tokens per juror to cover the drafting cost
    * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    */
    function _getDraftConfig(uint64 _termId,  uint64 _lastEnsuredTermId) internal view
        returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct)
    {
        Config storage config = _getConfigFor(_termId, _lastEnsuredTermId);
        return (config.fees.token, config.fees.draftFee, config.disputes.penaltyPct);
    }

    /**
    * @dev Internal function to get the min active balance config for a given term
    * @param _termId Identification number of the term querying the min active balance config of
    * @param _lastEnsuredTermId Identification number of the last ensured term of the Court
    * @return Minimum amount of juror tokens that can be activated at the given term
    */
    function _getMinActiveBalance(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (uint256) {
        Config storage config = _getConfigFor(_termId, _lastEnsuredTermId);
        return config.jurors.minActiveBalance;
    }

    /**
    * @dev Internal function to get the Court config for a given term
    * @param _termId Identification number of the term querying the min active balance config of
    * @param _lastEnsuredTermId Identification number of the last ensured term of the Court
    * @return Court config for the given term
    */
    function _getConfigFor(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (Config storage) {
        uint256 id = _getConfigIdFor(_termId, _lastEnsuredTermId);
        return configs[id];
    }

    /**
    * @dev Internal function to get the Court config ID for a given term
    * @param _termId Identification number of the term querying the Court config of
    * @param _lastEnsuredTermId Identification number of the last ensured term of the Court
    * @return Identification number of the config for the given terms
    */
    function _getConfigIdFor(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (uint256) {
        // If the given term is lower or equal to the last ensured Court term, it is safe to use a past Court config
        if (_termId <= _lastEnsuredTermId) {
            return configIdByTerm[_termId];
        }

        // If the given term is in the future but there is a config change scheduled before it, use the incoming config
        uint64 scheduledChangeTermId = configChangeTermId;
        if (scheduledChangeTermId <= _termId) {
            return configIdByTerm[scheduledChangeTermId];
        }

        // If no changes are scheduled, use the Court config of the last ensured term
        return configIdByTerm[_lastEnsuredTermId];
    }
}

// File: contracts/court/controller/Controller.sol

pragma solidity ^0.5.8;





contract Controller is IsContract, CourtClock, CourtConfig {
    string private constant ERROR_SENDER_NOT_GOVERNOR = "CTR_SENDER_NOT_GOVERNOR";
    string private constant ERROR_INVALID_GOVERNOR_ADDRESS = "CTR_INVALID_GOVERNOR_ADDRESS";
    string private constant ERROR_IMPLEMENTATION_NOT_CONTRACT = "CTR_IMPLEMENTATION_NOT_CONTRACT";
    string private constant ERROR_INVALID_IMPLS_INPUT_LENGTH = "CTR_INVALID_IMPLS_INPUT_LENGTH";

    address private constant ZERO_ADDRESS = address(0);

    // DisputeManager module ID - keccak256(abi.encodePacked("DISPUTE_MANAGER"))
    bytes32 internal constant DISPUTE_MANAGER = 0x14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6;

    // Treasury module ID - keccak256(abi.encodePacked("TREASURY"))
    bytes32 internal constant TREASURY = 0x06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7;

    // Voting module ID - keccak256(abi.encodePacked("VOTING"))
    bytes32 internal constant VOTING = 0x7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346;

    // JurorsRegistry module ID - keccak256(abi.encodePacked("JURORS_REGISTRY"))
    bytes32 internal constant JURORS_REGISTRY = 0x3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370;

    // Subscriptions module ID - keccak256(abi.encodePacked("SUBSCRIPTIONS"))
    bytes32 internal constant SUBSCRIPTIONS = 0x2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365;

    // BrightIDRegister module ID - keccak256(abi.encodePacked("BRIGHTID_REGISTER"))
    bytes32 internal constant BRIGHTID_REGISTER = 0xc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329;

    /**
    * @dev Governor of the whole system. Set of three addresses to recover funds, change configuration settings and setup modules
    */
    struct Governor {
        address funds;      // This address can be unset at any time. It is allowed to recover funds from the ControlledRecoverable modules
        address config;     // This address is meant not to be unset. It is allowed to change the different configurations of the whole system
        address feesUpdater;// This is a second address that can update the config. It is expected to be used with a price oracle for updating fees
        address modules;    // This address can be unset at any time. It is allowed to plug/unplug modules from the system
    }

    // Governor addresses of the system
    Governor private governor;

    // List of modules registered for the system indexed by ID
    mapping (bytes32 => address) internal modules;

    event ModuleSet(bytes32 id, address addr);
    event FundsGovernorChanged(address previousGovernor, address currentGovernor);
    event ConfigGovernorChanged(address previousGovernor, address currentGovernor);
    event FeesUpdaterChanged(address previousFeesUpdater, address currentFeesUpdater);
    event ModulesGovernorChanged(address previousGovernor, address currentGovernor);

    /**
    * @dev Ensure the msg.sender is the funds governor
    */
    modifier onlyFundsGovernor {
        require(msg.sender == governor.funds, ERROR_SENDER_NOT_GOVERNOR);
        _;
    }

    /**
    * @dev Ensure the msg.sender is the config governor
    */
    modifier onlyConfigGovernor {
        require(msg.sender == governor.config, ERROR_SENDER_NOT_GOVERNOR);
        _;
    }

    /**
    * @dev Ensure the msg.sender is the config governor or the fees updater
    */
    modifier onlyConfigGovernorOrFeesUpdater {
        require(msg.sender == governor.config || msg.sender == governor.feesUpdater, ERROR_SENDER_NOT_GOVERNOR);
        _;
    }

    /**
    * @dev Ensure the msg.sender is the modules governor
    */
    modifier onlyModulesGovernor {
        require(msg.sender == governor.modules, ERROR_SENDER_NOT_GOVERNOR);
        _;
    }

    /**
    * @dev Constructor function
    * @param _termParams Array containing:
    *        0. _termDuration Duration in seconds per term
    *        1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding)
    * @param _governors Array containing:
    *        0. _fundsGovernor Address of the funds governor
    *        1. _configGovernor Address of the config governor
    *        2. _feesUpdater Address of the price feesUpdater
    *        3. _modulesGovernor Address of the modules governor
    * @param _feeToken Address of the token contract that is used to pay for fees
    * @param _fees Array containing:
    *        0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *        1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *        2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @param _maxRulingOptions Max number of selectable outcomes for each dispute
    * @param _roundParams Array containing durations of phases of a dispute and other params for rounds:
    *        0. evidenceTerms Max submitting evidence period duration in terms
    *        1. commitTerms Commit period duration in terms
    *        2. revealTerms Reveal period duration in terms
    *        3. appealTerms Appeal period duration in terms
    *        4. appealConfirmationTerms Appeal confirmation period duration in terms
    *        5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *        6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *        7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *        8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @param _pcts Array containing:
    *        0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000)
    *        1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @param _appealCollateralParams Array containing params for appeal collateral:
    *        0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling
    *        1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal
    * @param _jurorsParams Array containing params for jurors:
    *        0. minActiveBalance Minimum amount of juror tokens that can be activated
    *        1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *        2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *        3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    constructor(
        uint64[2] memory _termParams,
        address[4] memory _governors,
        ERC20 _feeToken,
        uint256[3] memory _fees,
        uint8 _maxRulingOptions,
        uint64[9] memory _roundParams,
        uint16[2] memory _pcts,
        uint256[2] memory _appealCollateralParams,
        uint256[4] memory _jurorsParams
    )
        public
        CourtClock(_termParams, _feeToken)
        CourtConfig(_feeToken, _fees, _maxRulingOptions, _roundParams, _pcts, _appealCollateralParams, _jurorsParams)
    {
        _setFundsGovernor(_governors[0]);
        _setConfigGovernor(_governors[1]);
        _setFeesUpdater(_governors[2]);
        _setModulesGovernor(_governors[3]);
    }

    /**
    * @notice Change Court configuration params
    * @param _fromTermId Identification number of the term in which the config will be effective at
    * @param _feeToken Address of the token contract that is used to pay for fees
    * @param _fees Array containing:
    *        0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *        1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *        2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @param _maxRulingOptions Max number of selectable outcomes for each dispute
    * @param _roundParams Array containing durations of phases of a dispute and other params for rounds:
    *        0. evidenceTerms Max submitting evidence period duration in terms
    *        1. commitTerms Commit period duration in terms
    *        2. revealTerms Reveal period duration in terms
    *        3. appealTerms Appeal period duration in terms
    *        4. appealConfirmationTerms Appeal confirmation period duration in terms
    *        5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *        6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *        7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *        8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @param _pcts Array containing:
    *        0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000)
    *        1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @param _appealCollateralParams Array containing params for appeal collateral:
    *        0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling
    *        1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal
    * @param _jurorsParams Array containing params for jurors:
    *        0. minActiveBalance Minimum amount of juror tokens that can be activated
    *        1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *        2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *        3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function setConfig(
        uint64 _fromTermId,
        ERC20 _feeToken,
        uint256[3] calldata _fees,
        uint8 _maxRulingOptions,
        uint64[9] calldata _roundParams,
        uint16[2] calldata _pcts,
        uint256[2] calldata _appealCollateralParams,
        uint256[4] calldata _jurorsParams
    )
        external
        onlyConfigGovernorOrFeesUpdater
    {
        uint64 currentTermId = _ensureCurrentTerm();
        _setConfig(
            currentTermId,
            _fromTermId,
            _feeToken,
            _fees,
            _maxRulingOptions,
            _roundParams,
            _pcts,
            _appealCollateralParams,
            _jurorsParams
        );
    }

    /**
    * @notice Delay the Court start time to `_newFirstTermStartTime`
    * @param _newFirstTermStartTime New timestamp in seconds when the court will open
    */
    function delayStartTime(uint64 _newFirstTermStartTime) external onlyConfigGovernor {
        _delayStartTime(_newFirstTermStartTime);
    }

    /**
    * @notice Change funds governor address to `_newFundsGovernor`
    * @param _newFundsGovernor Address of the new funds governor to be set
    */
    function changeFundsGovernor(address _newFundsGovernor) external onlyFundsGovernor {
        require(_newFundsGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS);
        _setFundsGovernor(_newFundsGovernor);
    }

    /**
    * @notice Change config governor address to `_newConfigGovernor`
    * @param _newConfigGovernor Address of the new config governor to be set
    */
    function changeConfigGovernor(address _newConfigGovernor) external onlyConfigGovernor {
        require(_newConfigGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS);
        _setConfigGovernor(_newConfigGovernor);
    }

    /**
    * @notice Change fees updater to `_newFeesUpdater`
    * @param _newFeesUpdater Address of the new fees updater to be set
    */
    function changeFeesUpdater(address _newFeesUpdater) external onlyConfigGovernor {
        _setFeesUpdater(_newFeesUpdater);
    }

    /**
    * @notice Change modules governor address to `_newModulesGovernor`
    * @param _newModulesGovernor Address of the new governor to be set
    */
    function changeModulesGovernor(address _newModulesGovernor) external onlyModulesGovernor {
        require(_newModulesGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS);
        _setModulesGovernor(_newModulesGovernor);
    }

    /**
    * @notice Remove the funds governor. Set the funds governor to the zero address.
    * @dev This action cannot be rolled back, once the funds governor has been unset, funds cannot be recovered from recoverable modules anymore
    */
    function ejectFundsGovernor() external onlyFundsGovernor {
        _setFundsGovernor(ZERO_ADDRESS);
    }

    /**
    * @notice Remove the modules governor. Set the modules governor to the zero address.
    * @dev This action cannot be rolled back, once the modules governor has been unset, system modules cannot be changed anymore
    */
    function ejectModulesGovernor() external onlyModulesGovernor {
        _setModulesGovernor(ZERO_ADDRESS);
    }

    /**
    * @notice Set module `_id` to `_addr`
    * @param _id ID of the module to be set
    * @param _addr Address of the module to be set
    */
    function setModule(bytes32 _id, address _addr) external onlyModulesGovernor {
        _setModule(_id, _addr);
    }

    /**
    * @notice Set many modules at once
    * @param _ids List of ids of each module to be set
    * @param _addresses List of addressed of each the module to be set
    */
    function setModules(bytes32[] calldata _ids, address[] calldata _addresses) external onlyModulesGovernor {
        require(_ids.length == _addresses.length, ERROR_INVALID_IMPLS_INPUT_LENGTH);

        for (uint256 i = 0; i < _ids.length; i++) {
            _setModule(_ids[i], _addresses[i]);
        }
    }

    /**
    * @dev Tell the full Court configuration parameters at a certain term
    * @param _termId Identification number of the term querying the Court config of
    * @return token Address of the token used to pay for fees
    * @return fees Array containing:
    *         0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *         1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *         2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @return maxRulingOptions Max number of selectable outcomes for each dispute
    * @return roundParams Array containing durations of phases of a dispute and other params for rounds:
    *         0. evidenceTerms Max submitting evidence period duration in terms
    *         1. commitTerms Commit period duration in terms
    *         2. revealTerms Reveal period duration in terms
    *         3. appealTerms Appeal period duration in terms
    *         4. appealConfirmationTerms Appeal confirmation period duration in terms
    *         5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *         6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *         7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *         8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @return pcts Array containing:
    *         0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    *         1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @return appealCollateralParams Array containing params for appeal collateral:
    *         0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling
    *         1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal
    * @return jurorsParams Array containing params for juror registry:
    *         0. minActiveBalance Minimum amount of juror tokens that can be activated
    *         1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *         2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake\
    *         3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    function getConfig(uint64 _termId) external view
        returns (
            ERC20 feeToken,
            uint256[3] memory fees,
            uint8 maxRulingOptions,
            uint64[9] memory roundParams,
            uint16[2] memory pcts,
            uint256[2] memory appealCollateralParams,
            uint256[4] memory jurorsParams
        )
    {
        return _getConfig(_termId);
    }

    /**
    * @dev This function overrides one in the CourtClock, giving the CourtClock access to the config.
    */
    function _getConfig(uint64 _termId) internal view
        returns (
            ERC20 feeToken,
            uint256[3] memory fees,
            uint8 maxRulingOptions,
            uint64[9] memory roundParams,
            uint16[2] memory pcts,
            uint256[2] memory appealCollateralParams,
            uint256[4] memory jurorsParams
        )
    {
        uint64 lastEnsuredTermId = _lastEnsuredTermId();
        return _getConfigAt(_termId, lastEnsuredTermId);
    }

    /**
    * @dev Tell the draft config at a certain term
    * @param _termId Identification number of the term querying the draft config of
    * @return feeToken Address of the token used to pay for fees
    * @return draftFee Amount of fee tokens per juror to cover the drafting cost
    * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000)
    */
    function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct) {
        uint64 lastEnsuredTermId = _lastEnsuredTermId();
        return _getDraftConfig(_termId, lastEnsuredTermId);
    }

    /**
    * @dev Tell the min active balance config at a certain term
    * @param _termId Identification number of the term querying the min active balance config of
    * @return Minimum amount of tokens jurors have to activate to participate in the Court
    */
    function getMinActiveBalance(uint64 _termId) external view returns (uint256) {
        uint64 lastEnsuredTermId = _lastEnsuredTermId();
        return _getMinActiveBalance(_termId, lastEnsuredTermId);
    }

    /**
    * @dev Tell the address of the funds governor
    * @return Address of the funds governor
    */
    function getFundsGovernor() external view returns (address) {
        return governor.funds;
    }

    /**
    * @dev Tell the address of the config governor
    * @return Address of the config governor
    */
    function getConfigGovernor() external view returns (address) {
        return governor.config;
    }

    /**
    * @dev Tell the address of the fees updater
    * @return Address of the fees updater
    */
    function getFeesUpdater() external view returns (address) {
        return governor.feesUpdater;
    }

    /**
    * @dev Tell the address of the modules governor
    * @return Address of the modules governor
    */
    function getModulesGovernor() external view returns (address) {
        return governor.modules;
    }

    /**
    * @dev Tell address of a module based on a given ID
    * @param _id ID of the module being queried
    * @return Address of the requested module
    */
    function getModule(bytes32 _id) external view returns (address) {
        return _getModule(_id);
    }

    /**
    * @dev Tell the address of the DisputeManager module
    * @return Address of the DisputeManager module
    */
    function getDisputeManager() external view returns (address) {
        return _getDisputeManager();
    }

    /**
    * @dev Tell the address of the Treasury module
    * @return Address of the Treasury module
    */
    function getTreasury() external view returns (address) {
        return _getModule(TREASURY);
    }

    /**
    * @dev Tell the address of the Voting module
    * @return Address of the Voting module
    */
    function getVoting() external view returns (address) {
        return _getModule(VOTING);
    }

    /**
    * @dev Tell the address of the JurorsRegistry module
    * @return Address of the JurorsRegistry module
    */
    function getJurorsRegistry() external view returns (address) {
        return _getModule(JURORS_REGISTRY);
    }

    /**
    * @dev Tell the address of the Subscriptions module
    * @return Address of the Subscriptions module
    */
    function getSubscriptions() external view returns (address) {
        return _getSubscriptions();
    }

    /**
    * @dev Tell the address of the BrightId register
    * @return Address of the BrightId register
    */
    function getBrightIdRegister() external view returns (address) {
        return _getBrightIdRegister();
    }

    /**
    * @dev Internal function to set the address of the funds governor
    * @param _newFundsGovernor Address of the new config governor to be set
    */
    function _setFundsGovernor(address _newFundsGovernor) internal {
        emit FundsGovernorChanged(governor.funds, _newFundsGovernor);
        governor.funds = _newFundsGovernor;
    }

    /**
    * @dev Internal function to set the address of the config governor
    * @param _newConfigGovernor Address of the new config governor to be set
    */
    function _setConfigGovernor(address _newConfigGovernor) internal {
        emit ConfigGovernorChanged(governor.config, _newConfigGovernor);
        governor.config = _newConfigGovernor;
    }

    /**
    * @dev Internal function to set the address of the fees updater
    * @param _newFeesUpdater Address of the new fees updater to be set
    */
    function _setFeesUpdater(address _newFeesUpdater) internal {
        emit FeesUpdaterChanged(governor.feesUpdater, _newFeesUpdater);
        governor.feesUpdater = _newFeesUpdater;
    }

    /**
    * @dev Internal function to set the address of the modules governor
    * @param _newModulesGovernor Address of the new modules governor to be set
    */
    function _setModulesGovernor(address _newModulesGovernor) internal {
        emit ModulesGovernorChanged(governor.modules, _newModulesGovernor);
        governor.modules = _newModulesGovernor;
    }

    /**
    * @dev Internal function to set a module
    * @param _id Id of the module to be set
    * @param _addr Address of the module to be set
    */
    function _setModule(bytes32 _id, address _addr) internal {
        require(isContract(_addr), ERROR_IMPLEMENTATION_NOT_CONTRACT);
        modules[_id] = _addr;
        emit ModuleSet(_id, _addr);
    }

    /**
    * @dev Internal function to notify when a term has been transitioned
    * @param _termId Identification number of the new current term that has been transitioned
    */
    function _onTermTransitioned(uint64 _termId) internal {
        _ensureTermConfig(_termId);
    }

    /**
    * @dev Internal function to tell the address of the DisputeManager module
    * @return Address of the DisputeManager module
    */
    function _getDisputeManager() internal view returns (address) {
        return _getModule(DISPUTE_MANAGER);
    }

    /**
    * @dev Internal function to tell the address of the Subscriptions module
    * @return Address of the Subscriptions module
    */
    function _getSubscriptions() internal view returns (address) {
        return _getModule(SUBSCRIPTIONS);
    }


    /**
    * @dev Internal function to tell the address of the BrightId register
    * @return Address of the BrightId register
    */
    function _getBrightIdRegister() internal view returns (address) {
        return _getModule(BRIGHTID_REGISTER);
    }

    /**
    * @dev Internal function to tell address of a module based on a given ID
    * @param _id ID of the module being queried
    * @return Address of the requested module
    */
    function _getModule(bytes32 _id) internal view returns (address) {
        return modules[_id];
    }
}

// File: contracts/arbitration/IArbitrator.sol

pragma solidity ^0.5.8;



interface IArbitrator {
    /**
    * @dev Create a dispute over the Arbitrable sender with a number of possible rulings
    * @param _possibleRulings Number of possible rulings allowed for the dispute
    * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created
    * @return Dispute identification number
    */
    function createDispute(uint256 _possibleRulings, bytes calldata _metadata) external returns (uint256);

    /**
    * @dev Submit evidence for a dispute
    * @param _disputeId Id of the dispute in the Protocol
    * @param _submitter Address of the account submitting the evidence
    * @param _evidence Data submitted for the evidence related to the dispute
    */
    function submitEvidence(uint256 _disputeId, address _submitter, bytes calldata _evidence) external;

    /**
    * @dev Close the evidence period of a dispute
    * @param _disputeId Identification number of the dispute to close its evidence submitting period
    */
    function closeEvidencePeriod(uint256 _disputeId) external;

    /**
    * @notice Rule dispute #`_disputeId` if ready
    * @param _disputeId Identification number of the dispute to be ruled
    * @return subject Arbitrable instance associated to the dispute
    * @return ruling Ruling number computed for the given dispute
    */
    function rule(uint256 _disputeId) external returns (address subject, uint256 ruling);

    /**
    * @dev Tell the dispute fees information to create a dispute
    * @return recipient Address where the corresponding dispute fees must be transferred to
    * @return feeToken ERC20 token used for the fees
    * @return feeAmount Total amount of fees that must be allowed to the recipient
    */
    function getDisputeFees() external view returns (address recipient, ERC20 feeToken, uint256 feeAmount);
}

// File: contracts/arbitration/IArbitrable.sol

pragma solidity ^0.5.8;



contract IArbitrable {
    /**
    * @dev Emitted when an IArbitrable instance's dispute is ruled by an IArbitrator
    * @param arbitrator IArbitrator instance ruling the dispute
    * @param disputeId Identification number of the dispute being ruled by the arbitrator
    * @param ruling Ruling given by the arbitrator
    */
    event Ruled(IArbitrator indexed arbitrator, uint256 indexed disputeId, uint256 ruling);
}

// File: contracts/disputes/IDisputeManager.sol

pragma solidity ^0.5.8;




interface IDisputeManager {
    enum DisputeState {
        PreDraft,
        Adjudicating,
        Ruled
    }

    enum AdjudicationState {
        Invalid,
        Committing,
        Revealing,
        Appealing,
        ConfirmingAppeal,
        Ended
    }

    /**
    * @dev Create a dispute to be drafted in a future term
    * @param _subject Arbitrable instance creating the dispute
    * @param _possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute
    * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created
    * @return Dispute identification number
    */
    function createDispute(IArbitrable _subject, uint8 _possibleRulings, bytes calldata _metadata) external returns (uint256);

    /**
    * @dev Submit evidence for a dispute
    * @param _subject Arbitrable instance submitting the dispute
    * @param _disputeId Identification number of the dispute receiving new evidence
    * @param _submitter Address of the account submitting the evidence
    * @param _evidence Data submitted for the evidence of the dispute
    */
    function submitEvidence(IArbitrable _subject, uint256 _disputeId, address _submitter, bytes calldata _evidence) external;

    /**
    * @dev Close the evidence period of a dispute
    * @param _subject IArbitrable instance requesting to close the evidence submission period
    * @param _disputeId Identification number of the dispute to close its evidence submitting period
    */
    function closeEvidencePeriod(IArbitrable _subject, uint256 _disputeId) external;

    /**
    * @dev Draft jurors for the next round of a dispute
    * @param _disputeId Identification number of the dispute to be drafted
    */
    function draft(uint256 _disputeId) external;

    /**
    * @dev Appeal round of a dispute in favor of a certain ruling
    * @param _disputeId Identification number of the dispute being appealed
    * @param _roundId Identification number of the dispute round being appealed
    * @param _ruling Ruling appealing a dispute round in favor of
    */
    function createAppeal(uint256 _disputeId, uint256 _roundId, uint8 _ruling) external;

    /**
    * @dev Confirm appeal for a round of a dispute in favor of a ruling
    * @param _disputeId Identification number of the dispute confirming an appeal of
    * @param _roundId Identification number of the dispute round confirming an appeal of
    * @param _ruling Ruling being confirmed against a dispute round appeal
    */
    function confirmAppeal(uint256 _disputeId, uint256 _roundId, uint8 _ruling) external;

    /**
    * @dev Compute the final ruling for a dispute
    * @param _disputeId Identification number of the dispute to compute its final ruling
    * @return subject Arbitrable instance associated to the dispute
    * @return finalRuling Final ruling decided for the given dispute
    */
    function computeRuling(uint256 _disputeId) external returns (IArbitrable subject, uint8 finalRuling);

    /**
    * @dev Settle penalties for a round of a dispute
    * @param _disputeId Identification number of the dispute to settle penalties for
    * @param _roundId Identification number of the dispute round to settle penalties for
    * @param _jurorsToSettle Maximum number of jurors to be slashed in this call
    */
    function settlePenalties(uint256 _disputeId, uint256 _roundId, uint256 _jurorsToSettle) external;

    /**
    * @dev Claim rewards for a round of a dispute for juror
    * @dev For regular rounds, it will only reward winning jurors
    * @param _disputeId Identification number of the dispute to settle rewards for
    * @param _roundId Identification number of the dispute round to settle rewards for
    * @param _juror Address of the juror to settle their rewards
    */
    function settleReward(uint256 _disputeId, uint256 _roundId, address _juror) external;

    /**
    * @dev Settle appeal deposits for a round of a dispute
    * @param _disputeId Identification number of the dispute to settle appeal deposits for
    * @param _roundId Identification number of the dispute round to settle appeal deposits for
    */
    function settleAppealDeposit(uint256 _disputeId, uint256 _roundId) external;

    /**
    * @dev Tell the amount of token fees required to create a dispute
    * @return feeToken ERC20 token used for the fees
    * @return feeAmount Total amount of fees to be paid for a dispute at the given term
    */
    function getDisputeFees() external view returns (ERC20 feeToken, uint256 feeAmount);

    /**
    * @dev Tell information of a certain dispute
    * @param _disputeId Identification number of the dispute being queried
    * @return subject Arbitrable subject being disputed
    * @return possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute
    * @return state Current state of the dispute being queried: pre-draft, adjudicating, or ruled
    * @return finalRuling The winning ruling in case the dispute is finished
    * @return lastRoundId Identification number of the last round created for the dispute
    * @return createTermId Identification number of the term when the dispute was created
    */
    function getDispute(uint256 _disputeId) external view
        returns (IArbitrable subject, uint8 possibleRulings, DisputeState state, uint8 finalRuling, uint256 lastRoundId, uint64 createTermId);

    /**
    * @dev Tell information of a certain adjudication round
    * @param _disputeId Identification number of the dispute being queried
    * @param _roundId Identification number of the round being queried
    * @return draftTerm Term from which the requested round can be drafted
    * @return delayedTerms Number of terms the given round was delayed based on its requested draft term id
    * @return jurorsNumber Number of jurors requested for the round
    * @return selectedJurors Number of jurors already selected for the requested round
    * @return settledPenalties Whether or not penalties have been settled for the requested round
    * @return collectedTokens Amount of juror tokens that were collected from slashed jurors for the requested round
    * @return coherentJurors Number of jurors that voted in favor of the final ruling in the requested round
    * @return state Adjudication state of the requested round
    */
    function getRound(uint256 _disputeId, uint256 _roundId) external view
        returns (
            uint64 draftTerm,
            uint64 delayedTerms,
            uint64 jurorsNumber,
            uint64 selectedJurors,
            uint256 jurorFees,
            bool settledPenalties,
            uint256 collectedTokens,
            uint64 coherentJurors,
            AdjudicationState state
        );

    /**
    * @dev Tell appeal-related information of a certain adjudication round
    * @param _disputeId Identification number of the dispute being queried
    * @param _roundId Identification number of the round being queried
    * @return maker Address of the account appealing the given round
    * @return appealedRuling Ruling confirmed by the appealer of the given round
    * @return taker Address of the account confirming the appeal of the given round
    * @return opposedRuling Ruling confirmed by the appeal taker of the given round
    */
    function getAppeal(uint256 _disputeId, uint256 _roundId) external view
        returns (address maker, uint64 appealedRuling, address taker, uint64 opposedRuling);

    /**
    * @dev Tell information related to the next round due to an appeal of a certain round given.
    * @param _disputeId Identification number of the dispute being queried
    * @param _roundId Identification number of the round requesting the appeal details of
    * @return nextRoundStartTerm Term ID from which the next round will start
    * @return nextRoundJurorsNumber Jurors number for the next round
    * @return newDisputeState New state for the dispute associated to the given round after the appeal
    * @return feeToken ERC20 token used for the next round fees
    * @return jurorFees Total amount of fees to be distributed between the winning jurors of the next round
    * @return totalFees Total amount of fees for a regular round at the given term
    * @return appealDeposit Amount to be deposit of fees for a regular round at the given term
    * @return confirmAppealDeposit Total amount of fees for a regular round at the given term
    */
    function getNextRoundDetails(uint256 _disputeId, uint256 _roundId) external view
        returns (
            uint64 nextRoundStartTerm,
            uint64 nextRoundJurorsNumber,
            DisputeState newDisputeState,
            ERC20 feeToken,
            uint256 totalFees,
            uint256 jurorFees,
            uint256 appealDeposit,
            uint256 confirmAppealDeposit
        );

    /**
    * @dev Tell juror-related information of a certain adjudication round
    * @param _disputeId Identification number of the dispute being queried
    * @param _roundId Identification number of the round being queried
    * @param _juror Address of the juror being queried
    * @return weight Juror weight drafted for the requested round
    * @return rewarded Whether or not the given juror was rewarded based on the requested round
    */
    function getJuror(uint256 _disputeId, uint256 _roundId, address _juror) external view returns (uint64 weight, bool rewarded);
}

// File: contracts/court/Celeste.sol

pragma solidity ^0.5.8;







contract Celeste is Controller, IArbitrator {
    using Uint256Helpers for uint256;

    // Arbitrable interface ID based on ERC-165
    bytes4 private constant ARBITRABLE_INTERFACE_ID = bytes4(0x88f3ee69);

    /**
    * @dev Constructor function
    * @param _termParams Array containing:
    *        0. _termDuration Duration in seconds per term
    *        1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding)
    * @param _governors Array containing:
    *        0. _fundsGovernor Address of the funds governor
    *        1. _configGovernor Address of the config governor
    *        2. _oracle Address of the price oracle
    *        3. _modulesGovernor Address of the modules governor
    * @param _feeToken Address of the token contract that is used to pay for fees
    * @param _fees Array containing:
    *        0. jurorFee Amount of fee tokens that is paid per juror per dispute
    *        1. draftFee Amount of fee tokens per juror to cover the drafting cost
    *        2. settleFee Amount of fee tokens per juror to cover round settlement cost
    * @param _maxRulingOptions Max number of selectable outcomes for each dispute
    * @param _roundParams Array containing durations of phases of a dispute and other params for rounds:
    *        0. evidenceTerms Max submitting evidence period duration in terms
    *        1. commitTerms Commit period duration in terms
    *        2. revealTerms Reveal period duration in terms
    *        3. appealTerms Appeal period duration in terms
    *        4. appealConfirmationTerms Appeal confirmation period duration in terms
    *        5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes
    *        6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute
    *        7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered
    *        8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks)
    * @param _pcts Array containing:
    *        0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000)
    *        1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000)
    * @param _appealCollateralParams Array containing params for appeal collateral:
    *        0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling
    *        1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal
    * @param _jurorsParams Array containing params for juror registry:
    *        0. minActiveBalance Minimum amount of juror tokens that can be activated
    *        1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake
    *        2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake
    *        3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do
    */
    constructor(
        uint64[2] memory _termParams,
        address[4] memory _governors,
        ERC20 _feeToken,
        uint256[3] memory _fees,
        uint8 _maxRulingOptions,
        uint64[9] memory _roundParams,
        uint16[2] memory _pcts,
        uint256[2] memory _appealCollateralParams,
        uint256[4] memory _jurorsParams
    )
        public
        Controller(
            _termParams,
            _governors,
            _feeToken,
            _fees,
            _maxRulingOptions,
            _roundParams,
            _pcts,
            _appealCollateralParams,
            _jurorsParams
        )
    {
        // solium-disable-previous-line no-empty-blocks
    }

    /**
    * @notice Create a dispute with `_possibleRulings` possible rulings
    * @param _possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute
    * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created
    * @return Dispute identification number
    */
    function createDispute(uint256 _possibleRulings, bytes calldata _metadata) external returns (uint256) {
        IArbitrable subject = IArbitrable(msg.sender);
        IDisputeManager disputeManager = IDisputeManager(_getDisputeManager());
        return disputeManager.createDispute(subject, _possibleRulings.toUint8(), _metadata);
    }

    /**
    * @notice Submit `_evidence` as evidence from `_submitter` for dispute #`_disputeId`
    * @param _disputeId Id of the dispute in the Protocol
    * @param _submitter Address of the account submitting the evidence
    * @param _evidence Data submitted for the evidence related to the dispute
    */
    function submitEvidence(uint256 _disputeId, address _submitter, bytes calldata _evidence) external {
        IDisputeManager disputeManager = IDisputeManager(_getDisputeManager());
        IArbitrable subject = IArbitrable(msg.sender);
        disputeManager.submitEvidence(subject, _disputeId, _submitter, _evidence);
    }

    /**
    * @notice Close the evidence period of dispute #`_disputeId`
    * @param _disputeId Identification number of the dispute to close its evidence submitting period
    */
    function closeEvidencePeriod(uint256 _disputeId) external {
        IArbitrable subject = IArbitrable(msg.sender);
        IDisputeManager disputeManager = IDisputeManager(_getDisputeManager());
        disputeManager.closeEvidencePeriod(subject, _disputeId);
    }

    /**
    * @notice Rule dispute #`_disputeId` if ready
    * @param _disputeId Identification number of the dispute to be ruled
    * @return subject Arbitrable instance associated to the dispute
    * @return ruling Ruling number computed for the given dispute
    */
    function rule(uint256 _disputeId) external returns (address subject, uint256 ruling) {
        IDisputeManager disputeManager = IDisputeManager(_getDisputeManager());
        (IArbitrable _subject, uint8 _ruling) = disputeManager.computeRuling(_disputeId);
        return (address(_subject), uint256(_ruling));
    }

    /**
    * @dev Tell the dispute fees information to create a dispute
    * @return recipient Address where the corresponding dispute fees must be transferred to
    * @return feeToken ERC20 token used for the fees
    * @return feeAmount Total amount of fees that must be allowed to the recipient
    */
    function getDisputeFees() external view returns (address recipient, ERC20 feeToken, uint256 feeAmount) {
        recipient = _getDisputeManager();
        IDisputeManager disputeManager = IDisputeManager(recipient);
        (feeToken, feeAmount) = disputeManager.getDisputeFees();
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getCurrentTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVoting","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTermDuration","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ids","type":"bytes32[]"},{"name":"_addresses","type":"address[]"}],"name":"setModules","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"areWithdrawalsAllowedFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTreasury","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSubscriptions","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFundsGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ensureCurrentTerm","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getModulesGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNeededTermTransitions","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeesUpdater","type":"address"}],"name":"changeFeesUpdater","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_addr","type":"address"}],"name":"setModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTermRandomness","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getDraftConfig","outputs":[{"name":"feeToken","type":"address"},{"name":"draftFee","type":"uint256"},{"name":"penaltyPct","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getConfigChangeTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBrightIdRegister","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDisputeFees","outputs":[{"name":"recipient","type":"address"},{"name":"feeToken","type":"address"},{"name":"feeAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_submitter","type":"address"},{"name":"_evidence","type":"bytes"}],"name":"submitEvidence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ensureCurrentTermRandomness","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"closeEvidencePeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_allowed","type":"bool"}],"name":"setAutomaticWithdrawals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTermTokenTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"getModule","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ejectModulesGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFundsGovernor","type":"address"}],"name":"changeFundsGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getJurorsRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getMinActiveBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getConfigGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxRequestedTransitions","type":"uint64"}],"name":"heartbeat","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFeesUpdater","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_possibleRulings","type":"uint256"},{"name":"_metadata","type":"bytes"}],"name":"createDispute","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ejectFundsGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newModulesGovernor","type":"address"}],"name":"changeModulesGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newConfigGovernor","type":"address"}],"name":"changeConfigGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fromTermId","type":"uint64"},{"name":"_feeToken","type":"address"},{"name":"_fees","type":"uint256[3]"},{"name":"_maxRulingOptions","type":"uint8"},{"name":"_roundParams","type":"uint64[9]"},{"name":"_pcts","type":"uint16[2]"},{"name":"_appealCollateralParams","type":"uint256[2]"},{"name":"_jurorsParams","type":"uint256[4]"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"rule","outputs":[{"name":"subject","type":"address"},{"name":"ruling","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDisputeManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getConfig","outputs":[{"name":"feeToken","type":"address"},{"name":"fees","type":"uint256[3]"},{"name":"maxRulingOptions","type":"uint8"},{"name":"roundParams","type":"uint64[9]"},{"name":"pcts","type":"uint16[2]"},{"name":"appealCollateralParams","type":"uint256[2]"},{"name":"jurorsParams","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFirstTermStartTime","type":"uint64"}],"name":"delayStartTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTerm","outputs":[{"name":"startTime","type":"uint64"},{"name":"randomnessBN","type":"uint64"},{"name":"randomness","type":"bytes32"},{"name":"celesteTokenTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastEnsuredTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_termParams","type":"uint64[2]"},{"name":"_governors","type":"address[4]"},{"name":"_feeToken","type":"address"},{"name":"_fees","type":"uint256[3]"},{"name":"_maxRulingOptions","type":"uint8"},{"name":"_roundParams","type":"uint64[9]"},{"name":"_pcts","type":"uint16[2]"},{"name":"_appealCollateralParams","type":"uint256[2]"},{"name":"_jurorsParams","type":"uint256[4]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"bytes32"},{"indexed":false,"name":"addr","type":"address"}],"name":"ModuleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"FundsGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"ConfigGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousFeesUpdater","type":"address"},{"indexed":false,"name":"currentFeesUpdater","type":"address"}],"name":"FeesUpdaterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"ModulesGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromTermId","type":"uint64"},{"indexed":false,"name":"courtConfigId","type":"uint64"}],"name":"NewConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"allowed","type":"bool"}],"name":"AutomaticWithdrawalsAllowedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousTermId","type":"uint64"},{"indexed":false,"name":"currentTermId","type":"uint64"}],"name":"Heartbeat","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousStartTime","type":"uint64"},{"indexed":false,"name":"currentStartTime","type":"uint64"}],"name":"StartTimeDelayed","type":"event"}]

60806040523480156200001157600080fd5b5060405161038080620054a683398101806040526103808110156200003557600080fd5b5060c081015161014082015160408301919060e0840190610160850161028086016102c087016103008801888888888888888888868686868686868f8760008281602002015190506000836001602002015190506301e133806001600160401b0316826001600160401b0316106040518060400160405280601a81526020017f434c4b5f5445524d5f4455524154494f4e5f544f4f5f4c4f4e47000000000000815250906200017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200014357818101518382015260200162000129565b50505050905090810190601f168015620001715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508162000191620004de60201b60201c565b016001600160401b0316816001600160401b031610156040518060400160405280601d81526020017f434c4b5f4241445f46495253545f5445524d5f53544152545f54494d450000008152509062000246576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506301e133806002026200025f620004de60201b60201c565b016001600160401b0316816001600160401b031611156040518060400160405280601d81526020017f434c4b5f4241445f46495253545f5445524d5f53544152545f54494d450000008152509062000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50600080546001600160401b038085166001600160401b0319928316178355918052600160209081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805486860390941693909216929092179055604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516001600160a01b038616926318160ddd9260048082019391829003018186803b158015620003c657600080fd5b505afa158015620003db573d6000803e3d6000fd5b505050506040513d6020811015620003f257600080fd5b505160008052600160208190527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4b9190915593506200043992506003915083905062001669565b5062000454600080898989898989896200050b60201b60201c565b505050505050506200047e886000600481106200046d57fe5b6020020151620013ef60201b60201c565b6200049688600160200201516200145960201b60201c565b620004ae8860026020020151620014c360201b60201c565b620004c688600360200201516200152d60201b60201c565b5050505050505050505050505050505050506200175c565b600062000505620004f46200159760201b60201c565b6200159b60201b620038111760201c565b90505b90565b6001600160401b0389161580620005335750886001600160401b0316886001600160401b0316115b6040518060400160405280601181526020017f434f4e465f544f4f5f4f4c445f5445524d00000000000000000000000000000081525090620005d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060028560ff1610156040518060600160405280602181526020016200546460219139906200065e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506040805160608101909152602180825260fc60ff88161115919062005443602083013990620006eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50815115801590620007005750602082015115155b6040518060400160405280601b81526020017f434f4e465f5a45524f5f434f4c4c41544552414c5f464143544f520000000000815250906200079f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50620007be8360005b60200201516200164c60201b620034fa1760201c565b6040518060400160405280601881526020017f434f4e465f494e56414c49445f50454e414c54595f5043540000000000000000815250906200085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506200086b836001620007a8565b6040518060400160405280602081526020017f434f4e465f494e56414c49445f46494e414c5f524f554e445f5245445f504354815250906200090a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060a084015160408051808201909152601e81527f434f4e465f4241445f494e495449414c5f4a55524f52535f4e554d42455200006020820152906001600160401b0316620009b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060c084015160408051808201909152601b81527f434f4e465f4241445f41505045414c5f535445505f464143544f5200000000006020820152906001600160401b031662000a62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060e08401516001600160401b03166000811580159062000a845750600a8211155b9050806040518060400160405280601e81526020017f434f4e465f494e56414c49445f4d41585f41505045414c5f524f554e445300008152509062000b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060005b600581101562000c2357600087826009811062000b4357fe5b60200201516001600160401b031611801562000b7a57506121de87826009811062000b6a57fe5b60200201516001600160401b0316105b6040518060400160405280601f81526020017f434f4e465f4c415247455f524f554e445f50484153455f4455524154494f4e008152509062000c19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060010162000b2a565b50825160408051808201909152601c81527f434f4e465f5a45524f5f4d494e5f4143544956455f42414c414e43450000000060208201529062000cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060008360016020020151116040518060400160405280601e81526020017f434f4e465f4d494e5f4d41585f544f54414c5f535550504c595f5a45524f00008152509062000d6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5062000d8c83600260200201516200165b60201b620035091760201c565b6040518060600160405280602581526020016200541e602591399062000e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50826002602002015183600160200201511060405180606001604052806021815260200162005485602191399062000ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506002546001600160401b03808d169116111562000edd576002546001600160401b031660009081526004602052604081205562000ef3565b600380549062000ef1906001830162001669565b505b600380546000198101916000916001600160401b03841690811062000f1457fe5b90600052602060002090600e020190506040518060a001604052808c6001600160a01b031681526020018860016002811062000f4c57fe5b602002015161ffff1681526020018b60006003811062000f6857fe5b602002015181526020018b60016003811062000f8057fe5b602002015181526020018b60026003811062000f9857fe5b60209081029190910151909152815183548383015161ffff167401000000000000000000000000000000000000000002600160a01b61ffff02196001600160a01b039093166001600160a01b03199092169190911791909116178355604080830151600185015560608301516002850155608090920151600384015581516101a0810190925260ff8b168252810189600060200201516001600160401b03168152602001896001600981106200104a57fe5b60200201516001600160401b03168152602001896002600981106200106b57fe5b60200201516001600160401b03168152602001896003600981106200108c57fe5b60200201516001600160401b0316815260200189600460098110620010ad57fe5b60200201516001600160401b0316815260200188600060028110620010ce57fe5b602002015161ffff16815260200189600560098110620010ea57fe5b60200201516001600160401b03168152602001896006600981106200110b57fe5b60200201516001600160401b03168152602001896008600981106200112c57fe5b60200201516001600160401b03168152602001858152602001876000600281106200115357fe5b60200201518152602001876001600281106200116b57fe5b6020908102919091015190915281516004840180549284015160408086015160608701516001600160401b039081167101000000000000000000000000000000000002600160881b600160c81b0319928216690100000000000000000002600160481b600160881b0319958316610100908102610100600160481b031960ff909a1660ff19909b169a909a1798909816989098179490941696909617169190911790915560808085015160058701805460a088015160c089015160e08a01518916720100000000000000000000000000000000000002600160901b600160d01b031961ffff90921670010000000000000000000000000000000002600160801b61ffff0219938b1668010000000000000000908102600160401b600160801b0319988d166001600160401b03199788161789161794909416179190911617909255948701516006890180546101208a01518916909302919097169190951617169290921790925561014083015160078501556101608301516008850155610180909201516009840155805191820190528086600060200201518152602001866001600481106200131757fe5b60200201518152602001866002600481106200132f57fe5b60200201518152602001866003600481106200134757fe5b602090810291909101519091528151600a84015581810151600b840155604080830151600c850155606090920151600d8401556001600160401b038e811660008181526004845284902091861691829055600280546001600160401b0319168217905583519081529182015281517ff991c74e88b00b8de409caf790045f133e9a8283d3b989db88e2b2d93612c3a7929181900390910190a150505050505050505050505050565b600654604080516001600160a01b039283168152918316602083015280517f2e8176039aca48fb2df80d8a3f0c25cf4f12ba7ba15aabe562bd39f71967954f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516001600160a01b039283168152918316602083015280517fad1fe49159fc13ce805cb23e72eb6724c008509c8095b9499752efea5747af3e9281900390910190a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516001600160a01b039283168152918316602083015280517fa2b29bedf9f242c3e9603549e73178e898cc1313c338d783974d5e21098327c49281900390910190a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b600954604080516001600160a01b039283168152918316602083015280517faf8bba87fb343f5755495c80323f32cd6bbfaebd666ff5abac709bc1f76f2f179281900390910190a1600980546001600160a01b0319166001600160a01b0392909216919091179055565b4290565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f424947000000000000000000000060208201526000906001600160401b0383111562001645576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5090919050565b61271061ffff82161115919050565b670de0b6b3a7640000101590565b8154818355818111156200169857600e0281600e0283600052602060002091820191016200169891906200169d565b505050565b6200050891905b80821115620017585780546001600160b01b031916815560006001820181905560028201819055600382018190556004820180546001600160c81b03191690556005820180547fffffffffffff00000000000000000000000000000000000000000000000000001690556006820180546001600160801b0319169055600782018190556008820181905560098201819055600a8201819055600b8201819055600c8201819055600d820155600e01620016a4565b5090565b613cb2806200176c6000396000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c80637fb011d611610156578063c13517e1116100d3578063db18af6c11610097578063e36057b711610071578063e36057b714610952578063f137b44e14610978578063f7fe5789146109d05761027e565b8063db18af6c146107e3578063db9bee4614610823578063e008cb621461082b5761027e565b8063c13517e1146106bd578063cf0a5af314610734578063d7a846931461073c578063d9296df214610762578063da339d21146107885761027e565b8063953e46a01161011a578063953e46a01461065957806395f3c2da1461066157806397023f81146106875780639bf6fa571461068f5780639e0b7a9c146106b55761027e565b80637fb011d6146105c957806382cf57ae146105e857806385acd6411461060e5780638c8bd2181461062b5780638de10e87146106335761027e565b806350c36580116101ff5780636991fdb8116101c35780637cb57c641161019d5780637cb57c641461051f5780637d1f24c9146105a45780637e9adccf146105ac5761027e565b80636991fdb8146104dd5780636f85a700146104e55780637b751b9e146104ed5761027e565b806350c36580146103f957806351a3578014610401578063541cd4681461042757806361f3be6a14610453578063696670051461048b5761027e565b80633b19e84a116102465780633b19e84a146103d15780633b47a9ac146103d95780633c28e88b146103e15780633f33bf86146103e9578063408a2640146103f15761027e565b806308135a93146102835780631986d376146102a757806322f8f6f3146102cb57806324bdf713146102d357806327fe748c14610397575b600080fd5b61028b6109d8565b604080516001600160401b039092168252519081900360200190f35b6102af6109e8565b604080516001600160a01b039092168252519081900360200190f35b61028b610a13565b610395600480360360408110156102e957600080fd5b81019060208101813564010000000081111561030457600080fd5b82018360208201111561031657600080fd5b8035906020019184602083028401116401000000008311171561033857600080fd5b91939092909160208101903564010000000081111561035657600080fd5b82018360208201111561036857600080fd5b8035906020019184602083028401116401000000008311171561038a57600080fd5b509092509050610a22565b005b6103bd600480360360208110156103ad57600080fd5b50356001600160a01b0316610bb6565b604080519115158252519081900360200190f35b6102af610bd8565b6102af610c03565b6102af610c0d565b61028b610c1c565b6102af610c26565b61028b610c35565b6103956004803603602081101561041757600080fd5b50356001600160a01b0316610c3f565b6103956004803603604081101561043d57600080fd5b50803590602001356001600160a01b0316610ccb565b6104796004803603602081101561046957600080fd5b50356001600160401b0316610d59565b60408051918252519081900360200190f35b6104b1600480360360208110156104a157600080fd5b50356001600160401b0316610e09565b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190f35b61028b610e31565b6102af610e40565b6104f5610e4a565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6103956004803603606081101561053557600080fd5b8135916001600160a01b036020820135169181019060608101604082013564010000000081111561056557600080fd5b82018360208201111561057757600080fd5b8035906020019184600183028401116401000000008311171561059957600080fd5b509092509050610ed4565b610479610fb1565b610395600480360360208110156105c257600080fd5b5035611088565b610395600480360360208110156105df57600080fd5b50351515611112565b610479600480360360208110156105fe57600080fd5b50356001600160401b0316611168565b6102af6004803603602081101561062457600080fd5b5035611228565b610395611239565b6103956004803603602081101561064957600080fd5b50356001600160a01b03166112c5565b6102af6113db565b6104796004803603602081101561067757600080fd5b50356001600160401b0316611406565b6102af61141d565b61028b600480360360208110156106a557600080fd5b50356001600160401b031661142c565b6102af611437565b610479600480360360408110156106d357600080fd5b813591908101906040810160208201356401000000008111156106f557600080fd5b82018360208201111561070757600080fd5b8035906020019184600183028401116401000000008311171561072957600080fd5b509092509050611446565b610395611523565b6103956004803603602081101561075257600080fd5b50356001600160a01b03166115ad565b6103956004803603602081101561077857600080fd5b50356001600160a01b03166116c3565b61039560048036036102e081101561079f57600080fd5b506001600160401b03813516906001600160a01b0360208201351690604081019060ff60a0820135169060c08101906101e0810190610220810190610260016117d9565b610800600480360360208110156107f957600080fd5b503561194d565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102af6119e7565b6108516004803603602081101561084157600080fd5b50356001600160401b03166119f1565b6040516001600160a01b03881681526020810187606080838360005b8381101561088557818101518382015260200161086d565b5050505060ff89169201918252506020018561012080838360005b838110156108b85781810151838201526020016108a0565b5050505090500184600260200280838360005b838110156108e35781810151838201526020016108cb565b5050505090500183600260200280838360005b8381101561090e5781810151838201526020016108f6565b5050505090500182600460200280838360005b83811015610939578181015183820152602001610921565b5050505090500197505050505050505060405180910390f35b6103956004803603602081101561096857600080fd5b50356001600160401b0316611a3d565b61099e6004803603602081101561098e57600080fd5b50356001600160401b0316611ac6565b604080516001600160401b03958616815293909416602084015282840191909152606082015290519081900360800190f35b61028b611b02565b60006109e2611b0c565b90505b90565b60006109e27f7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346611b32565b6000546001600160401b031690565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610ade57604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa3578181015183820152602001610a8b565b50505050905090810190601f168015610ad05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060408051808201909152601e81527f4354525f494e56414c49445f494d504c535f494e5055545f4c454e47544800006020820152838214610b6457604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060005b83811015610baf57610ba7858583818110610b7f57fe5b90506020020135848484818110610b9257fe5b905060200201356001600160a01b0316611b4d565b600101610b68565b5050505050565b6001600160a01b03811660009081526005602052604090205460ff165b919050565b60006109e27f06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7611b32565b60006109e2611c44565b6006546001600160a01b031690565b60006109e2611c6f565b6009546001600160a01b031690565b60006109e2611d45565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610cbe57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc881611db7565b50565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610d4a57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610d558282611b4d565b5050565b6000805460408051808201909152601781527f434c4b5f5445524d5f444f45535f4e4f545f4558495354000000000000000000602082015283916001600160401b03600160401b90910481169083161115610df857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610e0283611e21565b9392505050565b600080600080610e17611ef8565b9050610e238582611f0e565b935093509350509193909250565b6002546001600160401b031690565b60006109e2611f4e565b6000806000610e57611f79565b92506000839050806001600160a01b0316637b751b9e6040518163ffffffff1660e01b8152600401604080518083038186803b158015610e9657600080fd5b505afa158015610eaa573d6000803e3d6000fd5b505050506040513d6040811015610ec057600080fd5b508051602090910151949590949350915050565b6000610ede611f79565b6040517f5bdaf9d80000000000000000000000000000000000000000000000000000000081523360048201818152602483018990526001600160a01b03888116604485015260806064850190815260848501889052949550919391851692635bdaf9d89285928b928b928b928b9290919060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b50505050505050505050565b60008054600160401b90046001600160401b03168082526001602081905260408320908101548015610fe75792506109e5915050565b6000610ff284611e21565b60408051808201909152601f81527f434c4b5f5445524d5f52414e444f4d4e4553535f554e415641494c41424c450060208201529091508161107857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060019092018290555091505090565b336000611093611f79565b9050806001600160a01b031663c39c83d183856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050505050565b33600081815260056020908152604091829020805460ff1916851515908117909155825190815291517f189949428c2e58715ea2f0be0d702bc14e73743bdbb58814a595c19e1285c5be9281900390910190a250565b6000805460408051808201909152601781527f434c4b5f5445524d5f444f45535f4e4f545f4558495354000000000000000000602082015283916001600160401b03600160401b9091048116908316111561120757604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5050506001600160401b031660009081526001602052604090206002015490565b600061123382611b32565b92915050565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b031633146112b857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506112c36000611fa4565b565b6006546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461134457604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166113d157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc88161200e565b60006109e27f3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370611b32565b600080611411611ef8565b9050610e028382612078565b6007546001600160a01b031690565b600061123382612091565b6008546001600160a01b031690565b60003381611452611f79565b9050806001600160a01b0316631d2fa1fb8361146d8961233e565b60405163ffffffff841660e01b81526001600160a01b0383166004820190815260ff83166024830152606060448301908152606483018b90528b928b929190608401848480828437600081840152601f19601f82011690508083019250505095505050505050602060405180830381600087803b1580156114ed57600080fd5b505af1158015611501573d6000803e3d6000fd5b505050506040513d602081101561151757600080fd5b50519695505050505050565b6006546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b031633146115a257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506112c3600061200e565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461162c57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166116b957604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc881611fa4565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461174257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166117cf57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc8816123cf565b6007546001600160a01b03163314806117fc57506008546001600160a01b031633145b604051806040016040528060178152602001600080516020613c678339815191528152509061186f57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50600061187a611c6f565b9050611942818a8a8a600380602002604051908101604052809291908260036020028082843760009201919091525050604080516101208181019092528d9250908c9060099083908390808284376000920191909152505060408051808201825291508c9060029083908390808284376000920191909152505060408051808201825291508c9060029083908390808284376000920191909152505060408051608081810190925291508c906004908390839080828437600092019190915250612439915050565b505050505050505050565b600080600061195a611f79565b9050600080826001600160a01b031663bd881e53876040518263ffffffff1660e01b8152600401808281526020019150506040805180830381600087803b1580156119a457600080fd5b505af11580156119b8573d6000803e3d6000fd5b505050506040513d60408110156119ce57600080fd5b50805160209091015190955060ff169350505050915091565b60006109e2611f79565b60006119fb613a48565b6000611a05613a66565b611a0d613a85565b611a15613a85565b611a1d613aa3565b611a26886131a0565b959e949d50929b5090995097509550909350915050565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314611abc57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc8816131fa565b6001600160401b03908116600090815260016020819052604090912080549181015460029091015482841694600160401b909304909316929091565b60006109e2611ef8565b60006109e2611b19611d45565b600054600160401b90046001600160401b0316906133df565b6000908152600a60205260409020546001600160a01b031690565b611b5681613480565b6040518060400160405280601f81526020017f4354525f494d504c454d454e544154494f4e5f4e4f545f434f4e54524143540081525090611bdb57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506000828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581529182015281517f0669329f751b07de4aa82f60514a409d0dfaef266e791a4a65a95b07b1c4c324929181900390910190a15050565b60006109e27f2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365611b32565b600080611c7a611d45565b60408051808201909152601881527f434c4b5f544f4f5f4d414e595f5452414e534954494f4e530000000000000000602082015290915060016001600160401b0383161115611d0d57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506001600160401b038116611d36575050600054600160401b90046001600160401b03166109e5565b611d3f81612091565b91505090565b600080546001600160401b03600160401b90910481168252600160205260408220541680611d7161349f565b6001600160401b03161015611d8a5760009150506109e5565b6000546001600160401b031681611d9f61349f565b036001600160401b031681611db057fe5b0491505090565b600854604080516001600160a01b039283168152918316602083015280517fa2b29bedf9f242c3e9603549e73178e898cc1313c338d783974d5e21098327c49281900390910190a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160401b038082166000908152600160205260408120805491929091600160401b900416611e506134b1565b6001600160401b0316116040518060400160405280601b81526020017f434c4b5f5445524d5f52414e444f4d4e4553535f4e4f545f594554000000000081525090611edf57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5054600160401b90046001600160401b03164092915050565b600054600160401b90046001600160401b031690565b600080600080611f1e86866134be565b805460028201546005909201546001600160a01b0390911698919750600160801b900461ffff1695509350505050565b60006109e27fc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329611b32565b60006109e27f14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6611b32565b600954604080516001600160a01b039283168152918316602083015280517faf8bba87fb343f5755495c80323f32cd6bbfaebd666ff5abac709bc1f76f2f179281900390910190a1600980546001600160a01b0319166001600160a01b0392909216919091179055565b600654604080516001600160a01b039283168152918316602083015280517f2e8176039aca48fb2df80d8a3f0c25cf4f12ba7ba15aabe562bd39f71967954f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60008061208584846134be565b600a0154949350505050565b60008061209c611d45565b90506000816001600160401b0316846001600160401b0316106120bf57816120c1565b835b6001600160401b03169050600081116040518060400160405280601c81526020017f434c4b5f494e56414c49445f5452414e534954494f4e5f5445524d53000000008152509061215557604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060006121606134b1565b600054909150600160401b90046001600160401b03168060015b8481116122c4576001600160401b0380831660009081526001602081905260408083209590910192831682528120919391906121b4613aa3565b6121bd866131a0565b9650505050505091506121cf866134f1565b60005484546121f0916001600160401b03918216911663ffffffff6133df16565b835467ffffffffffffffff19166001600160401b03918216176fffffffffffffffff00000000000000001916600160401b60018b01929092169190910217835560008160036020020151116122a957816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227857600080fd5b505afa15801561228c573d6000803e3d6000fd5b505050506040513d60208110156122a257600080fd5b50516122af565b60608101515b6002939093019290925550505060010161217a565b50600080546001600160401b03808416600160401b81026fffffffffffffffff00000000000000001990931692909217909255604080519285168352602083019190915280517fb8818b6d0c27e4fc7cf75de16ac2543426d3c0bcc520931d24e5a7dde4adca119281900390910190a19695505050505050565b60408051808201909152601481527f55494e54385f4e554d4245525f544f4f5f424947000000000000000000000000602082015260009060ff8311156123c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5090919050565b600754604080516001600160a01b039283168152918316602083015280517fad1fe49159fc13ce805cb23e72eb6724c008509c8095b9499752efea5747af3e9281900390910190a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160401b03891615806124605750886001600160401b0316886001600160401b0316115b6040518060400160405280601181526020017f434f4e465f544f4f5f4f4c445f5445524d000000000000000000000000000000815250906124e557604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060028560ff161015604051806060016040528060218152602001613c25602191399061255657604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506040805160608101909152602180825260fc60ff881611159190613c046020830139906125c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b508151158015906125dc5750602082015115155b6040518060400160405280601b81526020017f434f4e465f5a45524f5f434f4c4c41544552414c5f464143544f5200000000008152509061266157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506126738360005b60200201516134fa565b6040518060400160405280601881526020017f434f4e465f494e56414c49445f50454e414c54595f5043540000000000000000815250906126f857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50612704836001612669565b6040518060400160405280602081526020017f434f4e465f494e56414c49445f46494e414c5f524f554e445f5245445f5043548152509061278957604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060a084015160408051808201909152601e81527f434f4e465f4241445f494e495449414c5f4a55524f52535f4e554d42455200006020820152906001600160401b031661281b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060c084015160408051808201909152601b81527f434f4e465f4241445f41505045414c5f535445505f464143544f5200000000006020820152906001600160401b03166128ad57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060e08401516001600160401b0316600081158015906128ce5750600a8211155b9050806040518060400160405280601e81526020017f434f4e465f494e56414c49445f4d41585f41505045414c5f524f554e445300008152509061295657604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060005b6005811015612a3457600087826009811061297157fe5b60200201516001600160401b03161180156129a657506121de87826009811061299657fe5b60200201516001600160401b0316105b6040518060400160405280601f81526020017f434f4e465f4c415247455f524f554e445f50484153455f4455524154494f4e0081525090612a2b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060010161295a565b50825160408051808201909152601c81527f434f4e465f5a45524f5f4d494e5f4143544956455f42414c414e434500000000602082015290612aba57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060008360016020020151116040518060400160405280601e81526020017f434f4e465f4d494e5f4d41585f544f54414c5f535550504c595f5a45524f000081525090612b4b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506040830151612b5a90613509565b604051806060016040528060258152602001613bdf6025913990612bc257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b508260026020020151836001602002015110604051806060016040528060218152602001613c466021913990612c3c57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506002546001600160401b03808d1691161115612c73576002546001600160401b0316600090815260046020526040812055612c87565b6003805490612c859060018301613ac1565b505b600380546000198101916000916001600160401b038416908110612ca757fe5b90600052602060002090600e020190506040518060a001604052808c6001600160a01b0316815260200188600160028110612cde57fe5b602002015161ffff1681526020018b600060038110612cf957fe5b602002015181526020018b600160038110612d1057fe5b602002015181526020018b600260038110612d2757fe5b60209081029190910151909152815183548383015161ffff16600160a01b0275ffff0000000000000000000000000000000000000000196001600160a01b039093166001600160a01b03199092169190911791909116178355604080830151600185015560608301516002850155608090920151600384015581516101a0810190925260ff8b168252810189600060200201516001600160401b0316815260200189600160098110612dd557fe5b60200201516001600160401b0316815260200189600260098110612df557fe5b60200201516001600160401b0316815260200189600360098110612e1557fe5b60200201516001600160401b0316815260200189600460098110612e3557fe5b60200201516001600160401b0316815260200188600060028110612e5557fe5b602002015161ffff16815260200189600560098110612e7057fe5b60200201516001600160401b0316815260200189600660098110612e9057fe5b60200201516001600160401b0316815260200189600860098110612eb057fe5b60200201516001600160401b0316815260200185815260200187600060028110612ed657fe5b6020020151815260200187600160028110612eed57fe5b6020908102919091015190915281516004840180549284015160408086015160608701516001600160401b0390811671010000000000000000000000000000000000027fffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff92821669010000000000000000000270ffffffffffffffff0000000000000000001995831661010090810268ffffffffffffffff001960ff909a1660ff19909b169a909a1798909816989098179490941696909617169190911790915560808085015160058701805460a088015160c089015160e08a015189167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff61ffff909216600160801b0271ffff0000000000000000000000000000000019938b16600160401b9081026fffffffffffffffff000000000000000019988d1667ffffffffffffffff199788161789161794909416179190911617909255948701516006890180546101208a01518916909302919097169190951617169290921790925561014083015160078501556101608301516008850155610180909201516009840155805191820190528086600060200201518152602001866001600481106130c957fe5b60200201518152602001866002600481106130e057fe5b60200201518152602001866003600481106130f757fe5b602090810291909101519091528151600a84015581810151600b840155604080830151600c850155606090920151600d8401556001600160401b038e8116600081815260048452849020918616918290556002805467ffffffffffffffff19168217905583519081529182015281517ff991c74e88b00b8de409caf790045f133e9a8283d3b989db88e2b2d93612c3a7929181900390910190a150505050505050505050505050565b60006131aa613a48565b60006131b4613a66565b6131bc613a85565b6131c4613a85565b6131cc613aa3565b60006131d6611ef8565b90506131e28982613517565b959f949e50929c50909a509850965090945092505050565b613202611b0c565b60408051808201909152601e81527f434c4b5f43414e4e4f545f44454c41595f535441525445445f434f55525400006020820152906001600160401b03161561328f57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506000808052600160205280547fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4980549092916132de916001600160401b03908116911663ffffffff6133df16565b9050806001600160401b0316836001600160401b0316116040518060400160405280602081526020017f434c4b5f43414e4e4f545f44454c41595f504153545f53544152545f54494d458152509061337a57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50600054825467ffffffffffffffff19166001600160401b0391821685038216178355604080518383168152918516602083015280517f9b735da8a0762c6e913df06587b4fa81f87b8075e2a2afdeae6afde9456fd8799281900390910190a1505050565b60408051808201909152601381527f4d41544836345f4144445f4f564552464c4f57000000000000000000000000006020820152600090838301906001600160401b03808616908316101561347857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b509392505050565b60006001600160a01b03821661349857506000610bd3565b503b151590565b60006109e26134ac61380d565b613811565b60006109e26134ac6138a1565b6000806134cb84846138a5565b9050600381815481106134da57fe5b90600052602060002090600e020191505092915050565b610cc881613934565b61271061ffff82161115919050565b670de0b6b3a7640000101590565b6000613521613a48565b600061352b613a66565b613533613a85565b61353b613a85565b613543613aa3565b600061354f8a8a6134be565b905060008160000190508060000160009054906101000a90046001600160a01b03169850604051806060016040528082600101548152602001826002015481526020018260030154815250975060008260040190508060000160009054906101000a900460ff1697506040518061012001604052808260000160019054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260000160099054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260000160119054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160129054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260020160009054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200182600301546001600160401b03166001600160401b031681526020018260020160089054906101000a90046001600160401b03166001600160401b03166001600160401b0316815250965060405180604001604052808260010160109054906101000a900461ffff1661ffff1661ffff1681526020018360000160149054906101000a900461ffff1661ffff1661ffff16815250955060405180604001604052808260040154815260200182600501548152509450600083600a0190506040518060800160405280826000015481526020018260010154815260200182600201548152602001826003015481525094505050505092959891949750929550565b4290565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f424947000000000000000000000060208201526000906001600160401b038311156123c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b4390565b6000816001600160401b0316836001600160401b0316116138df57506001600160401b038216600090815260046020526040902054611233565b6002546001600160401b039081169084168111613915576001600160401b03166000908152600460205260409020549050611233565b50506001600160401b0316600090815260046020526040902054919050565b6001600160401b03811660009081526004602052604090205480610d555760006004816139716001600160401b038616600163ffffffff6139a416565b6001600160401b039081168252602080830193909352604091820160009081205491871681526004909352912055505050565b6000826001600160401b0316826001600160401b031611156040518060400160405280601481526020017f4d41544836345f5355425f554e444552464c4f5700000000000000000000000081525090613a4157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5050900390565b60405180606001604052806003906020820280388339509192915050565b6040518061012001604052806009906020820280388339509192915050565b60405180604001604052806002906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b815481835581811115613aed57600e0281600e028360005260206000209182019101613aed9190613af2565b505050565b6109e591905b80821115613bda57805475ffffffffffffffffffffffffffffffffffffffffffff1916815560006001820181905560028201819055600382018190556004820180547fffffffffffffff000000000000000000000000000000000000000000000000001690556005820180547fffffffffffff00000000000000000000000000000000000000000000000000001690556006820180546fffffffffffffffffffffffffffffffff19169055600782018190556008820181905560098201819055600a8201819055600b8201819055600c8201819055600d820155600e01613af8565b509056fe434f4e465f494e56414c49445f4d41585f4d41585f544f54414c5f535550504c595f504354434f4e465f52554c494e475f4f5054494f4e535f4d4f52455f5448414e5f4d4158434f4e465f52554c494e475f4f5054494f4e535f4c4553535f5448414e5f4d494e434f4e465f4d494e5f4d4f52455f5448414e5f4d41585f4143544956455f5043544354525f53454e4445525f4e4f545f474f5645524e4f52000000000000000000a165627a7a723058205de7c756ad5207a87b0e7d02e1d0a41da5f123dde29e7a913f18c942b6a25b2f0029434f4e465f494e56414c49445f4d41585f4d41585f544f54414c5f535550504c595f504354434f4e465f52554c494e475f4f5054494f4e535f4d4f52455f5448414e5f4d4158434f4e465f52554c494e475f4f5054494f4e535f4c4553535f5448414e5f4d494e434f4e465f4d494e5f4d4f52455f5448414e5f4d41585f4143544956455f50435400000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000061a537ad00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000689162a44d160dc0000

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

00000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000061a537ad00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000689162a44d160dc0000

-----Decoded View---------------
Arg [0] : _termParams (uint64[2]): 28800,1638217645
Arg [1] : _governors (address[4]): 0x75ce3dda4f75cff4981b8bc362341c1dd10dda29,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [2] : _feeToken (address): 0xb371248dd0f9e4061ccf8850e9223ca48aa7ca4b
Arg [3] : _fees (uint256[3]): 10000000000000000,100000000000000,50000000000000
Arg [4] : _maxRulingOptions (uint8): 2
Arg [5] : _roundParams (uint64[9]): 21,6,6,6,6,3,3,4,21
Arg [6] : _pcts (uint16[2]): 3000,5000
Arg [7] : _appealCollateralParams (uint256[2]): 30000,20000
Arg [8] : _jurorsParams (uint256[4]): 500000000000000000,100000000000000,1000000000000000,30863000000000000000000

-----Encoded View---------------
28 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [1] : 0000000000000000000000000000000000000000000000000000000061a537ad
Arg [2] : 00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29
Arg [3] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [4] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [5] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [6] : 000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b
Arg [7] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [8] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [9] : 00000000000000000000000000000000000000000000000000002d79883d2000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [21] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [22] : 0000000000000000000000000000000000000000000000000000000000007530
Arg [23] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [24] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [25] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [26] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [27] : 000000000000000000000000000000000000000000000689162a44d160dc0000


Deployed ByteCode Sourcemap

102732:7061:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15279:101;;;:::i;:::-;;;;-1:-1:-1;;;;;15279:101:0;;;;;;;;;;;;;;86328:97;;;:::i;:::-;;;;-1:-1:-1;;;;;86328:97:0;;;;;;;;;;;;;;14738:96;;;:::i;79386:314::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;79386:314:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;79386:314:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;79386:314:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79386:314:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;79386:314:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;79386:314:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;79386:314:0;;-1:-1:-1;79386:314:0;-1:-1:-1;79386:314:0;:::i;:::-;;49023:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49023:133:0;-1:-1:-1;;;;;49023:133:0;;:::i;:::-;;;;;;;;;;;;;;;;;;86108:101;;;:::i;86807:105::-;;;:::i;84685:100::-;;;:::i;13039:101::-;;;:::i;85356:104::-;;;:::i;15563:117::-;;;:::i;77654:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77654:131:0;-1:-1:-1;;;;;77654:131:0;;:::i;79076:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79076:117:0;;;;;;-1:-1:-1;;;;;79076:117:0;;:::i;16782:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16782:152:0;-1:-1:-1;;;;;16782:152:0;;:::i;:::-;;;;;;;;;;;;;;;;83832:243;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;83832:243:0;-1:-1:-1;;;;;83832:243:0;;:::i;:::-;;;;-1:-1:-1;;;;;83832:243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49343:108;;;:::i;87039:111::-;;;:::i;109498:290::-;;;:::i;:::-;;;;-1:-1:-1;;;;;109498:290:0;;;;;;;;;;;;;;;;;;;;;;;;;;;107780:328;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;107780:328:0;;;-1:-1:-1;;;;;107780:328:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;107780:328:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;107780:328: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;-1:-1;107780:328:0;;-1:-1:-1;107780:328:0;-1:-1:-1;107780:328:0;:::i;13961:651::-;;;:::i;108301:269::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108301:269:0;;:::i;44620:189::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44620:189:0;;;;:::i;17148:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17148:165:0;-1:-1:-1;;;;;17148:165:0;;:::i;85638:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85638:105:0;;:::i;78798:113::-;;;:::i;76876:223::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76876:223:0;-1:-1:-1;;;;;76876:223:0;;:::i;86560:114::-;;;:::i;84355:209::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84355:209:0;-1:-1:-1;;;;;84355:209:0;;:::i;84908:102::-;;;:::i;13416:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13416:140:0;-1:-1:-1;;;;;13416:140:0;;:::i;85127:104::-;;;:::i;107114:341::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;107114:341:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;107114:341:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;107114:341: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;-1:-1;107114:341:0;;-1:-1:-1;107114:341:0;-1:-1:-1;107114:341:0;:::i;78446:107::-;;;:::i;77954:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77954:235:0;-1:-1:-1;;;;;77954:235:0;;:::i;77272:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77272:229:0;-1:-1:-1;;;;;77272:229:0;;:::i;75657:727::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;75657:727:0;;;;-1:-1:-1;;;;;75657:727:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;108856:320::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108856:320:0;;:::i;:::-;;;;-1:-1:-1;;;;;108856:320:0;;;;;;;;;;;;;;;;;;;;;85878:107;;;:::i;82376:410::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;82376:410:0;-1:-1:-1;;;;;82376:410:0;;:::i;:::-;;;-1:-1:-1;;;;;82376:410:0;;;;;;;;;;;;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;;;;82376:410:0;;;;;;;;-1:-1:-1;82376:410:0;;;;;;;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;82376:410:0;;;;;;;;;;;;;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;82376:410:0;;;;;;;;;;;;;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;82376:410:0;;;;;;;;;;;;;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;82376:410:0;;;;;;;;;;;;;;;;;;;;;;76566:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76566:141:0;-1:-1:-1;;;;;76566:141:0;;:::i;16265:301::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16265:301:0;-1:-1:-1;;;;;16265:301:0;;:::i;:::-;;;;-1:-1:-1;;;;;16265:301:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14982:109;;;:::i;15279:101::-;15330:6;15356:16;:14;:16::i;:::-;15349:23;;15279:101;;:::o;86328:97::-;86372:7;86399:18;66285:66;86399:10;:18::i;14738:96::-;14788:6;14814:12;-1:-1:-1;;;;;14814:12:0;14738:96;:::o;79386:314::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79544:32:0;;;;;;;;;;;;;;;;;79510;;;79502:75;;;;-1:-1:-1;;;;;79502:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;79502:75:0;-1:-1:-1;79595:9:0;79590:103;79610:15;;;79590:103;;;79647:34;79658:4;;79663:1;79658:7;;;;;;;;;;;;;79667:10;;79678:1;79667:13;;;;;;;;;;;;;-1:-1:-1;;;;;79667:13:0;79647:10;:34::i;:::-;79627:3;;79590:103;;;;79386:314;;;;:::o;49023:133::-;-1:-1:-1;;;;;49121:27:0;;49097:4;49121:27;;;:18;:27;;;;;;;;49023:133;;;;:::o;86108:101::-;86154:7;86181:20;66110:66;86181:10;:20::i;86807:105::-;86858:7;86885:19;:17;:19::i;84685:100::-;84763:8;:14;-1:-1:-1;;;;;84763:14:0;84685:100;:::o;13039:101::-;13086:6;13112:20;:18;:20::i;85356:104::-;85436:16;;-1:-1:-1;;;;;85436:16:0;85356:104;:::o;15563:117::-;15622:6;15648:24;:22;:24::i;77654:131::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;;77745:32;77761:15;77745;:32::i;:::-;77654:131;:::o;79076:117::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;;79163:22;79174:3;79179:5;79163:10;:22::i;:::-;79076:117;;:::o;16782:152::-;16868:7;11653:6;;11661:25;;;;;;;;;;;;;;;;;16850:7;;-1:-1:-1;;;;;;;;11653:6:0;;;;;11642:17;;;;;11634:53;;;;-1:-1:-1;;;;;11634:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11634:53:0;;16895:31;16918:7;16895:22;:31::i;:::-;16888:38;16782:152;-1:-1:-1;;;16782:152:0:o;83832:243::-;83895:14;83911:16;83929:17;83959:24;83986:20;:18;:20::i;:::-;83959:47;;84024:43;84040:7;84049:17;84024:15;:43::i;:::-;84017:50;;;;;;;83832:243;;;;;:::o;49343:108::-;49425:18;;-1:-1:-1;;;;;49425:18:0;49343:108;:::o;87039:111::-;87093:7;87120:22;:20;:22::i;109498:290::-;109547:17;109566:14;109582:17;109624:20;:18;:20::i;:::-;109612:32;;109655:30;109704:9;109655:59;;109749:14;-1:-1:-1;;;;;109749:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;109749:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109749:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109749:31:0;;;;;;;109498:290;;109749:31;;;-1:-1:-1;109498:290:0;-1:-1:-1;;109498:290:0:o;107780:328::-;107890:30;107939:20;:18;:20::i;:::-;108027:73;;;;;108005:10;108027:73;;;;;;;;;;;;-1:-1:-1;;;;;108027:73:0;;;;;;;;;;;;;;;;;;;;107890:70;;-1:-1:-1;108005:10:0;;108027:29;;;;;;108005:10;;108066;;108078;;108090:9;;;;108027:73;;;;;108090:9;;;;108027:73;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;108027:73:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;108027:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108027:73:0;;;;107780:328;;;;;;:::o;13961:651::-;14018:7;14139:6;;-1:-1:-1;;;14139:6:0;;-1:-1:-1;;;;;14139:6:0;14176:20;;;:5;:20;;;;;;;14232:15;;;;14262:28;;14258:82;;14314:14;-1:-1:-1;14307:21:0;;-1:-1:-1;;14307:21:0;14258:82;14388:21;14412:37;14435:13;14412:22;:37::i;:::-;14497:33;;;;;;;;;;;;;;;;;14388:61;;-1:-1:-1;14468:27:0;14460:71;;;;-1:-1:-1;;;;;14460:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;14460:71:0;-1:-1:-1;14542:15:0;;;;:31;;;-1:-1:-1;14560:13:0;-1:-1:-1;;13961:651:0;:::o;108301:269::-;108404:10;108370:19;108475:20;:18;:20::i;:::-;108426:70;;108507:14;-1:-1:-1;;;;;108507:34:0;;108542:7;108551:10;108507:55;;;;;;;;;;;;;-1:-1:-1;;;;;108507:55:0;-1:-1:-1;;;;;108507:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;108507:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108507:55:0;;;;108301:269;;;:::o;44620:189::-;44707:10;44688:30;;;;:18;:30;;;;;;;;;:41;;-1:-1:-1;;44688:41:0;;;;;;;;;;44745:56;;;;;;;;;;;;;;;;;44620:189;:::o;17148:165::-;17240:7;11653:6;;11661:25;;;;;;;;;;;;;;;;;17222:7;;-1:-1:-1;;;;;;;;11653:6:0;;;;;11642:17;;;;;11634:53;;;;-1:-1:-1;;;;;11634:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11634:53:0;-1:-1:-1;;;;;;;;17267:14:0;;;;;:5;:14;;;;;:38;;;;17148:165::o;85638:105::-;85693:7;85720:15;85731:3;85720:10;:15::i;:::-;85713:22;85638:105;-1:-1:-1;;85638:105:0:o;78798:113::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;;78870:33;65792:1;78870:19;:33::i;:::-;78798:113::o;76876:223::-;68421:8;:14;68437:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68437:25:0;;;;;-1:-1:-1;;;;;68421:14:0;68407:10;:28;68399:64;;;;-1:-1:-1;;;;;68399:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68399:64:0;-1:-1:-1;77013:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76978:33:0;;76970:74;;;;-1:-1:-1;;;;;76970:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;76970:74:0;;77055:36;77073:17;77055;:36::i;86560:114::-;86612:7;86639:27;66486:66;86639:10;:27::i;84355:209::-;84423:7;84443:24;84470:20;:18;:20::i;:::-;84443:47;;84508:48;84529:7;84538:17;84508:20;:48::i;84908:102::-;84987:15;;-1:-1:-1;;;;;84987:15:0;84908:102;:::o;13416:140::-;13486:6;13512:36;13523:24;13512:10;:36::i;85127:104::-;85203:20;;-1:-1:-1;;;;;85203:20:0;85127:104;:::o;107114:341::-;107207:7;107261:10;107207:7;107332:20;:18;:20::i;:::-;107283:70;;107371:14;-1:-1:-1;;;;;107371:28:0;;107400:7;107409:26;:16;:24;:26::i;:::-;107371:76;;;;;;;;;-1:-1:-1;;;;;107371:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;107437:9;;;;107371:76;;;;107437:9;;;;107371:76;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;107371:76:0;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;107371:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107371:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107371:76:0;;107114:341;-1:-1:-1;;;;;;107114:341:0:o;78446:107::-;68421:8;:14;68437:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68437:25:0;;;;;-1:-1:-1;;;;;68421:14:0;68407:10;:28;68399:64;;;;-1:-1:-1;;;;;68399:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68399:64:0;;78514:31;65792:1;78514:17;:31::i;77954:235::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;-1:-1:-1;78099:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78062:35:0;;78054:76;;;;-1:-1:-1;;;;;78054:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;78054:76:0;;78141:40;78161:19;78141;:40::i;77272:229::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;-1:-1:-1;77413:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77377:34:0;;77369:75;;;;-1:-1:-1;;;;;77369:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;77369:75:0;;77455:38;77474:18;77455;:38::i;75657:727::-;68865:15;;-1:-1:-1;;;;;68865:15:0;68851:10;:29;;:67;;-1:-1:-1;68898:20:0;;-1:-1:-1;;;;;68898:20:0;68884:10;:34;68851:67;68920:25;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68920:25:0;;;68843:103;;;;;-1:-1:-1;;;;;68843:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68843:103:0;;76058:20;76081;:18;:20::i;:::-;76058:43;;76112:264;76137:13;76165:11;76191:9;76215:5;76112:264;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;;76235:17;;-1:-1:-1;76112:264:0;76267:12;;76112:264;;;;76267:12;;76112:264;76267:12;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;-1:-1:-1;76294:5:0;;76112:264;;;;76294:5;;76112:264;76294:5;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;-1:-1:-1;76314:23:0;;76112:264;;;;76314:23;;76112:264;76314:23;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;;;-1:-1:-1;76352:13:0;;76112:264;;;;76352:13;;76112:264;76352:13;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;76112:10:0;;-1:-1:-1;;76112:264:0:i;:::-;68957:1;75657:727;;;;;;;;:::o;108856:320::-;108908:15;108925:14;108952:30;109001:20;:18;:20::i;:::-;108952:70;;109034:20;109056:13;109073:14;-1:-1:-1;;;;;109073:28:0;;109102:10;109073:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;109073:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109073:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109073:40:0;;;;;;;;;-1:-1:-1;109151:16:0;;;-1:-1:-1;;;;108856:320:0;;;:::o;85878:107::-;85930:7;85957:20;:18;:20::i;82376:410::-;82457:14;82486:22;;:::i;:::-;82523;82560:28;;:::i;:::-;82603:21;;:::i;:::-;82639:40;;:::i;:::-;82694:30;;:::i;:::-;82759:19;82770:7;82759:10;:19::i;:::-;82752:26;;;;-1:-1:-1;82752:26:0;;-1:-1:-1;82752:26:0;;-1:-1:-1;82752:26:0;-1:-1:-1;82752:26:0;-1:-1:-1;82752:26:0;;-1:-1:-1;82376:410:0;-1:-1:-1;;82376:410:0:o;76566:141::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;;76660:39;76676:22;76660:15;:39::i;16265:301::-;-1:-1:-1;;;;;16444:14:0;;;16321:16;16444:14;;;:5;:14;;;;;;;;16477;;16512:15;;;;16529:28;;;;;16477:14;;;;-1:-1:-1;;;16493:17:0;;;;;;;16512:15;;16265:301::o;14982:109::-;15037:6;15063:20;:18;:20::i;22577:119::-;22626:6;22652:36;22663:24;:22;:24::i;:::-;22652:6;;-1:-1:-1;;;22652:6:0;;-1:-1:-1;;;;;22652:6:0;;:10;:36::i;90284:103::-;90340:7;90367:12;;;:7;:12;;;;;;-1:-1:-1;;;;;90367:12:0;;90284:103::o;88781:205::-;88857:17;88868:5;88857:10;:17::i;:::-;88876:33;;;;;;;;;;;;;;;;;88849:61;;;;;-1:-1:-1;;;;;88849:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;88849:61:0;-1:-1:-1;88921:12:0;;;;:7;:12;;;;;;;;;:20;;-1:-1:-1;;;;;;88921:20:0;-1:-1:-1;;;;;88921:20:0;;;;;;;;88957:21;;;;;;;;;;;;;;;;;;;;;;88781:205;;:::o;89704:112::-;89756:7;89783:25;66682:66;89783:10;:25::i;17677:642::-;17725:6;17867:26;17896:24;:22;:24::i;:::-;17997:26;;;;;;;;;;;;;;;;;17867:53;;-1:-1:-1;10480:1:0;-1:-1:-1;;;;;17939:56:0;;;;17931:93;;;;-1:-1:-1;;;;;17931:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;17931:93:0;-1:-1:-1;;;;;;18122:28:0;;18118:79;;-1:-1:-1;;18179:6:0;;-1:-1:-1;;;18179:6:0;;-1:-1:-1;;;;;18179:6:0;18172:13;;18118:79;18280:31;18291:19;18280:10;:31::i;:::-;18273:38;;;17677:642;:::o;22900:593::-;22957:6;23189;;-1:-1:-1;;;;;;;;23189:6:0;;;;;23183:13;;:5;:13;;;;;:23;;;23221:16;:14;:16::i;:::-;-1:-1:-1;;;;;23221:39:0;;23217:88;;;23291:1;23277:16;;;;;23217:88;23473:12;;-1:-1:-1;;;;;23473:12:0;23449:20;23430:16;:14;:16::i;:::-;:39;-1:-1:-1;;;;;23429:56:0;;;;;;;23422:63;;;22900:593;:::o;88045:189::-;88139:20;;88120:57;;;-1:-1:-1;;;;;88139:20:0;;;88120:57;;;;;;;;;;;;;;;;;;;;;88188:20;:38;;-1:-1:-1;;;;;;88188:38:0;-1:-1:-1;;;;;88188:38:0;;;;;;;;;;88045:189::o;24081:268::-;-1:-1:-1;;;;;24192:14:0;;;24152:7;24192:14;;;:5;:14;;;;;24246:17;;24152:7;;24192:14;;-1:-1:-1;;;24246:17:0;;;24225:18;:16;:18::i;:::-;-1:-1:-1;;;;;24225:38:0;;24265:29;;;;;;;;;;;;;;;;;24217:78;;;;;-1:-1:-1;;;;;24217:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;24217:78:0;-1:-1:-1;24323:17:0;-1:-1:-1;;;24323:17:0;;-1:-1:-1;;;;;24323:17:0;24313:28;;24081:268;-1:-1:-1;;24081:268:0:o;22275:93::-;22328:6;22354;-1:-1:-1;;;22354:6:0;;-1:-1:-1;;;;;22354:6:0;;22275:93::o;62586:331::-;62687:14;62703:16;62721:17;62756:21;62780:42;62794:7;62803:18;62780:13;:42::i;:::-;62841:17;;62860:20;;;;62882:26;;;;;-1:-1:-1;;;;;62841:17:0;;;;62860:20;;-1:-1:-1;;;;62882:26:0;;;;;-1:-1:-1;62586:331:0;-1:-1:-1;;;;62586:331:0:o;89966:119::-;90021:7;90048:29;66889:66;90048:10;:29::i;89435:115::-;89488:7;89515:27;65929:66;89515:10;:27::i;88412:201::-;88518:16;;88495:61;;;-1:-1:-1;;;;;88518:16:0;;;88495:61;;;;;;;;;;;;;;;;;;;;;88567:16;:38;;-1:-1:-1;;;;;;88567:38:0;-1:-1:-1;;;;;88567:38:0;;;;;;;;;;88412:201::o;87323:187::-;87423:8;:14;87402:55;;;-1:-1:-1;;;;;87423:14:0;;;87402:55;;;;;;;;;;;;;;;;;;;;;87468:8;:34;;-1:-1:-1;;;;;;87468:34:0;-1:-1:-1;;;;;87468:34:0;;;;;;;;;;87323:187::o;63303:238::-;63399:7;63419:21;63443:42;63457:7;63466:18;63443:13;:42::i;:::-;63503:13;;:30;;63303:238;-1:-1:-1;;;;63303:238:0:o;18634:2295::-;18705:6;18835:24;18862;:22;:24::i;:::-;18835:51;;18897:19;18954:17;-1:-1:-1;;;;;18927:44:0;:24;-1:-1:-1;;;;;18927:44:0;;:91;;19001:17;18927:91;;;18974:24;18927:91;-1:-1:-1;;;;;18919:100:0;18897:122;;19052:1;19038:11;:15;19055:30;;;;;;;;;;;;;;;;;19030:56;;;;;-1:-1:-1;;;;;19030:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;19030:56:0;;19099:18;19120;:16;:18::i;:::-;19149:21;19173:6;19099:39;;-1:-1:-1;;;;19173:6:0;;-1:-1:-1;;;;;19173:6:0;;19264:1;19238:1562;19281:11;19267:10;:25;19238:1562;;-1:-1:-1;;;;;19689:22:0;;;19661:25;19689:22;;;:5;:22;;;;;;;;19695:15;;;;19753:20;;;;;;;19695:15;;19689:22;19753:20;19810:30;;:::i;:::-;19844:25;19855:13;19844:10;:25::i;:::-;19788:81;;;;;;;;;19884:34;19904:13;19884:19;:34::i;:::-;20167:12;;20140:22;;:40;;-1:-1:-1;;;;;20140:22:0;;;;20167:12;20140:40;:26;:40;:::i;:::-;20116:64;;-1:-1:-1;;20116:64:0;-1:-1:-1;;;;;20116:64:0;;;;-1:-1:-1;;20446:42:0;-1:-1:-1;;;20116:64:0;20473:15;;20446:42;;;;;;;;;;;-1:-1:-1;20726:12:0;20739:1;20726:15;;;;:19;:62;;20766:8;-1:-1:-1;;;;;20766:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20766:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20766:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20766:22:0;20726:62;;;20748:15;;;;20726:62;20688:35;;;;;:100;;;;-1:-1:-1;;;19294:12:0;;19238:1562;;;-1:-1:-1;20812:6:0;:22;;-1:-1:-1;;;;;20812:22:0;;;-1:-1:-1;;;20812:22:0;;-1:-1:-1;;20812:22:0;;;;;;;;;;20850:40;;;;;;;;;;;;;;;;;;;;;;;;;;;20908:13;18634:2295;-1:-1:-1;;;;;;18634:2295:0:o;501:154::-;594:26;;;;;;;;;;;;;;;;;552:5;;583:9;578:14;;;570:51;;;;-1:-1:-1;;;;;570:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;570:51:0;-1:-1:-1;645:1:0;;501:154;-1:-1:-1;501:154:0:o;87685:194::-;87788:15;;87766:58;;;-1:-1:-1;;;;;87788:15:0;;;87766:58;;;;;;;;;;;;;;;;;;;;;87835:15;:36;;-1:-1:-1;;;;;;87835:36:0;-1:-1:-1;;;;;87835:36:0;;;;;;;;;;87685:194::o;52855:4720::-;-1:-1:-1;;;;;53458:12:0;;;;:37;;;53488:7;-1:-1:-1;;;;;53474:21:0;:11;-1:-1:-1;;;;;53474:21:0;;53458:37;53497:18;;;;;;;;;;;;;;;;;53450:66;;;;;-1:-1:-1;;;;;53450:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53450:66:0;;53558:1;53537:17;:22;;;;53561:34;;;;;;;;;;;;;;;;;53529:67;;;;;-1:-1:-1;;;;;53529:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53529:67:0;-1:-1:-1;53721:34:0;;;;;;;;;;;;;53685;;;;;;;53721;;;;;;53677:79;;;;;-1:-1:-1;;;;;53677:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53677:79:0;-1:-1:-1;53847:26:0;;:30;;;;:64;;-1:-1:-1;53881:26:0;;;;:30;;53847:64;53913:28;;;;;;;;;;;;;;;;;53839:103;;;;;-1:-1:-1;;;;;53839:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53839:103:0;-1:-1:-1;54060:28:0;54079:5;54085:1;54079:8;;;;;54060:18;:28::i;:::-;54090:25;;;;;;;;;;;;;;;;;54052:64;;;;;-1:-1:-1;;;;;54052:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54052:64:0;-1:-1:-1;54135:28:0;54154:5;54160:1;54154:8;;54135:28;54165:39;;;;;;;;;;;;;;;;;54127:78;;;;;-1:-1:-1;;;;;54127:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54127:78:0;-1:-1:-1;54303:15:0;;;;54324:31;;;;;;;;;;;;;54303:15;54324:31;;;;-1:-1:-1;;;;;54303:19:0;54295:61;;;;-1:-1:-1;;;;;54295:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54295:61:0;-1:-1:-1;54434:15:0;;;;54455:28;;;;;;;;;;;;;54434:15;54455:28;;;;-1:-1:-1;;;;;54434:19:0;54426:58;;;;-1:-1:-1;;;;;54426:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54426:58:0;-1:-1:-1;54612:15:0;;;;-1:-1:-1;;;;;54578:49:0;:31;54668:27;;;;;:89;;;40651:2;54699:23;:58;;54668:89;54638:119;;54776:22;54800:31;;;;;;;;;;;;;;;;;54768:64;;;;;-1:-1:-1;;;;;54768:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54768:64:0;-1:-1:-1;54920:6:0;54915:162;54936:1;54932;:5;54915:162;;;54985:1;54967:12;54980:1;54967:15;;;;;;;;;;;-1:-1:-1;;;;;54967:19:0;;:63;;;;-1:-1:-1;40526:4:0;54990:12;55003:1;54990:15;;;;;;;;;;;-1:-1:-1;;;;;54990:40:0;;54967:63;55032:32;;;;;;;;;;;;;;;;;54959:106;;;;;-1:-1:-1;;;;;54959:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54959:106:0;-1:-1:-1;54939:3:0;;54915:162;;;-1:-1:-1;55150:16:0;;55172:29;;;;;;;;;;;;;55150:16;55172:29;;;;55142:60;;;;-1:-1:-1;;;;;55142:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55142:60:0;-1:-1:-1;55317:1:0;55298:13;55312:1;55298:16;;;;:20;55320:31;;;;;;;;;;;;;;;;;55290:62;;;;;-1:-1:-1;;;;;55290:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55290:62:0;-1:-1:-1;55490:16:0;;;;55458:49;;:31;:49::i;:::-;55509:38;;;;;;;;;;;;;;;;;55450:98;;;;;-1:-1:-1;;;;;55450:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55450:98:0;-1:-1:-1;55711:13:0;55725:1;55711:16;;;;55692:13;55706:1;55692:16;;;;:35;55729:34;;;;;;;;;;;;;;;;;55684:80;;;;;-1:-1:-1;;;;;55684:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55684:80:0;-1:-1:-1;55946:18:0;;-1:-1:-1;;;;;55946:28:0;;;:18;;:28;55942:148;;;56006:18;;-1:-1:-1;;;;;56006:18:0;56028:1;55991:34;;;:14;:34;;;;;:38;55942:148;;;56062:7;:16;;;;;;;;;:::i;:::-;;55942:148;56132:7;:14;;-1:-1:-1;;56132:18:0;;;56102:20;;-1:-1:-1;;;;;56186:22:0;;;;;;;;;;;;;;;;;;;56162:46;;56235:198;;;;;;;;56268:9;-1:-1:-1;;;;;56235:198:0;;;;;56413:5;56419:1;56413:8;;;;;;;;;;;56235:198;;;;;;56302:5;56308:1;56302:8;;;;;;;;;;;56235:198;;;;56335:5;56341:1;56335:8;;;;;;;;;;;56235:198;;;;56369:5;56375:1;56369:8;;;;;;;;;;;;;;;;56235:198;;;56221:212;;;;;;;;;;-1:-1:-1;;;56221:212:0;-1:-1:-1;;;;;;;56221:212:0;;;-1:-1:-1;;;;;;56221:212:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56464:688;;;;;;;;;;;;;;;56559:12;56221:11;56559:15;;;;-1:-1:-1;;;;;56464:688:0;;;;;56602:12;56615:1;56602:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56645:12;56658:1;56645:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56688:12;56701:1;56688:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56738:12;56751:1;56738:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56780:5;56786:1;56780:8;;;;;;;;;;;56464:688;;;;;;56827:12;56840:1;56827:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56875:12;56888:1;56875:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56988:12;57001:1;56988:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56929:23;56464:688;;;;57042:23;57066:1;57042:26;;;;;;;;;;;56464:688;;;;57114:23;57138:1;57114:26;;;;;;;;;;;;;;;;56464:688;;;56446:706;;:15;;;:706;;;;;;;;;;;;;;;-1:-1:-1;;;;;56446:706:0;;;;;;;;;;;-1:-1:-1;;56446:706:0;;;;;;;-1:-1:-1;;56446:706:0;;;;-1:-1:-1;;56446:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56446:706:0;-1:-1:-1;;56446:706:0;;;-1:-1:-1;;;56446:706:0;;;-1:-1:-1;;56446:706:0;;;-1:-1:-1;;56446:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57181:232;;;;;;;;57227:13;56446:706;57227:16;;;;57181:232;;;;57280:13;57294:1;57280:16;;;;;;;;;;;57181:232;;;;57333:13;57347:1;57333:16;;;;;;;;;;;57181:232;;;;57385:13;57399:1;57385:16;;;;;;;;;;;;;;;;57181:232;;;57165:248;;:13;;;:248;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57426:27:0;;;57165:248;57426:27;;;:14;:27;;;;;:43;;;;;;;57165:248;57480:32;;-1:-1:-1;;57480:32:0;;;;;57530:37;;;;;;;;;;;;;;;;;;;;;;52855:4720;;;;;;;;;;;;;:::o;82914:490::-;82996:14;83025:22;;:::i;:::-;83062;83099:28;;:::i;:::-;83142:21;;:::i;:::-;83178:40;;:::i;:::-;83233:30;;:::i;:::-;83291:24;83318:20;:18;:20::i;:::-;83291:47;;83356:40;83369:7;83378:17;83356:12;:40::i;:::-;83349:47;;;;-1:-1:-1;83349:47:0;;-1:-1:-1;83349:47:0;;-1:-1:-1;83349:47:0;-1:-1:-1;83349:47:0;-1:-1:-1;83349:47:0;;-1:-1:-1;82914:490:0;-1:-1:-1;;;82914:490:0:o;21136:660::-;21220:16;:14;:16::i;:::-;21243:32;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21220:21:0;;21212:64;;;;-1:-1:-1;;;;;21212:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;21212:64:0;-1:-1:-1;21289:17:0;21309:8;;;:5;:8;;21382:12;;21309:8;21363:14;;21309:8;;21289:17;21363:32;;-1:-1:-1;;;;;21363:14:0;;;;21382:12;21363:32;:18;:32;:::i;:::-;21328:67;;21439:25;-1:-1:-1;;;;;21414:50:0;:22;-1:-1:-1;;;;;21414:50:0;;21466:34;;;;;;;;;;;;;;;;;21406:95;;;;;-1:-1:-1;;;;;21406:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;21406:95:0;-1:-1:-1;21693:12:0;;21651:54;;-1:-1:-1;;21651:54:0;-1:-1:-1;;;;;21693:12:0;;;21668:37;;21651:54;;;;;21721:67;;;;;;;;;;;;;;;;;;;;;;;;;;;21136:660;;;:::o;3472:171::-;3595:18;;;;;;;;;;;;;;;;;3530:6;;3560:7;;;;-1:-1:-1;;;;;3586:7:0;;;;;;;;3578:36;;;;-1:-1:-1;;;;;3578:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3578:36:0;-1:-1:-1;3634:1:0;3472:171;-1:-1:-1;;;3472:171:0:o;1425:252::-;1485:4;-1:-1:-1;;;;;1506:21:0;;1502:66;;-1:-1:-1;1551:5:0;1544:12;;1502:66;-1:-1:-1;1622:20:0;1661:8;;;1425:252::o;5365:108::-;5414:6;5440:25;:14;:12;:14::i;:::-;:23;:25::i;4732:112::-;4783:6;4809:27;:16;:14;:16::i;63875:210::-;63964:14;63991:10;64004:44;64020:7;64029:18;64004:15;:44::i;:::-;63991:57;;64066:7;64074:2;64066:11;;;;;;;;;;;;;;;;;;64059:18;;;63875:210;;;;:::o;89180:99::-;89245:26;89263:7;89245:17;:26::i;37851:101::-;37746:5;37928:16;;;;;37851:101;;;:::o;37960:130::-;37830:4;-1:-1:-1;38051:31:0;;37960:130::o;60339:1726::-;60450:14;60479:22;;:::i;:::-;60516;60553:28;;:::i;:::-;60596:21;;:::i;:::-;60632:40;;:::i;:::-;60687:30;;:::i;:::-;60745:21;60769:42;60783:7;60792:18;60769:13;:42::i;:::-;60745:66;;60824:29;60856:6;:11;;60824:43;;60889:10;:16;;;;;;;;;;-1:-1:-1;;;;;60889:16:0;60878:27;;60916:71;;;;;;;;60924:10;:19;;;60916:71;;;;60945:10;:19;;;60916:71;;;;60966:10;:20;;;60916:71;;;;;61000:37;61040:6;:15;;61000:55;;61085:14;:31;;;;;;;;;;;;61066:50;;61127:446;;;;;;;;61156:14;:28;;;;;;;;;;-1:-1:-1;;;;;61156:28:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61199:14;:26;;;;;;;;;;-1:-1:-1;;;;;61199:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61240:14;:26;;;;;;;;;;-1:-1:-1;;;;;61240:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61281:14;:26;;;;;;;;;;-1:-1:-1;;;;;61281:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61322:14;:33;;;;;;;;;;-1:-1:-1;;;;;61322:33:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61370:14;:37;;;;;;;;;;-1:-1:-1;;;;;61370:37:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61422:14;:31;;;;;;;;;;-1:-1:-1;;;;;61422:31:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61475:14;:37;;;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61528:14;:34;;;;;;;;;;-1:-1:-1;;;;;61528:34:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;;61584:66;;;;;;;;61592:14;:25;;;;;;;;;;;;61584:66;;;;;;;;61619:10;:30;;;;;;;;;;;;61584:66;;;;;;;;;61661:110;;;;;;;;61687:14;:37;;;61661:110;;;;61726:14;:44;;;61661:110;;;;;61784:33;61820:6;:13;;61784:49;;61844:213;;;;;;;;61874:12;:29;;;61844:213;;;;61918:12;:33;;;61844:213;;;;61966:12;:33;;;61844:213;;;;62014:12;:32;;;61844:213;;;;;60339:1726;;;;;;;;;;;;;;:::o;5021:146::-;5095:15;5021:146;:::o;663:159::-;759:27;;;;;;;;;;;;;;;;;715:6;;-1:-1:-1;;;;;742:15:0;;;734:53;;;;-1:-1:-1;;;;;734:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4424:96:0;4500:12;4424:96;:::o;64433:771::-;64524:7;64677:18;-1:-1:-1;;;;;64666:29:0;:7;-1:-1:-1;;;;;64666:29:0;;64662:92;;-1:-1:-1;;;;;;64719:23:0;;;;;;:14;:23;;;;;;64712:30;;64662:92;64918:18;;-1:-1:-1;;;;;64918:18:0;;;;64951:32;;;;64947:109;;-1:-1:-1;;;;;65007:37:0;;;;;:14;:37;;;;;;;-1:-1:-1;65000:44:0;;64947:109;-1:-1:-1;;;;;;;65162:34:0;;;;;:14;:34;;;;;;;64433:771;-1:-1:-1;64433:771:0:o;49685:394::-;-1:-1:-1;;;;;49871:23:0;;49845;49871;;;:14;:23;;;;;;49909:20;49905:167;;49946:24;49973:14;49946:24;49988:14;-1:-1:-1;;;;;49988:11:0;;50000:1;49988:14;:11;:14;:::i;:::-;-1:-1:-1;;;;;49973:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;49973:30:0;;;;50018:23;;;;;:14;:23;;;;;:42;-1:-1:-1;49685:394:0;;:::o;3223:173::-;3281:6;3314:2;-1:-1:-1;;;;;3308:8:0;:2;-1:-1:-1;;;;;3308:8:0;;;3318:19;;;;;;;;;;;;;;;;;3300:38;;;;;-1:-1:-1;;;;;3300:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3300:38:0;-1:-1:-1;;3360:7:0;;;3223:173::o;102732:7061::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://5de7c756ad5207a87b0e7d02e1d0a41da5f123dde29e7a913f18c942b6a25b2f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.