ETH Price: $2,238.74 (-6.41%)

Contract

0xDa2Bb83d549A26e4a71c0E621915878ecefb56c9
 

Overview

ETH Balance

0.035550000000000006 ETH

Eth Value

$79.59 (@ $2,238.74/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Token95789152020-02-29 13:29:461651 days ago1582982986IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000153923
Withdraw Token95618412020-02-26 22:23:401654 days ago1582755820IN
0xDa2Bb83d...ecefb56c9
0 ETH0.0004291310
Withdraw Token95617902020-02-26 22:11:211654 days ago1582755081IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000214565
Withdraw Token95617832020-02-26 22:10:221654 days ago1582755022IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000042911
Withdraw To Sell...95617192020-02-26 21:58:411654 days ago1582754321IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000253281.2
Withdraw Token95617172020-02-26 21:58:321654 days ago1582754312IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000042911
Withdraw To Sell...92570302020-01-11 2:59:511701 days ago1578711591IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000149131
Withdraw To Sell...92570262020-01-11 2:59:081701 days ago1578711548IN
0xDa2Bb83d...ecefb56c9
0 ETH0.00010091
Withdraw To Sell...92570212020-01-11 2:57:501701 days ago1578711470IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000274181
Withdraw Token91671732019-12-26 19:22:151716 days ago1577388135IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000071431.1
Withdraw Token91650222019-12-26 9:06:191716 days ago1577351179IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000307816
Withdraw To Sell...91634132019-12-26 1:12:191717 days ago1577322739IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000051431
Withdraw To Sell...91629802019-12-25 23:07:461717 days ago1577315266IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000511055
Withdraw To Sell...91629802019-12-25 23:07:461717 days ago1577315266IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000257175
Withdraw Token91629802019-12-25 23:07:461717 days ago1577315266IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000256545
Withdraw Token91617082019-12-25 17:13:501717 days ago1577294030IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000112872.2
Withdraw Token91615832019-12-25 16:33:511717 days ago1577291631IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000245615
Withdraw Token91610682019-12-25 14:14:261717 days ago1577283266IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000393225
Withdraw Token91610662019-12-25 14:13:231717 days ago1577283203IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000717345
Withdraw Token91610622019-12-25 14:12:191717 days ago1577283139IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000487855
Withdraw Token91606772019-12-25 12:19:251717 days ago1577276365IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000153923
Withdraw Token91597942019-12-25 8:09:201717 days ago1577261360IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000519646.5
Record Block Has...91597802019-12-25 8:03:181717 days ago1577260998IN
0xDa2Bb83d...ecefb56c9
0 ETH0.000656919
Buy91439292019-12-22 4:09:291720 days ago1576987769IN
0xDa2Bb83d...ecefb56c9
0.07 ETH0.000584335
Create Sale91343452019-12-20 6:27:011722 days ago1576823221IN
0xDa2Bb83d...ecefb56c9
0 ETH0.003999345
View all transactions

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
95617192020-02-26 21:58:411654 days ago1582754321
0xDa2Bb83d...ecefb56c9
0.095 ETH
92570302020-01-11 2:59:511701 days ago1578711591
0xDa2Bb83d...ecefb56c9
0.019 ETH
92570262020-01-11 2:59:081701 days ago1578711548
0xDa2Bb83d...ecefb56c9
0.0855 ETH
91634132019-12-26 1:12:191717 days ago1577322739
0xDa2Bb83d...ecefb56c9
0.399 ETH
91629802019-12-25 23:07:461717 days ago1577315266
0xDa2Bb83d...ecefb56c9
0.076 ETH
91629802019-12-25 23:07:461717 days ago1577315266
0xDa2Bb83d...ecefb56c9
0.00095 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MysteryBoxSales

Compiler Version
v0.5.9+commit.e560f70d

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, None license
File 1 of 3 : MysteryBoxSales.sol
pragma solidity 0.5.9;

import "./Interfaces/ERC721.sol";
import "./AverageBlockTime.sol";

contract MysteryBoxSales is ERC721 {

    uint256 lastSaleId;
    struct Sale {
        ERC721[] nftContracts;
        uint256[] tokenIds;
        address payable seller;
        uint96 revealTime;
        address priceToken;
        uint128 price;
        uint128 fee;
        address[] participants;
        address payable revealer;
        string metadata;
    }

    mapping (uint256 => Sale) private sales;

    // revealTime => revealer => whether revealer was able to reveal in time
    mapping (uint256 => mapping(address => bool)) canGetReward;

    // revealTime => revealer => priceToken => fee to collect
    mapping (uint256 => mapping(address => mapping(address => uint256))) blockHashReward;

    AverageBlockTime averageBlockTimeOracle;

    constructor(AverageBlockTime _averageBlockTimeOracle) public {
        averageBlockTimeOracle = _averageBlockTimeOracle;
    }

    event MysteryBoxSaleCreated(
        uint256 saleId,
        string name,
        address indexed seller,
        uint96 revealTime,
        address priceToken,
        uint128 price,
        uint256[] tokenIds,
        ERC721[] tokenContracts,
        address indexed revealer,
        uint128 fee,
        string metadataURI
    );
    event BlockHash(uint256 indexed revealTime, bytes32 hash); // TODO separate contrat
    event MysteryBoxSaleWithdrawn(uint256 indexed saleId, address indexed seller);
    event MysteryBoxSaleProceedsWithdrawn(uint256 indexed saleId, address indexed seller, uint256 pay);

    event MysteryBoxBought(uint256 indexed saleId, uint256 participantIndex, address indexed buyer);
    event MysteryBoxWithdrawn(uint256 indexed saleId, uint256 participantIndex, address indexed buyer);

    function createSale(
        string calldata _name,
        ERC721[] calldata _nftContracts,
        uint256[] calldata _tokenIds,
        uint96 _revealTime,
        address payable _priceToken,
        uint128 _price,
        address payable _revealer,
        uint128 _fee,
        string calldata _metadata
    )
    external {
        require(_nftContracts.length == _tokenIds.length, "tokenIds length != nftContracts length");
        require(_fee <= _price, "fee too high");
        // solium-disable-next-line security/no-block-members
        require(_revealTime > block.timestamp, "revealTime in the past");

        _escrow(msg.sender, _nftContracts, _tokenIds, _tokenIds.length);
        address payable[3] memory addrs;
        addrs[0] = msg.sender;
        addrs[1] = _priceToken;
        addrs[2] = _revealer;
        _createSale(_name, _nftContracts, _tokenIds, addrs, [_revealTime, _price, _fee], _metadata);
    }

    function _createSale(
        string memory _name,
        ERC721[] memory _nftContracts,
        uint256[] memory _tokenIds,
        address payable[3] memory _addresses, // seller, priceToken, revealer
        uint128[3] memory _values, // _revealTime, price, fee
        string memory _metadata
    ) internal {
        uint256 saleId = ++lastSaleId;
        sales[saleId] = Sale(
            _nftContracts,
            _tokenIds,
            _addresses[0],
            uint96(_values[0]),
            _addresses[1],
            uint128(_values[1]),
            uint128(_values[2]),
            new address[](0),
            _addresses[2],
            _metadata
        );
        emit MysteryBoxSaleCreated(
            saleId,
            _name,
            _addresses[0],
            uint96(_values[0]),
            _addresses[1],
            uint128(_values[1]),
            _tokenIds,
            _nftContracts,
            _addresses[2],
            uint128(_values[2]),
            _metadata
        );
    }


    function buy(uint256 _saleId) public payable {
        gift(msg.sender, _saleId);
    }

    function numBoxesLeftToBuy(uint256 _saleId) external view returns(uint256) {
        // solium-disable-next-line security/no-block-members
        if(block.timestamp < sales[_saleId].revealTime) {
            return sales[_saleId].tokenIds.length - sales[_saleId].participants.length;
        } else {
            return 0;
        }
    }

    function gift(address recipient, uint256 _saleId) public payable { // TODO support erc20 native meta transaction ?
        Sale storage sale = sales[_saleId];
        address priceToken = sale.priceToken;
        uint256 numTokens = sale.tokenIds.length;
        uint256 numParticipants = sale.participants.length;
        uint256 revealTime = sale.revealTime;
        // solium-disable-next-line security/no-block-members
        require(block.timestamp < revealTime, "not on sale");
        require(numParticipants < numTokens, "all mystery boxes has been purchased");

        sale.participants.push(recipient);
        // shuffling as we go by swapping tokenIds + corresponding nftContracts
        if(numTokens > 2) {
            bytes32 lastBlockHash = blockhash(block.number-1);
            uint256 swap1 = uint256(keccak256(abi.encodePacked(lastBlockHash, uint8(1)))) % numTokens;
            uint256 swap2 = uint256(keccak256(abi.encodePacked(lastBlockHash, uint8(2)))) % numTokens;
            if(swap1 == swap2) {
                swap1 = (swap2 + 1) % numTokens;
            }
            uint256 t1 = sale.tokenIds[swap1];
            sale.tokenIds[swap1] = sale.tokenIds[swap2];
            sale.tokenIds[swap2] = t1;
            ERC721 c1 = sale.nftContracts[swap1];
            ERC721 c2 = sale.nftContracts[swap2];
            if(c1 != c2) {
                sale.nftContracts[swap1] = c2;
                sale.nftContracts[swap2] = c1;
            }
        }

        {
            uint256 price = sale.price;
            // record fee to be rewarded to revealer once blockHash is saved
            blockHashReward[revealTime][sale.revealer][priceToken] += sale.fee;

            if(priceToken == address(0)) {
                require(msg.value == price, "msg.value != price");
            } else {
                require(transferTokenFrom(priceToken, msg.sender, address(this), price), "failed to transfer price");
            }
        }

        emit MysteryBoxBought(_saleId, numParticipants, recipient); // TODO remove and use ERC721 Transfer event below

        // ERC721
        numBoxes[recipient] ++;
        emit Transfer(address(0), recipient, _saleId * 2**128 + numParticipants); // MINT
    }

    mapping(uint256 => bytes32) blockHashes;

    function getBlockHash(uint256 time) external returns(bytes32) {
        return blockHashes[time]; // TODO rename blockHashes to blockHashesAtTime
    }

    function getRevealerReward(uint256 revealTime, address revealer, address priceToken) external returns(uint256) {
        return blockHashReward[revealTime][revealer][priceToken];
    }

    function withdrawRevealerReward(uint256 revealTime, address priceToken) external {
        require(canGetReward[revealTime][msg.sender], "did not reveal in time");
        uint256 reward = blockHashReward[revealTime][msg.sender][priceToken];
        require(reward > 0, "not reward to collect");
        blockHashReward[revealTime][msg.sender][priceToken] = 0;
        canGetReward[revealTime][msg.sender] = false;
        if (priceToken == address(0)) {
            msg.sender.transfer(reward);
        } else {
            require(transferToken(priceToken, msg.sender, reward), "failed to transfer fee to revealer");
        }
        // TODO event ?
    }

    function recordBlockHash(uint256 revealTime) external{
        _recordBlockHash(revealTime, msg.sender);
    }

    function _recordBlockHash(uint256 revealTime, address revealer) internal returns(bytes32) {
        // solium-disable-next-line security/no-block-members
        require(revealTime < block.timestamp, "cannot record a future or present reveal");
        // solium-disable-next-line security/no-block-members
        uint256 delay = block.timestamp - revealTime;
        uint256 averageBlockTimeInMicroSeconds = averageBlockTimeOracle.getAverageBlockTimeInMicroSeconds();
        uint256 blockDelay = ((delay * 1000) / averageBlockTimeInMicroSeconds );
        require(blockDelay > 0, "cannot get current blockHash, retry later");
        uint256 blockNumber = block.number - blockDelay;
        bytes32 blockHash = blockHashes[revealTime];

        // blockHash > 0 allows revealer to get the reward later of someone alreayd revealed
        if (revealer != address(0) && (blockHash > 0 || blockDelay < 256) && !canGetReward[revealTime][revealer]) {
            canGetReward[revealTime][revealer] = true;
        }

        if (blockHash > 0) {
            return blockHash; // already recorded
        }

        if(blockDelay < 256) {
            blockHash = blockhash(blockNumber);
        } else {
            blockHash = blockhash(block.number - (((blockDelay - 1) % 255) + 1));
        }
        blockHashes[revealTime] = blockHash;
        emit BlockHash(revealTime, blockHash);
        return blockHash;
    }

    function withdrawToSeller(uint256 _saleId) external {
        withdrawToSellerRange(_saleId, 0, 2**256-1);
    }

    // solium-disable-next-line security/no-assign-params
    function withdrawToSellerRange(uint256 _saleId, uint256 start, uint256 end) public {
        Sale storage sale = sales[_saleId];
        bytes32 blockHash = blockHashes[sale.revealTime];
        address payable seller = sale.seller;
        require(blockHash != 0, "sale has not been revealed");
        require(seller != address(0), "sale already withdrawn");

        uint256 numParticipants = sale.participants.length;
        uint256 price = sale.price;
        if(price > 0 && numParticipants > 0) {
            uint256 pay = numParticipants * (price - sale.fee);
            address priceToken = sale.priceToken;
            if(address(priceToken) == address(0)) {
                seller.transfer(pay);
            } else {
                require(transferToken(priceToken, seller, pay), "cannot transfer pay to seller");
            }
            sale.price = 0;
            emit MysteryBoxSaleProceedsWithdrawn(_saleId, seller, pay);
        }

        uint256 numTokens = sale.tokenIds.length;
        uint256 firstTokenIndex = getTokenIndexReceived(blockHash, _saleId, numParticipants);
        if(end > numTokens - numParticipants) {
            end = numTokens - numParticipants;
        }
        for(uint256 i = start; i < end; i++) {
            uint256 tokenIndex = (firstTokenIndex + i) % numTokens;
            sale.nftContracts[tokenIndex].transferFrom(address(this), seller, sale.tokenIds[tokenIndex]);
            sale.nftContracts[tokenIndex] = ERC721(0);
            sale.tokenIds[tokenIndex] = 0;
        }

        if(end == numTokens - numParticipants) {
            emit MysteryBoxSaleWithdrawn(_saleId, seller);
            sale.seller = address(0);
        }
    }

    function _splitID(uint256 _tokenId) internal pure returns(uint256 saleId, uint256 participantIndex) {
        saleId = _tokenId / 2**128;
        participantIndex = uint128(_tokenId);
    }

    // ERC721 BOX STANDARD ? ////////////////////////////////////////////////
    function open(uint256 _tokenId) external {
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        withdrawToken(saleId, participantIndex);
    }

    function peek(uint256 _tokenId) external view returns(ERC721 nftContract, uint256 tokenId) {
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        bytes32 blockHash = blockHashes[sales[saleId].revealTime];
        if(blockHash == 0) {
            return (ERC721(0),0);
        }
        return getTokenReceived(saleId, participantIndex);
    }
    //////////////////////////////////////////////////////////////////////////

    function withdrawTokensInBatch(uint256 _saleId, uint256[] calldata _participantIndices) external {
        bytes32 blockHash;
        {
            uint256 revealTime = sales[_saleId].revealTime;
            blockHash = blockHashes[revealTime];
            if( blockHash == 0) {
                blockHash = _recordBlockHash(revealTime, address(0)); // if no blockHash make it yourself but do not record reward
            }
        }

        uint256 numParticipants = sales[_saleId].participants.length;
        uint256 numIndices = _participantIndices.length;
        for(uint256 i = 0; i < numIndices; i++) {
            uint256 _participantIndex = _participantIndices[i];
            require(_participantIndex < numParticipants, "particpantIndex too big");
            address participant = sales[_saleId].participants[_participantIndex];
            require(participant == msg.sender, "participants not matching");
            sales[_saleId].participants[_participantIndex] = address(0);
            {
                uint256 tokenIndex = getTokenIndexReceived(blockHash, _saleId, _participantIndex);
                sales[_saleId].nftContracts[tokenIndex].transferFrom(address(this), participant, sales[_saleId].tokenIds[tokenIndex]);
                sales[_saleId].nftContracts[tokenIndex] = ERC721(0);
                sales[_saleId].tokenIds[tokenIndex] = 0;
                emit MysteryBoxWithdrawn(_saleId, _participantIndex, participant); // TODO remove and use ERC721 Transfer event below ?
            }

            // ERC721
            emit Transfer(participant, address(0), _saleId * 2**128 + _participantIndex); // BURN // no need to reset operator
        }
        // ERC721
        numBoxes[msg.sender] -= numIndices;
    }

    function withdrawToken(uint256 _saleId, uint256 _participantIndex) public {
        uint256 revealTime = sales[_saleId].revealTime;
        bytes32 blockHash = blockHashes[revealTime];
        if( blockHash == 0) {
            blockHash = _recordBlockHash(revealTime, address(0)); // if no blockHash make it yourself but do not record reward
        }
        require(_participantIndex < sales[_saleId].participants.length, "particpantIndex too big");
        address participant = sales[_saleId].participants[_participantIndex];
        require(participant == msg.sender, "only participant can withdrawn");
        sales[_saleId].participants[_participantIndex] = address(0);
        uint256 tokenIndex = getTokenIndexReceived(blockHash, _saleId, _participantIndex);
        sales[_saleId].nftContracts[tokenIndex].transferFrom(address(this), participant, sales[_saleId].tokenIds[tokenIndex]);
        sales[_saleId].nftContracts[tokenIndex] = ERC721(0);
        sales[_saleId].tokenIds[tokenIndex] = 0;
        emit MysteryBoxWithdrawn(_saleId, _participantIndex, participant); // TODO remove and use ERC721 Transfer event below ?

        // ERC721
        numBoxes[participant] --;
        emit Transfer(participant, address(0), _saleId * 2**128 + _participantIndex); // BURN
    }

    function getTokenIndexReceived(bytes32 blockHash, uint256 _saleId, uint256 _participantIndex) internal view returns(uint256 tokenIndex) {
        return (uint256(keccak256(abi.encodePacked(blockHash, _saleId))) + _participantIndex) % sales[_saleId].tokenIds.length;
    }

    function getTokenReceived(uint256 _saleId, uint256 _participantIndex) internal view returns(ERC721 nftContract, uint256 tokenId) {
        uint256 index = getTokenIndexReceived(blockHashes[sales[_saleId].revealTime], _saleId, _participantIndex);
        return (sales[_saleId].nftContracts[index], sales[_saleId].tokenIds[index]);
    }

     function isReadyForReveal(
        uint256 _saleId
    )
        external
        view
        returns
    (bool) {
        bytes32 blockHash = blockHashes[sales[_saleId].revealTime];
        // solium-disable-next-line security/no-block-members
        return sales[_saleId].revealTime > 0 && blockHash == 0 && block.timestamp > sales[_saleId].revealTime;
    }

    function exists(uint256 _saleId) external view returns (bool) {
        return sales[_saleId].revealTime > 0;
    }

    function getRevealedToken(
        uint256 _saleId,
        uint256 _participantIndex
    ) external view returns (ERC721 nftContract, uint256 tokenId){
        bytes32 blockHash = blockHashes[sales[_saleId].revealTime];
        if(blockHash == 0) {
            return (ERC721(0),0);
        }
        return getTokenReceived(_saleId, _participantIndex);
    }

    function _escrow(
        address _seller,
        ERC721[] memory _nftContracts,
        uint256[] memory _tokenIds,
        uint256 _numToEscrow
    ) internal {
        for(uint256 i = 0; i < _numToEscrow; i++){
            address ownerOfToken = _nftContracts[i].ownerOf(_tokenIds[i]);
            require(ownerOfToken == _seller, "only the owner can be seller");
            _nftContracts[i].transferFrom(ownerOfToken, address(this), _tokenIds[i]);
        }
    }

    /// ERC721 ///////////////
    mapping(uint256 => address) operators;
    mapping(address => mapping(address => bool)) operatorsForAll;
    mapping(address => uint256) numBoxes;

    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0), "token does not exist");
        return numBoxes[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address){
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        address[] storage participants = sales[saleId].participants;
        address owner = participants[participantIndex];
        require(owner != address(0), "token does not exist");
        return owner;
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external {
        _transferFrom(_from, _to, _tokenId);
        require(_checkERC721Receiver(_from, _to, _tokenId, data), "erc721 transfer rejected");
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        _transferFrom(_from, _to, _tokenId);
        require(_checkERC721Receiver(_from, _to, _tokenId, ""), "erc721 transfer rejected");
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) external {
        _transferFrom(_from, _to, _tokenId);
    }

    function _transferFrom(address _from, address _to, uint256 _tokenId) internal {
        require(_to != address(0), "token does not exist");
        require(_from != address(0), "from is zero address");
        address operator = operators[_tokenId];
        require(msg.sender == _from || operatorsForAll[_from][_to] || msg.sender == operator, "not approved");
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        require(sales[saleId].participants[participantIndex] == _from, "current owner != _from");
        sales[saleId].participants[participantIndex] = _to;
        if (operator != address(0)) {
            operators[_tokenId] = address(0);
        }
        numBoxes[_from] --;
        numBoxes[_to] ++;
        emit Transfer(_from, _to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) external {
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        require(sales[saleId].participants[participantIndex] == msg.sender, "current owner != msg.sender");
        operators[_tokenId] = _approved;
        emit Approval(msg.sender, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) external{
        require(_operator != address(0), "operator is zero address");
        operatorsForAll[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function getApproved(uint256 _tokenId) external view returns (address){
        ownerOf(_tokenId);
        return operators[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) external view returns (bool){
        require(_owner != address(0), "token does not exist");
        require(_operator != address(0), "operator is zero address");
        return operatorsForAll[_owner][_operator];
    }

    bytes4 constant ERC721_RECEIVED = 0x150b7a02;
    function _checkERC721Receiver(address _from, address _to, uint256 _id, bytes memory _data) internal returns (bool) {
        if (!isContract(_to)) {
            return true;
        }
        return (ERC721TokenReceiver(_to).onERC721Received(_from, _from, _id, _data) == ERC721_RECEIVED);
    }

    /// ERC721 Metadata
    function name() external view returns (string memory _name) {
        return "Mystery Market";
    }

    function symbol() external view returns (string memory _symbol) {
        return "MYSTERY";
    }

    function toHexString(uint256 x) internal pure returns (string memory) {
        uint256 numZeroes = numZeroesFor(x);
        bytes memory s = new bytes(64 - numZeroes);
        uint256 start = numZeroes / 2;
        for (uint i = start; i < 32; i++) {
            byte b = byte(uint8(uint(x) / (2**(8*(31 - i)))));
            byte hi = byte(uint8(b) / 16);
            byte lo = byte(uint8(b) - 16 * uint8(hi));

            uint256 index = 2*(i-start);
            s[index] = char(hi);
            s[index+1] = char(lo);
        }
        return string(s);
    }

    function numZeroesFor(uint256 x) internal pure returns (uint256) {
        uint256 numZeroes = 0;
        for (uint256 i = 0; i < 32; i++) {
            byte b = byte(uint8(uint(x) / (2**(8*(31 - i)))));
            if (b != 0) {
                break;
            }
            numZeroes += 2;
        }
        return numZeroes;
    }

    function char(byte b) internal pure returns (byte c) {
        if (uint8(b) < 10) return byte(uint8(b) + 0x30);
        else return byte(uint8(b) + 0x57);
    }

    function tokenURI(uint256 _tokenId) external view returns (string memory) {
        ownerOf(_tokenId);
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        string memory metadataURI = sales[saleId].metadata;
        bytes memory bs = bytes(metadataURI);
        if (bs.length > 7 &&
            bs[0] == 'h' &&
            bs[1] == 't' &&
            bs[2] == 't' &&
            bs[3] == 'p'
        ) {
            return
            string(
                abi.encodePacked(
                    metadataURI,
                    "/metadata_0x",toHexString(_tokenId),
                    ".json"
                )
            );
        } else {
            return metadataURI;
        }
    }

    function peekTokenURI(uint256 _tokenId) external view returns (string memory) {
        ownerOf(_tokenId);
        (uint256 saleId, uint256 participantIndex) = _splitID(_tokenId);
        bytes32 blockHash = blockHashes[sales[saleId].revealTime];
        if(blockHash != 0) {
            (ERC721 nftContract, uint256 tokenId) = getTokenReceived(saleId, participantIndex);
            return nftContract.tokenURI(tokenId);
        }
        return sales[saleId].metadata;
    }

    /// ERC165
    function supportsInterface(bytes4 interfaceID) external view returns (bool){
        return interfaceID == 0x01ffc9a7 || interfaceID == 0x80ac58cd || interfaceID == 0x5b5e139f;
    }

    /// UTILS
    function isContract(address addr) internal view returns (bool) {
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        bytes32 codehash;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            codehash := extcodehash(addr)
        }
        return (codehash != 0x0 && codehash != accountHash);
    }

    function transferToken (
        address token,
        address receiver,
        uint256 amount
    )
        internal
        returns (bool transferred)
    {
        bytes memory data = abi.encodeWithSignature("transfer(address,uint256)", receiver, amount);
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let success := call(sub(gas, 10000), token, 0, add(data, 0x20), mload(data), 0, 0)
            let ptr := mload(0x40)
            returndatacopy(ptr, 0, returndatasize)
            switch returndatasize
            case 0 { transferred := success }
            case 0x20 { transferred := iszero(or(iszero(success), iszero(mload(ptr)))) }
            default { transferred := 0 }
        }
    }

    function transferTokenFrom (
        address token,
        address from,
        address receiver,
        uint256 amount
    )
        internal
        returns (bool transferred)
    {
        bytes memory data = abi.encodeWithSignature("transferFrom(address,address,uint256)", from, receiver, amount);
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let success := call(sub(gas, 10000), token, 0, add(data, 0x20), mload(data), 0, 0)
            let ptr := mload(0x40)
            returndatacopy(ptr, 0, returndatasize)
            switch returndatasize
            case 0 { transferred := success }
            case 0x20 { transferred := iszero(or(iszero(success), iszero(mload(ptr)))) }
            default { transferred := 0 }
        }
    }

}

File 2 of 3 : AverageBlockTime.sol
pragma solidity 0.5.9;

contract AverageBlockTime {
    struct Snapshot {
        uint128 timestamp;
        uint128 blockNumber;
    }
    Snapshot snapshot0;
    Snapshot snapshot1;
    uint256 minUpdateDelay;

    constructor(uint256 _minUpdateDelay, uint128 _snapshotTimestamp, uint128 _snapshotBlockNumber) public {
        require(block.timestamp - _snapshotTimestamp >= _minUpdateDelay, "require an older snapshot");
        require(_snapshotBlockNumber < block.number, "can't use a future snapshot");
        minUpdateDelay = _minUpdateDelay;
        snapshot0.timestamp = _snapshotTimestamp;
        snapshot0.blockNumber = _snapshotBlockNumber;
    }

    function update() external {
        Snapshot memory _snapshot0 = snapshot0;
        Snapshot memory _snapshot1 = snapshot1;
        if(_snapshot0.timestamp > _snapshot1.timestamp) {
            if(block.timestamp - _snapshot1.timestamp >= minUpdateDelay) {
                snapshot1.timestamp = uint128(block.timestamp);
                snapshot1.blockNumber = uint128(block.number);
            }
        } else {
            if(block.timestamp - _snapshot0.timestamp >= minUpdateDelay) {
                snapshot0.timestamp = uint128(block.timestamp);
                snapshot0.blockNumber = uint128(block.number);
            }
        }
    }

    function getAverageBlockTimeInMicroSeconds() external view returns (uint256) {
        Snapshot storage snapshot = snapshot0;
        if(snapshot.timestamp > snapshot1.timestamp) {
            if(block.timestamp - snapshot.timestamp < minUpdateDelay) {
                snapshot = snapshot1;
            }
        } else {
            if(block.timestamp - snapshot1.timestamp >= minUpdateDelay) {
                snapshot = snapshot1;
            }
        }
        return ((block.timestamp - snapshot.timestamp) * 1000) / (block.number - snapshot.blockNumber);
    }
}

File 3 of 3 : ERC721.sol
pragma solidity ^0.5.0;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd
interface ERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Set or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    /// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets.
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);

    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the
    /// recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
    /// of other than the magic value MUST result in the transaction being reverted.
    /// @notice The contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    /// unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

Settings
{
  "evmVersion": "petersburg",
  "libraries": {},
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_saleId","type":"uint256"},{"name":"_participantIndex","type":"uint256"}],"name":"getRevealedToken","outputs":[{"name":"nftContract","type":"address"},{"name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_nftContracts","type":"address[]"},{"name":"_tokenIds","type":"uint256[]"},{"name":"_revealTime","type":"uint96"},{"name":"_priceToken","type":"address"},{"name":"_price","type":"uint128"},{"name":"_revealer","type":"address"},{"name":"_fee","type":"uint128"},{"name":"_metadata","type":"string"}],"name":"createSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_saleId","type":"uint256"}],"name":"numBoxesLeftToBuy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_saleId","type":"uint256"}],"name":"isReadyForReveal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_saleId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_saleId","type":"uint256"},{"name":"start","type":"uint256"},{"name":"end","type":"uint256"}],"name":"withdrawToSellerRange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"peekTokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"revealTime","type":"uint256"},{"name":"priceToken","type":"address"}],"name":"withdrawRevealerReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"open","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"peek","outputs":[{"name":"nftContract","type":"address"},{"name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_saleId","type":"uint256"},{"name":"_participantIndices","type":"uint256[]"}],"name":"withdrawTokensInBatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"revealTime","type":"uint256"}],"name":"recordBlockHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"revealTime","type":"uint256"},{"name":"revealer","type":"address"},{"name":"priceToken","type":"address"}],"name":"getRevealerReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"_saleId","type":"uint256"}],"name":"gift","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_saleId","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"time","type":"uint256"}],"name":"getBlockHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_saleId","type":"uint256"}],"name":"withdrawToSeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_saleId","type":"uint256"},{"name":"_participantIndex","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_averageBlockTimeOracle","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"saleId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"revealTime","type":"uint96"},{"indexed":false,"name":"priceToken","type":"address"},{"indexed":false,"name":"price","type":"uint128"},{"indexed":false,"name":"tokenIds","type":"uint256[]"},{"indexed":false,"name":"tokenContracts","type":"address[]"},{"indexed":true,"name":"revealer","type":"address"},{"indexed":false,"name":"fee","type":"uint128"},{"indexed":false,"name":"metadataURI","type":"string"}],"name":"MysteryBoxSaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"revealTime","type":"uint256"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"BlockHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"saleId","type":"uint256"},{"indexed":true,"name":"seller","type":"address"}],"name":"MysteryBoxSaleWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"saleId","type":"uint256"},{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"pay","type":"uint256"}],"name":"MysteryBoxSaleProceedsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"saleId","type":"uint256"},{"indexed":false,"name":"participantIndex","type":"uint256"},{"indexed":true,"name":"buyer","type":"address"}],"name":"MysteryBoxBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"saleId","type":"uint256"},{"indexed":false,"name":"participantIndex","type":"uint256"},{"indexed":true,"name":"buyer","type":"address"}],"name":"MysteryBoxWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

608060405234801561001057600080fd5b50604051613d80380380613d808339818101604052602081101561003357600080fd5b5051600480546001600160a01b0319166001600160a01b03909216919091179055613d1d806100636000396000f3fe6080604052600436106101d85760003560e01c8063690e7c0911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146109da578063ee82ac5e14610a15578063f7315b8914610a3f578063fdb483c714610a69576101d8565b8063b88d4fde146108cc578063c87b56dd14610967578063cbce4c9714610991578063d96a094a146109bd576101d8565b806389e33fd4116100d157806389e33fd41461081157806393dec1231461083b57806395d89b411461087c578063a22cb46514610891576101d8565b8063690e7c091461070857806370a08231146107325780637861d269146107655780637c05ecb21461078f576101d8565b806342842e0e1161017a5780634f972eaf116101495780634f972eaf146106455780635443fed01461067b5780636352211e146106a5578063672326b8146106cf576101d8565b806342842e0e1461057257806345c5903d146105b5578063496e332b146105f15780634f558e791461061b576101d8565b8063095ea7b3116101b6578063095ea7b3146102f557806323b872dd146103305780632fc6c854146103735780633b10acdf146103c6576101d8565b806301ffc9a7146101dd57806306fdde0314610225578063081812fc146102af575b600080fd5b3480156101e957600080fd5b506102116004803603602081101561020057600080fd5b50356001600160e01b031916610a99565b604080519115158252519081900360200190f35b34801561023157600080fd5b5061023a610aed565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027457818101518382015260200161025c565b50505050905090810190601f1680156102a15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102bb57600080fd5b506102d9600480360360208110156102d257600080fd5b5035610b16565b604080516001600160a01b039092168252519081900360200190f35b34801561030157600080fd5b5061032e6004803603604081101561031857600080fd5b506001600160a01b038135169060200135610b3e565b005b34801561033c57600080fd5b5061032e6004803603606081101561035357600080fd5b506001600160a01b03813581169160208101359091169060400135610c31565b34801561037f57600080fd5b506103a36004803603604081101561039657600080fd5b5080359060200135610c41565b604080516001600160a01b03909316835260208301919091528051918290030190f35b3480156103d257600080fd5b5061032e60048036036101208110156103ea57600080fd5b810190602081018135600160201b81111561040457600080fd5b82018360208201111561041657600080fd5b803590602001918460018302840111600160201b8311171561043757600080fd5b919390929091602081019035600160201b81111561045457600080fd5b82018360208201111561046657600080fd5b803590602001918460208302840111600160201b8311171561048757600080fd5b919390929091602081019035600160201b8111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460208302840111600160201b831117156104d757600080fd5b919390926001600160601b03833516926001600160a01b0360208201358116936001600160801b0360408401358116946060850135909316936080810135909116929060c081019060a00135600160201b81111561053457600080fd5b82018360208201111561054657600080fd5b803590602001918460018302840111600160201b8311171561056757600080fd5b509092509050610c9b565b34801561057e57600080fd5b5061032e6004803603606081101561059557600080fd5b506001600160a01b03813581169160208101359091169060400135610fc7565b3480156105c157600080fd5b506105df600480360360208110156105d857600080fd5b5035611039565b60408051918252519081900360200190f35b3480156105fd57600080fd5b506102116004803603602081101561061457600080fd5b503561108a565b34801561062757600080fd5b506102116004803603602081101561063e57600080fd5b5035611100565b34801561065157600080fd5b5061032e6004803603606081101561066857600080fd5b5080359060208101359060400135611127565b34801561068757600080fd5b5061023a6004803603602081101561069e57600080fd5b503561150c565b3480156106b157600080fd5b506102d9600480360360208110156106c857600080fd5b50356116ea565b3480156106db57600080fd5b5061032e600480360360408110156106f257600080fd5b50803590602001356001600160a01b0316611788565b34801561071457600080fd5b5061032e6004803603602081101561072b57600080fd5b503561192c565b34801561073e57600080fd5b506105df6004803603602081101561075557600080fd5b50356001600160a01b0316611946565b34801561077157600080fd5b506103a36004803603602081101561078857600080fd5b50356119b6565b34801561079b57600080fd5b5061032e600480360360408110156107b257600080fd5b81359190810190604081016020820135600160201b8111156107d357600080fd5b8201836020820111156107e557600080fd5b803590602001918460208302840111600160201b8311171561080657600080fd5b509092509050611a25565b34801561081d57600080fd5b5061032e6004803603602081101561083457600080fd5b5035611dbe565b34801561084757600080fd5b506105df6004803603606081101561085e57600080fd5b508035906001600160a01b0360208201358116916040013516611dcc565b34801561088857600080fd5b5061023a611dfc565b34801561089d57600080fd5b5061032e600480360360408110156108b457600080fd5b506001600160a01b0381351690602001351515611e1d565b3480156108d857600080fd5b5061032e600480360360808110156108ef57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561092957600080fd5b82018360208201111561093b57600080fd5b803590602001918460018302840111600160201b8311171561095c57600080fd5b509092509050611ee1565b34801561097357600080fd5b5061023a6004803603602081101561098a57600080fd5b5035611f81565b61032e600480360360408110156109a757600080fd5b506001600160a01b038135169060200135612202565b61032e600480360360208110156109d357600080fd5b5035612671565b3480156109e657600080fd5b50610211600480360360408110156109fd57600080fd5b506001600160a01b038135811691602001351661267e565b348015610a2157600080fd5b506105df60048036036020811015610a3857600080fd5b5035612759565b348015610a4b57600080fd5b5061032e60048036036020811015610a6257600080fd5b503561276b565b348015610a7557600080fd5b5061032e60048036036040811015610a8c57600080fd5b5080359060200135612779565b60006301ffc9a760e01b6001600160e01b031983161480610aca57506380ac58cd60e01b6001600160e01b03198316145b80610ae55750635b5e139f60e01b6001600160e01b03198316145b90505b919050565b60408051808201909152600e81526d135e5cdd195c9e4813585c9ad95d60921b60208201525b90565b6000610b21826116ea565b50506000908152600660205260409020546001600160a01b031690565b600080610b4a83612adc565b60008281526001602052604090206005018054929450909250339183908110610b6f57fe5b6000918252602090912001546001600160a01b031614610bd6576040805162461bcd60e51b815260206004820152601b60248201527f63757272656e74206f776e657220213d206d73672e73656e6465720000000000604482015290519081900360640190fd5b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388169081179091559051859233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b610c3c838383612af2565b505050565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152812054819080610c84575060009150819050610c94565b610c8e8585612d8d565b92509250505b9250929050565b898814610cd95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c306026913960400191505060405180910390fd5b846001600160801b0316836001600160801b03161115610d2f576040805162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b42876001600160601b031611610d85576040805162461bcd60e51b81526020600482015260166024820152751c995d99585b151a5b59481a5b881d1a19481c185cdd60521b604482015290519081900360640190fd5b610e06338c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e9250612e35915050565b610e0e613a96565b338160006001600160a01b039092166020929092020152868160016001600160a01b0390921660209290920201528481600260200201906001600160a01b031690816001600160a01b031681525050610fb78e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508460405180606001604052808e6001600160601b03166001600160801b031681526020018c6001600160801b03166001600160801b031681526020018a6001600160801b03166001600160801b031681525088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fff92505050565b5050505050505050505050505050565b610fd2838383612af2565b610fed838383604051806020016040528060008152506133f7565b610c3c576040805162461bcd60e51b8152602060048201526018602482015277195c98cdcc8c481d1c985b9cd9995c881c995a9958dd195960421b604482015290519081900360640190fd5b600081815260016020526040812060020154600160a01b90046001600160601b031642101561108257506000818152600160208190526040909120600581015491015403610ae8565b506000610ae8565b600081815260016020818152604080842060020154600160a01b90046001600160601b0316808552600583529084205485855292909152158015906110cd575080155b80156110f95750600083815260016020526040902060020154600160a01b90046001600160601b031642115b9392505050565b600090815260016020526040902060020154600160a01b90046001600160601b0316151590565b600083815260016020908152604080832060028101546001600160601b03600160a01b82041685526005909352922054906001600160a01b0316816111b3576040805162461bcd60e51b815260206004820152601a60248201527f73616c6520686173206e6f74206265656e2072657665616c6564000000000000604482015290519081900360640190fd5b6001600160a01b038116611207576040805162461bcd60e51b815260206004820152601660248201527539b0b6329030b63932b0b23c903bb4ba34323930bbb760511b604482015290519081900360640190fd5b600583015460048401546001600160801b031680158015906112295750600082115b156113495760048501546003860154600160801b9091046001600160801b031682038302906001600160a01b031680611298576040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015611292573d6000803e3d6000fd5b506112f4565b6112a381868461351b565b6112f4576040805162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e736665722070617920746f2073656c6c6572000000604482015290519081900360640190fd5b6004870180546001600160801b03191690556040805183815290516001600160a01b038716918c917f2d5b4c29ee2e7a4bd90c2404819860f4556eea21701f202e5ce6ab1fc3d207569181900360200190a350505b6001850154600061135b868b866135b1565b905083820388111561136d5783820397505b885b888110156114ac576000838284018161138457fe5b06905088600001818154811061139657fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30898c60010185815481106113d357fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b15801561142f57600080fd5b505af1158015611443573d6000803e3d6000fd5b50505050600089600001828154811061145857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600089600101828154811061149757fe5b6000918252602090912001555060010161136f565b50838203881415611500576040516001600160a01b038616908b907f2fb04d9c1956da6d354c2346f539f8ece38328a0ba8b6b7394ee7520a95f876790600090a36002870180546001600160a01b03191690555b50505050505050505050565b6060611517826116ea565b5060008061152484612adc565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152902054919350915080156116465760008061156b8585612d8d565b91509150816001600160a01b031663c87b56dd826040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156115b357600080fd5b505afa1580156115c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115f057600080fd5b810190808051600160201b81111561160757600080fd5b8201602081018481111561161a57600080fd5b8151600160201b81118282018710171561163357600080fd5b50909950610ae898505050505050505050565b60008381526001602081815260409283902060070180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383529192908301828280156116db5780601f106116b0576101008083540402835291602001916116db565b820191906000526020600020905b8154815290600101906020018083116116be57829003601f168201915b50505050509350505050919050565b60008060006116f884612adc565b60008281526001602052604081206005018054939550919350909182908490811061171f57fe5b6000918252602090912001546001600160a01b031690508061177f576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b95945050505050565b600082815260026020908152604080832033845290915290205460ff166117ef576040805162461bcd60e51b8152602060048201526016602482015275646964206e6f742072657665616c20696e2074696d6560501b604482015290519081900360640190fd5b600082815260036020908152604080832033845282528083206001600160a01b038516845290915290205480611864576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081c995dd85c99081d1bc818dbdb1b1958dd605a1b604482015290519081900360640190fd5b6000838152600360209081526040808320338085529083528184206001600160a01b038716808652908452828520859055878552600284528285209185529252909120805460ff191690556118e657604051339082156108fc029083906000818181858888f193505050501580156118e0573d6000803e3d6000fd5b50610c3c565b6118f182338361351b565b610c3c5760405162461bcd60e51b8152600401808060200182810382526022815260200180613c566022913960400191505060405180910390fd5b60008061193883612adc565b91509150610c3c8282612779565b60006001600160a01b03821661199a576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b506001600160a01b031660009081526008602052604090205490565b6000806000806119c585612adc565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152902054919350915080611a0e575060009350839250611a20915050565b611a188383612d8d565b945094505050505b915091565b600083815260016020908152604080832060020154600160a01b90046001600160601b03168084526005909252909120549081611a6a57611a67816000613601565b91505b506000848152600160205260408120600501549083905b81811015611d9f576000868683818110611a9757fe5b905060200201359050838110611aee576040805162461bcd60e51b815260206004820152601760248201527670617274696370616e74496e64657820746f6f2062696760481b604482015290519081900360640190fd5b6000888152600160205260408120600501805483908110611b0b57fe5b6000918252602090912001546001600160a01b03169050338114611b76576040805162461bcd60e51b815260206004820152601960248201527f7061727469636970616e7473206e6f74206d61746368696e6700000000000000604482015290519081900360640190fd5b6000898152600160205260408120600501805484908110611b9357fe5b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155611bc7878b856135b1565b60008b815260016020526040902080549192509082908110611be557fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd3084600160008f81526020019081526020016000206001018581548110611c3457fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b50505060008b815260016020526040812080549192509083908110611cc557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600160008c81526020019081526020016000206001018281548110611d1657fe5b9060005260206000200181905550816001600160a01b03168a7fc85ca87b3d76a8fea4832d16f23dc3b8f2acfd50df559e93c0592719866c39ea856040518082815260200191505060405180910390a350604051600160801b8a028301906000906001600160a01b03841690600080516020613c78833981519152908390a45050600101611a81565b5033600090815260086020526040902080549190910390555050505050565b611dc88133613601565b5050565b60009283526003602090815260408085206001600160a01b03948516865282528085209290931684525290205490565b6040805180820190915260078152664d59535445525960c81b602082015290565b6001600160a01b038216611e73576040805162461bcd60e51b81526020600482015260186024820152776f70657261746f72206973207a65726f206164647265737360401b604482015290519081900360640190fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611eec858585612af2565b611f2e85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133f792505050565b611f7a576040805162461bcd60e51b8152602060048201526018602482015277195c98cdcc8c481d1c985b9cd9995c881c995a9958dd195960421b604482015290519081900360640190fd5b5050505050565b6060611f8c826116ea565b50600080611f9984612adc565b915091506060600160008481526020019081526020016000206007018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120495780601f1061201e57610100808354040283529160200191612049565b820191906000526020600020905b81548152906001019060200180831161202c57829003601f168201915b5050505050905060608190506007815111801561208557508060008151811061206e57fe5b6020910101516001600160f81b031916600d60fb1b145b80156120b057508060018151811061209957fe5b6020910101516001600160f81b031916601d60fa1b145b80156120db5750806002815181106120c457fe5b6020910101516001600160f81b031916601d60fa1b145b80156121065750806003815181106120ef57fe5b6020910101516001600160f81b031916600760fc1b145b156121f7578161211587613825565b6040516020018083805190602001908083835b602083106121475780518252601f199092019160209182019101612128565b51815160209384036101000a60001901801990921691161790526b05edacae8c2c8c2e8c2be60f60a31b919093019081528451600c90910192850191508083835b602083106121a75780518252601f199092019160209182019101612188565b6001836020036101000a0380198251168184511680821785525050505050509050018064173539b7b760d91b81525060050192505050604051602081830303815290604052945050505050610ae8565b509250610ae8915050565b60008181526001602081905260409091206003810154918101546005820154600283015492936001600160a01b031692600160a01b90046001600160601b0316428111612284576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74206f6e2073616c6560a81b604482015290519081900360640190fd5b8282106122c25760405162461bcd60e51b8152600401808060200182810382526024815260200180613c0c6024913960400191505060405180910390fd5b600585018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b03891617905560028311156124e257604080516000194301406020808301829052600160f81b838501528351602181850301815260419093019093528151919092012060009085908161233b57fe5b604080516020808201879052600160f91b828401528251602181840301815260419092019092528051910120919006915060009086908161237857fe5b069050808214156123935785816001018161238f57fe5b0691505b60008860010183815481106123a457fe5b906000526020600020015490508860010182815481106123c057fe5b90600052602060002001548960010184815481106123da57fe5b9060005260206000200181905550808960010183815481106123f857fe5b9060005260206000200181905550600089600001848154811061241757fe5b60009182526020822001548b546001600160a01b0390911692508b908590811061243d57fe5b6000918252602090912001546001600160a01b039081169150821681146124db57808b600001868154811061246e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818b60000185815481106124ac57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050505050505b6004850154600082815260036020908152604080832060068a01546001600160a01b039081168552908352818420908916808552925290912080546001600160801b03600160801b850481169091019091559091169061258a57803414612585576040805162461bcd60e51b81526020600482015260126024820152716d73672e76616c756520213d20707269636560701b604482015290519081900360640190fd5b6125e7565b6125968533308461393a565b6125e7576040805162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207472616e736665722070726963650000000000000000604482015290519081900360640190fd5b506040805183815290516001600160a01b0389169188917f292e050b5727d0bf5034047e8f7d34f4908bda714a724efbb00a8d0dc147ef209181900360200190a36001600160a01b0387166000818152600860205260408082208054600101905551600160801b89028501929190600080516020613c78833981519152908290a450505050505050565b61267b3382612202565b50565b60006001600160a01b0383166126d2576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038216612728576040805162461bcd60e51b81526020600482015260186024820152776f70657261746f72206973207a65726f206164647265737360401b604482015290519081900360640190fd5b506001600160a01b0380831660009081526007602090815260408083209385168352929052205460ff165b92915050565b60009081526005602052604090205490565b61267b816000600019611127565b600082815260016020908152604080832060020154600160a01b90046001600160601b0316808452600590925290912054806127bd576127ba826000613601565b90505b600084815260016020526040902060050154831061281c576040805162461bcd60e51b815260206004820152601760248201527670617274696370616e74496e64657820746f6f2062696760481b604482015290519081900360640190fd5b600084815260016020526040812060050180548590811061283957fe5b6000918252602090912001546001600160a01b031690503381146128a4576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c79207061727469636970616e742063616e2077697468647261776e0000604482015290519081900360640190fd5b60008581526001602052604081206005018054869081106128c157fe5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556128f58387876135b1565b60008781526001602052604090208054919250908290811061291357fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd3084600160008b8152602001908152602001600020600101858154811061296257fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b1580156129be57600080fd5b505af11580156129d2573d6000803e3d6000fd5b5050506000878152600160205260408120805491925090839081106129f357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600160008881526020019081526020016000206001018281548110612a4457fe5b9060005260206000200181905550816001600160a01b0316867fc85ca87b3d76a8fea4832d16f23dc3b8f2acfd50df559e93c0592719866c39ea876040518082815260200191505060405180910390a36001600160a01b038216600081815260086020526040808220805460001901905551600160801b890288019290600080516020613c78833981519152908390a4505050505050565b600160801b8104916001600160801b0390911690565b6001600160a01b038216612b44576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038316612b96576040805162461bcd60e51b815260206004820152601460248201527366726f6d206973207a65726f206164647265737360601b604482015290519081900360640190fd5b6000818152600660205260409020546001600160a01b03908116908416331480612be557506001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b80612bf85750336001600160a01b038216145b612c38576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b600080612c4484612adc565b91509150856001600160a01b0316600160008481526020019081526020016000206005018281548110612c7357fe5b6000918252602090912001546001600160a01b031614612cd3576040805162461bcd60e51b815260206004820152601660248201527563757272656e74206f776e657220213d205f66726f6d60501b604482015290519081900360640190fd5b6000828152600160205260409020600501805486919083908110612cf357fe5b600091825260209091200180546001600160a01b0319166001600160a01b03928316179055831615612d3c57600084815260066020526040902080546001600160a01b03191690555b6001600160a01b03808716600081815260086020526040808220805460001901905592881680825283822080546001019055925187939291600080516020613c7883398151915291a4505050505050565b600082815260016020908152604080832060020154600160a01b90046001600160601b03168352600590915281205481908190612dcb9086866135b1565b600086815260016020526040902080549192509082908110612de957fe5b600091825260208083209091015487835260019182905260409092200180546001600160a01b039092169183908110612e1e57fe5b906000526020600020015492509250509250929050565b60005b81811015611f7a576000848281518110612e4e57fe5b60200260200101516001600160a01b0316636352211e858481518110612e7057fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612eac57600080fd5b505afa158015612ec0573d6000803e3d6000fd5b505050506040513d6020811015612ed657600080fd5b505190506001600160a01b0380821690871614612f3a576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920746865206f776e65722063616e2062652073656c6c657200000000604482015290519081900360640190fd5b848281518110612f4657fe5b60200260200101516001600160a01b03166323b872dd8230878681518110612f6a57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612fda57600080fd5b505af1158015612fee573d6000803e3d6000fd5b505060019093019250612e38915050565b600080546001908101808355604080516101408101825289815260208082018a905288516001600160a01b039081168385015288516001600160601b031660608401528982015181166080840152888201516001600160801b0390811660a0850152898501511660c08401528351878152808301855260e08401528984015116610100830152610120820187905283865293845293208351805192949391926130ab9284920190613ab4565b5060208281015180516130c49260018501920190613b19565b50604082015160028201805460608501516001600160601b0316600160a01b026001600160a01b039384166001600160a01b031992831617841617909155608084015160038401805491909316911617905560a082015160048201805460c08501516001600160801b03908116600160801b029381166001600160801b0319909216919091171691909117905560e0820151805161316c916005840191602090910190613ab4565b506101008201516006820180546001600160a01b0319166001600160a01b0390921691909117905561012082015180516131b0916007840191602090910190613b60565b508591506002905060200201516001600160a01b031684600060200201516001600160a01b03167ff7547918c91db705558681911b9085ef865608679deee039ea50908ad358bb87838a8760006020020151896001602002015189600160200201518c8e8c600260200201518c604051808a815260200180602001896001600160601b03166001600160601b03168152602001886001600160a01b03166001600160a01b03168152602001876001600160801b03166001600160801b031681526020018060200180602001866001600160801b03166001600160801b031681526020018060200185810385528d818151815260200191508051906020019080838360005b838110156132cc5781810151838201526020016132b4565b50505050905090810190601f1680156132f95780820380516001836020036101000a031916815260200191505b508581038452895181528951602091820191808c01910280838360005b8381101561332e578181015183820152602001613316565b50505050905001858103835288818151815260200191508051906020019060200280838360005b8381101561336d578181015183820152602001613355565b50505050905001858103825286818151815260200191508051906020019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a350505050505050565b6000613402846139d9565b61340e57506001613513565b604051630a85bd0160e11b8082526001600160a01b038781166004840181815260248501919091526044840187905260806064850190815286516084860152865193949289169363150b7a02938b9384938b938b9360a40190602085019080838360005b8381101561348a578181015183820152602001613472565b50505050905090810190601f1680156134b75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d602081101561350357600080fd5b50516001600160e01b0319161490505b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1781528151600092918391829182896127105a03f16040513d6000823e3d8015613594576020811461359c57600094506135a6565b8294506135a6565b8151158315171594505b505050509392505050565b60008281526001602081815260408084209092015482518083018890528084018790528351808203850181526060909101909352825192909101919091208301816135f857fe5b06949350505050565b60004283106136415760405162461bcd60e51b8152600401808060200182810382526028815260200180613cc16028913960400191505060405180910390fd5b600480546040805162c9c72760e31b8152905142879003936000936001600160a01b03169263064e39389281830192602092829003018186803b15801561368757600080fd5b505afa15801561369b573d6000803e3d6000fd5b505050506040513d60208110156136b157600080fd5b505190506000816103e88402816136c457fe5b049050600081116137065760405162461bcd60e51b8152600401808060200182810382526029815260200180613c986029913960400191505060405180910390fd5b60008681526005602052604090205443829003906001600160a01b0387161580159061373c57508015158061373c575061010083105b801561376b575060008881526002602090815260408083206001600160a01b038b16845290915290205460ff16155b1561379e5760008881526002602090815260408083206001600160a01b038b1684529091529020805460ff191660011790555b80156137b05794506127539350505050565b6101008310156137c2575080406137d3565b60ff60001984010660010143034090505b600088815260056020908152604091829020839055815183815291518a927f1599ad63580ca2bbd26e39c5584488358d60e2a67869cfe401936098ac98417692908290030190a2979650505050505050565b6060600061383283613a10565b90506060816040036040519080825280601f01601f191660200182016040528015613864576020820181803883390190505b50905060028204805b602081101561393057600081601f0360080260020a878161388a57fe5b0460f81b9050600060108260f81c60ff16816138a257fe5b0460f81b905060008160f81c6010028360f81c0360f81b9050600085850360020290506138ce83613a65565b8782815181106138da57fe5b60200101906001600160f81b031916908160001a9053506138fa82613a65565b87826001018151811061390957fe5b60200101906001600160f81b031916908160001a905350506001909301925061386d915050565b5090949350505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17815281516000929183918291828a6127105a03f16040513d6000823e3d80156139bb57602081146139c357600094506139cd565b8294506139cd565b8151158315171594505b50505050949350505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f80158015906135135750141592915050565b600080805b6020811015613a5e57600081601f0360080260020a8581613a3257fe5b0460f81b90506001600160f81b0319811615613a4e5750613a5e565b5060029190910190600101613a15565b5092915050565b6000600a60f883901c1015613a85578160f81c60300160f81b9050610ae8565b8160f81c60570160f81b9050610ae8565b60405180606001604052806003906020820280388339509192915050565b828054828255906000526020600020908101928215613b09579160200282015b82811115613b0957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ad4565b50613b15929150613bcd565b5090565b828054828255906000526020600020908101928215613b54579160200282015b82811115613b54578251825591602001919060010190613b39565b50613b15929150613bf1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613ba157805160ff1916838001178555613b54565b82800160010185558215613b545791820182811115613b54578251825591602001919060010190613b39565b610b1391905b80821115613b155780546001600160a01b0319168155600101613bd3565b610b1391905b80821115613b155760008155600101613bf756fe616c6c206d79737465727920626f78657320686173206265656e20707572636861736564746f6b656e496473206c656e67746820213d206e6674436f6e747261637473206c656e6774686661696c656420746f207472616e736665722066656520746f2072657665616c6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef63616e6e6f74206765742063757272656e7420626c6f636b486173682c207265747279206c6174657263616e6e6f74207265636f7264206120667574757265206f722070726573656e742072657665616ca265627a7a72305820839af8f0bfb8fed8d936c4decce1256304f95b6701cd67303694a3a593850cb464736f6c6343000509003200000000000000000000000013027e80fafa82f70ee77dc2ab1dbf91246d85e5

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063690e7c0911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146109da578063ee82ac5e14610a15578063f7315b8914610a3f578063fdb483c714610a69576101d8565b8063b88d4fde146108cc578063c87b56dd14610967578063cbce4c9714610991578063d96a094a146109bd576101d8565b806389e33fd4116100d157806389e33fd41461081157806393dec1231461083b57806395d89b411461087c578063a22cb46514610891576101d8565b8063690e7c091461070857806370a08231146107325780637861d269146107655780637c05ecb21461078f576101d8565b806342842e0e1161017a5780634f972eaf116101495780634f972eaf146106455780635443fed01461067b5780636352211e146106a5578063672326b8146106cf576101d8565b806342842e0e1461057257806345c5903d146105b5578063496e332b146105f15780634f558e791461061b576101d8565b8063095ea7b3116101b6578063095ea7b3146102f557806323b872dd146103305780632fc6c854146103735780633b10acdf146103c6576101d8565b806301ffc9a7146101dd57806306fdde0314610225578063081812fc146102af575b600080fd5b3480156101e957600080fd5b506102116004803603602081101561020057600080fd5b50356001600160e01b031916610a99565b604080519115158252519081900360200190f35b34801561023157600080fd5b5061023a610aed565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027457818101518382015260200161025c565b50505050905090810190601f1680156102a15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102bb57600080fd5b506102d9600480360360208110156102d257600080fd5b5035610b16565b604080516001600160a01b039092168252519081900360200190f35b34801561030157600080fd5b5061032e6004803603604081101561031857600080fd5b506001600160a01b038135169060200135610b3e565b005b34801561033c57600080fd5b5061032e6004803603606081101561035357600080fd5b506001600160a01b03813581169160208101359091169060400135610c31565b34801561037f57600080fd5b506103a36004803603604081101561039657600080fd5b5080359060200135610c41565b604080516001600160a01b03909316835260208301919091528051918290030190f35b3480156103d257600080fd5b5061032e60048036036101208110156103ea57600080fd5b810190602081018135600160201b81111561040457600080fd5b82018360208201111561041657600080fd5b803590602001918460018302840111600160201b8311171561043757600080fd5b919390929091602081019035600160201b81111561045457600080fd5b82018360208201111561046657600080fd5b803590602001918460208302840111600160201b8311171561048757600080fd5b919390929091602081019035600160201b8111156104a457600080fd5b8201836020820111156104b657600080fd5b803590602001918460208302840111600160201b831117156104d757600080fd5b919390926001600160601b03833516926001600160a01b0360208201358116936001600160801b0360408401358116946060850135909316936080810135909116929060c081019060a00135600160201b81111561053457600080fd5b82018360208201111561054657600080fd5b803590602001918460018302840111600160201b8311171561056757600080fd5b509092509050610c9b565b34801561057e57600080fd5b5061032e6004803603606081101561059557600080fd5b506001600160a01b03813581169160208101359091169060400135610fc7565b3480156105c157600080fd5b506105df600480360360208110156105d857600080fd5b5035611039565b60408051918252519081900360200190f35b3480156105fd57600080fd5b506102116004803603602081101561061457600080fd5b503561108a565b34801561062757600080fd5b506102116004803603602081101561063e57600080fd5b5035611100565b34801561065157600080fd5b5061032e6004803603606081101561066857600080fd5b5080359060208101359060400135611127565b34801561068757600080fd5b5061023a6004803603602081101561069e57600080fd5b503561150c565b3480156106b157600080fd5b506102d9600480360360208110156106c857600080fd5b50356116ea565b3480156106db57600080fd5b5061032e600480360360408110156106f257600080fd5b50803590602001356001600160a01b0316611788565b34801561071457600080fd5b5061032e6004803603602081101561072b57600080fd5b503561192c565b34801561073e57600080fd5b506105df6004803603602081101561075557600080fd5b50356001600160a01b0316611946565b34801561077157600080fd5b506103a36004803603602081101561078857600080fd5b50356119b6565b34801561079b57600080fd5b5061032e600480360360408110156107b257600080fd5b81359190810190604081016020820135600160201b8111156107d357600080fd5b8201836020820111156107e557600080fd5b803590602001918460208302840111600160201b8311171561080657600080fd5b509092509050611a25565b34801561081d57600080fd5b5061032e6004803603602081101561083457600080fd5b5035611dbe565b34801561084757600080fd5b506105df6004803603606081101561085e57600080fd5b508035906001600160a01b0360208201358116916040013516611dcc565b34801561088857600080fd5b5061023a611dfc565b34801561089d57600080fd5b5061032e600480360360408110156108b457600080fd5b506001600160a01b0381351690602001351515611e1d565b3480156108d857600080fd5b5061032e600480360360808110156108ef57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561092957600080fd5b82018360208201111561093b57600080fd5b803590602001918460018302840111600160201b8311171561095c57600080fd5b509092509050611ee1565b34801561097357600080fd5b5061023a6004803603602081101561098a57600080fd5b5035611f81565b61032e600480360360408110156109a757600080fd5b506001600160a01b038135169060200135612202565b61032e600480360360208110156109d357600080fd5b5035612671565b3480156109e657600080fd5b50610211600480360360408110156109fd57600080fd5b506001600160a01b038135811691602001351661267e565b348015610a2157600080fd5b506105df60048036036020811015610a3857600080fd5b5035612759565b348015610a4b57600080fd5b5061032e60048036036020811015610a6257600080fd5b503561276b565b348015610a7557600080fd5b5061032e60048036036040811015610a8c57600080fd5b5080359060200135612779565b60006301ffc9a760e01b6001600160e01b031983161480610aca57506380ac58cd60e01b6001600160e01b03198316145b80610ae55750635b5e139f60e01b6001600160e01b03198316145b90505b919050565b60408051808201909152600e81526d135e5cdd195c9e4813585c9ad95d60921b60208201525b90565b6000610b21826116ea565b50506000908152600660205260409020546001600160a01b031690565b600080610b4a83612adc565b60008281526001602052604090206005018054929450909250339183908110610b6f57fe5b6000918252602090912001546001600160a01b031614610bd6576040805162461bcd60e51b815260206004820152601b60248201527f63757272656e74206f776e657220213d206d73672e73656e6465720000000000604482015290519081900360640190fd5b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388169081179091559051859233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b610c3c838383612af2565b505050565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152812054819080610c84575060009150819050610c94565b610c8e8585612d8d565b92509250505b9250929050565b898814610cd95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c306026913960400191505060405180910390fd5b846001600160801b0316836001600160801b03161115610d2f576040805162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b604482015290519081900360640190fd5b42876001600160601b031611610d85576040805162461bcd60e51b81526020600482015260166024820152751c995d99585b151a5b59481a5b881d1a19481c185cdd60521b604482015290519081900360640190fd5b610e06338c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e9250612e35915050565b610e0e613a96565b338160006001600160a01b039092166020929092020152868160016001600160a01b0390921660209290920201528481600260200201906001600160a01b031690816001600160a01b031681525050610fb78e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508460405180606001604052808e6001600160601b03166001600160801b031681526020018c6001600160801b03166001600160801b031681526020018a6001600160801b03166001600160801b031681525088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fff92505050565b5050505050505050505050505050565b610fd2838383612af2565b610fed838383604051806020016040528060008152506133f7565b610c3c576040805162461bcd60e51b8152602060048201526018602482015277195c98cdcc8c481d1c985b9cd9995c881c995a9958dd195960421b604482015290519081900360640190fd5b600081815260016020526040812060020154600160a01b90046001600160601b031642101561108257506000818152600160208190526040909120600581015491015403610ae8565b506000610ae8565b600081815260016020818152604080842060020154600160a01b90046001600160601b0316808552600583529084205485855292909152158015906110cd575080155b80156110f95750600083815260016020526040902060020154600160a01b90046001600160601b031642115b9392505050565b600090815260016020526040902060020154600160a01b90046001600160601b0316151590565b600083815260016020908152604080832060028101546001600160601b03600160a01b82041685526005909352922054906001600160a01b0316816111b3576040805162461bcd60e51b815260206004820152601a60248201527f73616c6520686173206e6f74206265656e2072657665616c6564000000000000604482015290519081900360640190fd5b6001600160a01b038116611207576040805162461bcd60e51b815260206004820152601660248201527539b0b6329030b63932b0b23c903bb4ba34323930bbb760511b604482015290519081900360640190fd5b600583015460048401546001600160801b031680158015906112295750600082115b156113495760048501546003860154600160801b9091046001600160801b031682038302906001600160a01b031680611298576040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015611292573d6000803e3d6000fd5b506112f4565b6112a381868461351b565b6112f4576040805162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e736665722070617920746f2073656c6c6572000000604482015290519081900360640190fd5b6004870180546001600160801b03191690556040805183815290516001600160a01b038716918c917f2d5b4c29ee2e7a4bd90c2404819860f4556eea21701f202e5ce6ab1fc3d207569181900360200190a350505b6001850154600061135b868b866135b1565b905083820388111561136d5783820397505b885b888110156114ac576000838284018161138457fe5b06905088600001818154811061139657fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30898c60010185815481106113d357fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b15801561142f57600080fd5b505af1158015611443573d6000803e3d6000fd5b50505050600089600001828154811061145857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600089600101828154811061149757fe5b6000918252602090912001555060010161136f565b50838203881415611500576040516001600160a01b038616908b907f2fb04d9c1956da6d354c2346f539f8ece38328a0ba8b6b7394ee7520a95f876790600090a36002870180546001600160a01b03191690555b50505050505050505050565b6060611517826116ea565b5060008061152484612adc565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152902054919350915080156116465760008061156b8585612d8d565b91509150816001600160a01b031663c87b56dd826040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156115b357600080fd5b505afa1580156115c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115f057600080fd5b810190808051600160201b81111561160757600080fd5b8201602081018481111561161a57600080fd5b8151600160201b81118282018710171561163357600080fd5b50909950610ae898505050505050505050565b60008381526001602081815260409283902060070180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383529192908301828280156116db5780601f106116b0576101008083540402835291602001916116db565b820191906000526020600020905b8154815290600101906020018083116116be57829003601f168201915b50505050509350505050919050565b60008060006116f884612adc565b60008281526001602052604081206005018054939550919350909182908490811061171f57fe5b6000918252602090912001546001600160a01b031690508061177f576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b95945050505050565b600082815260026020908152604080832033845290915290205460ff166117ef576040805162461bcd60e51b8152602060048201526016602482015275646964206e6f742072657665616c20696e2074696d6560501b604482015290519081900360640190fd5b600082815260036020908152604080832033845282528083206001600160a01b038516845290915290205480611864576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081c995dd85c99081d1bc818dbdb1b1958dd605a1b604482015290519081900360640190fd5b6000838152600360209081526040808320338085529083528184206001600160a01b038716808652908452828520859055878552600284528285209185529252909120805460ff191690556118e657604051339082156108fc029083906000818181858888f193505050501580156118e0573d6000803e3d6000fd5b50610c3c565b6118f182338361351b565b610c3c5760405162461bcd60e51b8152600401808060200182810382526022815260200180613c566022913960400191505060405180910390fd5b60008061193883612adc565b91509150610c3c8282612779565b60006001600160a01b03821661199a576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b506001600160a01b031660009081526008602052604090205490565b6000806000806119c585612adc565b600082815260016020908152604080832060020154600160a01b90046001600160601b031683526005909152902054919350915080611a0e575060009350839250611a20915050565b611a188383612d8d565b945094505050505b915091565b600083815260016020908152604080832060020154600160a01b90046001600160601b03168084526005909252909120549081611a6a57611a67816000613601565b91505b506000848152600160205260408120600501549083905b81811015611d9f576000868683818110611a9757fe5b905060200201359050838110611aee576040805162461bcd60e51b815260206004820152601760248201527670617274696370616e74496e64657820746f6f2062696760481b604482015290519081900360640190fd5b6000888152600160205260408120600501805483908110611b0b57fe5b6000918252602090912001546001600160a01b03169050338114611b76576040805162461bcd60e51b815260206004820152601960248201527f7061727469636970616e7473206e6f74206d61746368696e6700000000000000604482015290519081900360640190fd5b6000898152600160205260408120600501805484908110611b9357fe5b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155611bc7878b856135b1565b60008b815260016020526040902080549192509082908110611be557fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd3084600160008f81526020019081526020016000206001018581548110611c3457fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b50505060008b815260016020526040812080549192509083908110611cc557fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600160008c81526020019081526020016000206001018281548110611d1657fe5b9060005260206000200181905550816001600160a01b03168a7fc85ca87b3d76a8fea4832d16f23dc3b8f2acfd50df559e93c0592719866c39ea856040518082815260200191505060405180910390a350604051600160801b8a028301906000906001600160a01b03841690600080516020613c78833981519152908390a45050600101611a81565b5033600090815260086020526040902080549190910390555050505050565b611dc88133613601565b5050565b60009283526003602090815260408085206001600160a01b03948516865282528085209290931684525290205490565b6040805180820190915260078152664d59535445525960c81b602082015290565b6001600160a01b038216611e73576040805162461bcd60e51b81526020600482015260186024820152776f70657261746f72206973207a65726f206164647265737360401b604482015290519081900360640190fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611eec858585612af2565b611f2e85858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133f792505050565b611f7a576040805162461bcd60e51b8152602060048201526018602482015277195c98cdcc8c481d1c985b9cd9995c881c995a9958dd195960421b604482015290519081900360640190fd5b5050505050565b6060611f8c826116ea565b50600080611f9984612adc565b915091506060600160008481526020019081526020016000206007018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120495780601f1061201e57610100808354040283529160200191612049565b820191906000526020600020905b81548152906001019060200180831161202c57829003601f168201915b5050505050905060608190506007815111801561208557508060008151811061206e57fe5b6020910101516001600160f81b031916600d60fb1b145b80156120b057508060018151811061209957fe5b6020910101516001600160f81b031916601d60fa1b145b80156120db5750806002815181106120c457fe5b6020910101516001600160f81b031916601d60fa1b145b80156121065750806003815181106120ef57fe5b6020910101516001600160f81b031916600760fc1b145b156121f7578161211587613825565b6040516020018083805190602001908083835b602083106121475780518252601f199092019160209182019101612128565b51815160209384036101000a60001901801990921691161790526b05edacae8c2c8c2e8c2be60f60a31b919093019081528451600c90910192850191508083835b602083106121a75780518252601f199092019160209182019101612188565b6001836020036101000a0380198251168184511680821785525050505050509050018064173539b7b760d91b81525060050192505050604051602081830303815290604052945050505050610ae8565b509250610ae8915050565b60008181526001602081905260409091206003810154918101546005820154600283015492936001600160a01b031692600160a01b90046001600160601b0316428111612284576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74206f6e2073616c6560a81b604482015290519081900360640190fd5b8282106122c25760405162461bcd60e51b8152600401808060200182810382526024815260200180613c0c6024913960400191505060405180910390fd5b600585018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b03891617905560028311156124e257604080516000194301406020808301829052600160f81b838501528351602181850301815260419093019093528151919092012060009085908161233b57fe5b604080516020808201879052600160f91b828401528251602181840301815260419092019092528051910120919006915060009086908161237857fe5b069050808214156123935785816001018161238f57fe5b0691505b60008860010183815481106123a457fe5b906000526020600020015490508860010182815481106123c057fe5b90600052602060002001548960010184815481106123da57fe5b9060005260206000200181905550808960010183815481106123f857fe5b9060005260206000200181905550600089600001848154811061241757fe5b60009182526020822001548b546001600160a01b0390911692508b908590811061243d57fe5b6000918252602090912001546001600160a01b039081169150821681146124db57808b600001868154811061246e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818b60000185815481106124ac57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050505050505b6004850154600082815260036020908152604080832060068a01546001600160a01b039081168552908352818420908916808552925290912080546001600160801b03600160801b850481169091019091559091169061258a57803414612585576040805162461bcd60e51b81526020600482015260126024820152716d73672e76616c756520213d20707269636560701b604482015290519081900360640190fd5b6125e7565b6125968533308461393a565b6125e7576040805162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207472616e736665722070726963650000000000000000604482015290519081900360640190fd5b506040805183815290516001600160a01b0389169188917f292e050b5727d0bf5034047e8f7d34f4908bda714a724efbb00a8d0dc147ef209181900360200190a36001600160a01b0387166000818152600860205260408082208054600101905551600160801b89028501929190600080516020613c78833981519152908290a450505050505050565b61267b3382612202565b50565b60006001600160a01b0383166126d2576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038216612728576040805162461bcd60e51b81526020600482015260186024820152776f70657261746f72206973207a65726f206164647265737360401b604482015290519081900360640190fd5b506001600160a01b0380831660009081526007602090815260408083209385168352929052205460ff165b92915050565b60009081526005602052604090205490565b61267b816000600019611127565b600082815260016020908152604080832060020154600160a01b90046001600160601b0316808452600590925290912054806127bd576127ba826000613601565b90505b600084815260016020526040902060050154831061281c576040805162461bcd60e51b815260206004820152601760248201527670617274696370616e74496e64657820746f6f2062696760481b604482015290519081900360640190fd5b600084815260016020526040812060050180548590811061283957fe5b6000918252602090912001546001600160a01b031690503381146128a4576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c79207061727469636970616e742063616e2077697468647261776e0000604482015290519081900360640190fd5b60008581526001602052604081206005018054869081106128c157fe5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091556128f58387876135b1565b60008781526001602052604090208054919250908290811061291357fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd3084600160008b8152602001908152602001600020600101858154811061296257fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483015291516064808301939282900301818387803b1580156129be57600080fd5b505af11580156129d2573d6000803e3d6000fd5b5050506000878152600160205260408120805491925090839081106129f357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000600160008881526020019081526020016000206001018281548110612a4457fe5b9060005260206000200181905550816001600160a01b0316867fc85ca87b3d76a8fea4832d16f23dc3b8f2acfd50df559e93c0592719866c39ea876040518082815260200191505060405180910390a36001600160a01b038216600081815260086020526040808220805460001901905551600160801b890288019290600080516020613c78833981519152908390a4505050505050565b600160801b8104916001600160801b0390911690565b6001600160a01b038216612b44576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038316612b96576040805162461bcd60e51b815260206004820152601460248201527366726f6d206973207a65726f206164647265737360601b604482015290519081900360640190fd5b6000818152600660205260409020546001600160a01b03908116908416331480612be557506001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b80612bf85750336001600160a01b038216145b612c38576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b600080612c4484612adc565b91509150856001600160a01b0316600160008481526020019081526020016000206005018281548110612c7357fe5b6000918252602090912001546001600160a01b031614612cd3576040805162461bcd60e51b815260206004820152601660248201527563757272656e74206f776e657220213d205f66726f6d60501b604482015290519081900360640190fd5b6000828152600160205260409020600501805486919083908110612cf357fe5b600091825260209091200180546001600160a01b0319166001600160a01b03928316179055831615612d3c57600084815260066020526040902080546001600160a01b03191690555b6001600160a01b03808716600081815260086020526040808220805460001901905592881680825283822080546001019055925187939291600080516020613c7883398151915291a4505050505050565b600082815260016020908152604080832060020154600160a01b90046001600160601b03168352600590915281205481908190612dcb9086866135b1565b600086815260016020526040902080549192509082908110612de957fe5b600091825260208083209091015487835260019182905260409092200180546001600160a01b039092169183908110612e1e57fe5b906000526020600020015492509250509250929050565b60005b81811015611f7a576000848281518110612e4e57fe5b60200260200101516001600160a01b0316636352211e858481518110612e7057fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612eac57600080fd5b505afa158015612ec0573d6000803e3d6000fd5b505050506040513d6020811015612ed657600080fd5b505190506001600160a01b0380821690871614612f3a576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c7920746865206f776e65722063616e2062652073656c6c657200000000604482015290519081900360640190fd5b848281518110612f4657fe5b60200260200101516001600160a01b03166323b872dd8230878681518110612f6a57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612fda57600080fd5b505af1158015612fee573d6000803e3d6000fd5b505060019093019250612e38915050565b600080546001908101808355604080516101408101825289815260208082018a905288516001600160a01b039081168385015288516001600160601b031660608401528982015181166080840152888201516001600160801b0390811660a0850152898501511660c08401528351878152808301855260e08401528984015116610100830152610120820187905283865293845293208351805192949391926130ab9284920190613ab4565b5060208281015180516130c49260018501920190613b19565b50604082015160028201805460608501516001600160601b0316600160a01b026001600160a01b039384166001600160a01b031992831617841617909155608084015160038401805491909316911617905560a082015160048201805460c08501516001600160801b03908116600160801b029381166001600160801b0319909216919091171691909117905560e0820151805161316c916005840191602090910190613ab4565b506101008201516006820180546001600160a01b0319166001600160a01b0390921691909117905561012082015180516131b0916007840191602090910190613b60565b508591506002905060200201516001600160a01b031684600060200201516001600160a01b03167ff7547918c91db705558681911b9085ef865608679deee039ea50908ad358bb87838a8760006020020151896001602002015189600160200201518c8e8c600260200201518c604051808a815260200180602001896001600160601b03166001600160601b03168152602001886001600160a01b03166001600160a01b03168152602001876001600160801b03166001600160801b031681526020018060200180602001866001600160801b03166001600160801b031681526020018060200185810385528d818151815260200191508051906020019080838360005b838110156132cc5781810151838201526020016132b4565b50505050905090810190601f1680156132f95780820380516001836020036101000a031916815260200191505b508581038452895181528951602091820191808c01910280838360005b8381101561332e578181015183820152602001613316565b50505050905001858103835288818151815260200191508051906020019060200280838360005b8381101561336d578181015183820152602001613355565b50505050905001858103825286818151815260200191508051906020019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a350505050505050565b6000613402846139d9565b61340e57506001613513565b604051630a85bd0160e11b8082526001600160a01b038781166004840181815260248501919091526044840187905260806064850190815286516084860152865193949289169363150b7a02938b9384938b938b9360a40190602085019080838360005b8381101561348a578181015183820152602001613472565b50505050905090810190601f1680156134b75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d602081101561350357600080fd5b50516001600160e01b0319161490505b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1781528151600092918391829182896127105a03f16040513d6000823e3d8015613594576020811461359c57600094506135a6565b8294506135a6565b8151158315171594505b505050509392505050565b60008281526001602081815260408084209092015482518083018890528084018790528351808203850181526060909101909352825192909101919091208301816135f857fe5b06949350505050565b60004283106136415760405162461bcd60e51b8152600401808060200182810382526028815260200180613cc16028913960400191505060405180910390fd5b600480546040805162c9c72760e31b8152905142879003936000936001600160a01b03169263064e39389281830192602092829003018186803b15801561368757600080fd5b505afa15801561369b573d6000803e3d6000fd5b505050506040513d60208110156136b157600080fd5b505190506000816103e88402816136c457fe5b049050600081116137065760405162461bcd60e51b8152600401808060200182810382526029815260200180613c986029913960400191505060405180910390fd5b60008681526005602052604090205443829003906001600160a01b0387161580159061373c57508015158061373c575061010083105b801561376b575060008881526002602090815260408083206001600160a01b038b16845290915290205460ff16155b1561379e5760008881526002602090815260408083206001600160a01b038b1684529091529020805460ff191660011790555b80156137b05794506127539350505050565b6101008310156137c2575080406137d3565b60ff60001984010660010143034090505b600088815260056020908152604091829020839055815183815291518a927f1599ad63580ca2bbd26e39c5584488358d60e2a67869cfe401936098ac98417692908290030190a2979650505050505050565b6060600061383283613a10565b90506060816040036040519080825280601f01601f191660200182016040528015613864576020820181803883390190505b50905060028204805b602081101561393057600081601f0360080260020a878161388a57fe5b0460f81b9050600060108260f81c60ff16816138a257fe5b0460f81b905060008160f81c6010028360f81c0360f81b9050600085850360020290506138ce83613a65565b8782815181106138da57fe5b60200101906001600160f81b031916908160001a9053506138fa82613a65565b87826001018151811061390957fe5b60200101906001600160f81b031916908160001a905350506001909301925061386d915050565b5090949350505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17815281516000929183918291828a6127105a03f16040513d6000823e3d80156139bb57602081146139c357600094506139cd565b8294506139cd565b8151158315171594505b50505050949350505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f80158015906135135750141592915050565b600080805b6020811015613a5e57600081601f0360080260020a8581613a3257fe5b0460f81b90506001600160f81b0319811615613a4e5750613a5e565b5060029190910190600101613a15565b5092915050565b6000600a60f883901c1015613a85578160f81c60300160f81b9050610ae8565b8160f81c60570160f81b9050610ae8565b60405180606001604052806003906020820280388339509192915050565b828054828255906000526020600020908101928215613b09579160200282015b82811115613b0957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ad4565b50613b15929150613bcd565b5090565b828054828255906000526020600020908101928215613b54579160200282015b82811115613b54578251825591602001919060010190613b39565b50613b15929150613bf1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613ba157805160ff1916838001178555613b54565b82800160010185558215613b545791820182811115613b54578251825591602001919060010190613b39565b610b1391905b80821115613b155780546001600160a01b0319168155600101613bd3565b610b1391905b80821115613b155760008155600101613bf756fe616c6c206d79737465727920626f78657320686173206265656e20707572636861736564746f6b656e496473206c656e67746820213d206e6674436f6e747261637473206c656e6774686661696c656420746f207472616e736665722066656520746f2072657665616c6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef63616e6e6f74206765742063757272656e7420626c6f636b486173682c207265747279206c6174657263616e6e6f74207265636f7264206120667574757265206f722070726573656e742072657665616ca265627a7a72305820839af8f0bfb8fed8d936c4decce1256304f95b6701cd67303694a3a593850cb464736f6c63430005090032

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

00000000000000000000000013027e80fafa82f70ee77dc2ab1dbf91246d85e5

-----Decoded View---------------
Arg [0] : _averageBlockTimeOracle (address): 0x13027e80faFA82F70Ee77Dc2Ab1dbF91246d85E5

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000013027e80fafa82f70ee77dc2ab1dbf91246d85e5


Deployed Bytecode Sourcemap

92:24941:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22882:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22882:182:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22882:182:2;-1:-1:-1;;;;;;22882:182:2;;:::i;:::-;;;;;;;;;;;;;;;;;;20371:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20371:100:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8::-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20371:100:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19565:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19565:140:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19565:140:2;;:::i;:::-;;;;-1:-1:-1;;;;;19565:140:2;;;;;;;;;;;;;;18935:348;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18935:348:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18935:348:2;;;;;;;;:::i;:::-;;18004:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18004:129:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18004:129:2;;;;;;;;;;;;;;;;;:::i;15958:360::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15958:360:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15958:360:2;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15958:360:2;;;;;;;;;;;;;;;;;;;;;1803:932;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1803:932:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;1803:932:2;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1803:932:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1803:932:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1803:932:2;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1803:932:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1803:932:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1803:932:2;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1803:932:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1803:932:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1803:932:2;;;;-1:-1:-1;;;;;1803:932:2;;;;-1:-1:-1;;;;;1803:932:2;;;;;;;-1:-1:-1;;;;;1803:932:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;1803:932:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1803:932:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;1803:932:2;;-1:-1:-1;1803:932:2;-1:-1:-1;1803:932:2;:::i;17772:226::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17772:226:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17772:226:2;;;;;;;;;;;;;;;;;:::i;3859:339::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3859:339:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3859:339:2;;:::i;:::-;;;;;;;;;;;;;;;;15469:362;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15469:362:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15469:362:2;;:::i;15837:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15837:115:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15837:115:2;;:::i;9205:1693::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9205:1693:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9205:1693:2;;;;;;;;;;;;:::i;22385:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22385:476:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22385:476:2;;:::i;17158:353::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17158:353:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17158:353:2;;:::i;6827:658::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6827:658:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6827:658:2;;;;;;-1:-1:-1;;;;;6827:658:2;;:::i;11177:170::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11177:170:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11177:170:2;;:::i;16982:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16982:170:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16982:170:2;-1:-1:-1;;;;;16982:170:2;;:::i;11353:370::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11353:370:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11353:370:2;;:::i;11808:1744::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11808:1744:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11808:1744:2;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11808:1744:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11808:1744:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11808:1744:2;;-1:-1:-1;11808:1744:2;-1:-1:-1;11808:1744:2;:::i;7491:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7491:110:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7491:110:2;;:::i;6637:184::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6637:184:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6637:184:2;;;-1:-1:-1;;;;;6637:184:2;;;;;;;;;;;;:::i;20477:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20477:97:2;;;:::i;19289:270::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19289:270:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19289:270:2;;;;;;;;;;:::i;17517:249::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17517:249:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;17517:249:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;17517:249:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17517:249:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;17517:249:2;;-1:-1:-1;17517:249:2;-1:-1:-1;17517:249:2;:::i;21658:721::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21658:721:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21658:721:2;;:::i;4204:2224::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4204:2224:2;;;;;;;;:::i;3766:87::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3766:87:2;;:::i;19711:280::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19711:280:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19711:280:2;;;;;;;;;;:::i;6480:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6480:151:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6480:151:2;;:::i;9029:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9029:112:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9029:112:2;;:::i;13558:1285::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13558:1285:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13558:1285:2;;;;;;;:::i;22882:182::-;22952:4;-1:-1:-1;;;;;;;;;22974:25:2;;;;:54;;-1:-1:-1;;;;;;;;;;23003:25:2;;;22974:54;:83;;;-1:-1:-1;;;;;;;;;;23032:25:2;;;22974:83;22967:90;;22882:182;;;;:::o;20371:100::-;20441:23;;;;;;;;;;;;-1:-1:-1;;;20441:23:2;;;;20371:100;;:::o;19565:140::-;19627:7;19645:17;19653:8;19645:7;:17::i;:::-;-1:-1:-1;;19679:19:2;;;;:9;:19;;;;;;-1:-1:-1;;;;;19679:19:2;;19565:140::o;18935:348::-;19009:14;19025:24;19053:18;19062:8;19053;:18::i;:::-;19089:13;;;;:5;:13;;;;;:26;;:44;;19008:63;;-1:-1:-1;19008:63:2;;-1:-1:-1;19137:10:2;;19008:63;;19089:44;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19089:44:2;:58;19081:98;;;;;-1:-1:-1;;;19081:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;19189:19;;;;:9;:19;;;;;;:31;;-1:-1:-1;;;;;;19189:31:2;-1:-1:-1;;;;;19189:31:2;;;;;;;;19235:41;;19189:19;;19244:10;;19235:41;;19189:19;19235:41;18935:348;;;;:::o;18004:129::-;18091:35;18105:5;18112:3;18117:8;18091:13;:35::i;:::-;18004:129;;;:::o;15958:360::-;16073:18;16151:14;;;:5;:14;;;;;;;;:25;;;-1:-1:-1;;;16151:25:2;;-1:-1:-1;;;;;16151:25:2;16139:38;;:11;:38;;;;;;16073:18;;16139:38;16187:64;;-1:-1:-1;16235:1:2;;-1:-1:-1;16235:1:2;;-1:-1:-1;16220:20:2;;16187:64;16267:44;16284:7;16293:17;16267:16;:44::i;:::-;16260:51;;;;;15958:360;;;;;;:::o;1803:932::-;2151:40;;;2143:91;;;;-1:-1:-1;;;2143:91:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2260:6;-1:-1:-1;;;;;2252:14:2;:4;-1:-1:-1;;;;;2252:14:2;;;2244:39;;;;;-1:-1:-1;;;2244:39:2;;;;;;;;;;;;-1:-1:-1;;;2244:39:2;;;;;;;;;;;;;;;2377:15;2363:11;-1:-1:-1;;;;;2363:29:2;;2355:64;;;;;-1:-1:-1;;;2355:64:2;;;;;;;;;;;;-1:-1:-1;;;2355:64:2;;;;;;;;;;;;;;;2430:63;2438:10;2450:13;;2430:63;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;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;;2430:63:2;;;;;;2465:9;;2430:63;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2476:9:2;;-1:-1:-1;2430:7:2;;-1:-1:-1;;2430:63:2:i;:::-;2503:31;;:::i;:::-;2555:10;2544:5;2550:1;-1:-1:-1;;;;;2544:21:2;;;:8;;;;;;:21;2586:11;2575:5;2581:1;-1:-1:-1;;;;;2575:22:2;;;:8;;;;;;:22;2618:9;2607:5;2613:1;2607:8;;;:20;-1:-1:-1;;;;;2607:20:2;;;-1:-1:-1;;;;;2607:20:2;;;;;2637:91;2649:5;;2637:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;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;;2637:91:2;;;;;;2656:13;;2637:91;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;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;;2637:91:2;;;;;;2671:9;;2637:91;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;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;;2637:91:2;;;;;;2682:5;2637:91;;;;;;;;2690:11;-1:-1:-1;;;;;2637:91:2;-1:-1:-1;;;;;2637:91:2;;;;;2703:6;-1:-1:-1;;;;;2637:91:2;-1:-1:-1;;;;;2637:91:2;;;;;2711:4;-1:-1:-1;;;;;2637:91:2;-1:-1:-1;;;;;2637:91:2;;;;2718:9;;2637:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2637:11:2;;-1:-1:-1;;;2637:91:2:i;:::-;1803:932;;;;;;;;;;;;;;:::o;17772:226::-;17863:35;17877:5;17884:3;17889:8;17863:13;:35::i;:::-;17916:46;17937:5;17944:3;17949:8;17916:46;;;;;;;;;;;;:20;:46::i;:::-;17908:83;;;;;-1:-1:-1;;;17908:83:2;;;;;;;;;;;;-1:-1:-1;;;17908:83:2;;;;;;;;;;;;;;3859:339;3925:7;4027:14;;;:5;:14;;;;;:25;;;-1:-1:-1;;;4027:25:2;;-1:-1:-1;;;;;4027:25:2;4009:15;:43;4006:186;;;-1:-1:-1;4108:14:2;;;;:5;:14;;;;;;;;:27;;;:34;4075:23;;:30;:67;4068:74;;4006:186;-1:-1:-1;4180:1:2;4173:8;;15469:362;15577:4;15625:14;;;:5;:14;;;;;;;;:25;;;-1:-1:-1;;;15625:25:2;;-1:-1:-1;;;;;15625:25:2;15613:38;;;:11;:38;;;;;;15730:14;;;;;;;:29;;;;:47;;-1:-1:-1;15763:14:2;;15730:47;:94;;;;-1:-1:-1;15799:14:2;;;;:5;:14;;;;;:25;;;-1:-1:-1;;;15799:25:2;;-1:-1:-1;;;;;15799:25:2;15781:15;:43;15730:94;15723:101;15469:362;-1:-1:-1;;;15469:362:2:o;15837:115::-;15893:4;15916:14;;;:5;:14;;;;;:25;;;-1:-1:-1;;;15916:25:2;;-1:-1:-1;;;;;15916:25:2;:29;;;15837:115::o;9205:1693::-;9298:17;9318:14;;;:5;:14;;;;;;;;9374:15;;;;-1:-1:-1;;;;;;;;9374:15:2;;;9362:28;;:11;:28;;;;;;;-1:-1:-1;;;;;9425:11:2;9454:14;9446:53;;;;;-1:-1:-1;;;9446:53:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9517:20:2;;9509:55;;;;;-1:-1:-1;;;9509:55:2;;;;;;;;;;;;-1:-1:-1;;;9509:55:2;;;;;;;;;;;;;;;9601:17;;;:24;9651:10;;;;-1:-1:-1;;;;;9651:10:2;9674:9;;;;;:32;;;9705:1;9687:15;:19;9674:32;9671:485;;;9763:8;;;;9807:15;;;;-1:-1:-1;;;9763:8:2;;;-1:-1:-1;;;;;9763:8:2;9755:16;;9736:36;;;-1:-1:-1;;;;;9807:15:2;;9836:210;;9892:20;;-1:-1:-1;;;;;9892:15:2;;;:20;;;;;9908:3;;9892:20;;;;9908:3;9892:15;:20;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9892:20:2;9836:210;;;9959:38;9973:10;9985:6;9993:3;9959:13;:38::i;:::-;9951:80;;;;;-1:-1:-1;;;9951:80:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;10059:10;;;:14;;-1:-1:-1;;;;;;10059:14:2;;;10092:53;;;;;;;;-1:-1:-1;;;;;10092:53:2;;;10124:7;;10092:53;;;;;;;;;9671:485;;;10186:13;;;:20;10166:17;10242:58;10264:9;10275:7;10284:15;10242:21;:58::i;:::-;10216:84;;10331:15;10319:9;:27;10313:3;:33;10310:96;;;10380:15;10368:9;:27;10362:33;;10310:96;10431:5;10415:320;10442:3;10438:1;:7;10415:320;;;10466:18;10511:9;10506:1;10488:15;:19;10487:33;;;;;;10466:54;;10534:4;:17;;10552:10;10534:29;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10534:29:2;-1:-1:-1;;;;;10534:42:2;;10585:4;10592:6;10600:4;:13;;10614:10;10600:25;;;;;;;;;;;;;;;;;10534:92;;;-1:-1:-1;;;;;;10534:92:2;;;;;;;-1:-1:-1;;;;;10534:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;10600:25;10534:92;;;;;10600:25;10534:92;;;;5:2:-1;;;;30:1;27;20:12;5:2;10534:92:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10534:92:2;;;;10679:1;10640:4;:17;;10658:10;10640:29;;;;;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;10640:41:2;;;;;-1:-1:-1;;;;;10640:41:2;;;;;;10723:1;10695:4;:13;;10709:10;10695:25;;;;;;;;;;;;;;;;;:29;-1:-1:-1;10447:3:2;;10415:320;;;;10767:15;10755:9;:27;10748:3;:34;10745:147;;;10803:40;;-1:-1:-1;;;;;10803:40:2;;;10827:7;;10803:40;;;;;10857:11;;;:24;;-1:-1:-1;;;;;;10857:24:2;;;10745:147;9205:1693;;;;;;;;;;:::o;22385:476::-;22448:13;22473:17;22481:8;22473:7;:17::i;:::-;;22501:14;22517:24;22545:18;22554:8;22545;:18::i;:::-;22573:17;22605:13;;;:5;:13;;;;;;;;:24;;;-1:-1:-1;;;22605:24:2;;-1:-1:-1;;;;;22605:24:2;22593:37;;:11;:37;;;;;;22605:13;;-1:-1:-1;22500:63:2;-1:-1:-1;22643:14:2;;22640:176;;22674:18;22694:15;22713:42;22730:6;22738:16;22713;:42::i;:::-;22673:82;;;;22776:11;-1:-1:-1;;;;;22776:20:2;;22797:7;22776:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22776:29:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22776:29:2;;;;;;39:16:-1;36:1;17:17;2:54;101:4;22776:29:2;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;22776:29:2;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;22776:29:2;;-1:-1:-1;22769:36:2;;-1:-1:-1;;;;;;;;;22769:36:2;22640:176;22832:13;;;;:5;:13;;;;;;;;;:22;;22825:29;;;;;;;;;;;-1:-1:-1;;22825:29:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22832:22;22825:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22385:476;;;:::o;17158:353::-;17214:7;17233:14;17249:24;17277:18;17286:8;17277;:18::i;:::-;17305:30;17338:13;;;:5;:13;;;;;:26;;17390:30;;17232:63;;-1:-1:-1;17232:63:2;;-1:-1:-1;17338:26:2;;;;17232:63;;17390:30;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17390:30:2;;-1:-1:-1;17438:19:2;17430:52;;;;;-1:-1:-1;;;17430:52:2;;;;;;;;;;;;-1:-1:-1;;;17430:52:2;;;;;;;;;;;;;;;17499:5;17158:353;-1:-1:-1;;;;;17158:353:2:o;6827:658::-;6926:24;;;;:12;:24;;;;;;;;6951:10;6926:36;;;;;;;;;;6918:71;;;;;-1:-1:-1;;;6918:71:2;;;;;;;;;;;;-1:-1:-1;;;6918:71:2;;;;;;;;;;;;;;;6999:14;7016:27;;;:15;:27;;;;;;;;7044:10;7016:39;;;;;;;-1:-1:-1;;;;;7016:51:2;;;;;;;;;;7085:10;7077:44;;;;;-1:-1:-1;;;7077:44:2;;;;;;;;;;;;-1:-1:-1;;;7077:44:2;;;;;;;;;;;;;;;7185:1;7131:27;;;:15;:27;;;;;;;;7159:10;7131:39;;;;;;;;;-1:-1:-1;;;;;7131:51:2;;;;;;;;;;;:55;;;7196:24;;;:12;:24;;;;;:36;;;;;;;;:44;;-1:-1:-1;;7196:44:2;;;7250:205;;7294:27;;:10;;:27;;;;;7314:6;;7294:27;;;;7314:6;7294:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7294:27:2;7250:205;;;7360:45;7374:10;7386;7398:6;7360:13;:45::i;:::-;7352:92;;;;-1:-1:-1;;;7352:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11177:170;11229:14;11245:24;11273:18;11282:8;11273;:18::i;:::-;11228:63;;;;11301:39;11315:6;11323:16;11301:13;:39::i;16982:170::-;17040:7;-1:-1:-1;;;;;17067:20:2;;17059:53;;;;;-1:-1:-1;;;17059:53:2;;;;;;;;;;;;-1:-1:-1;;;17059:53:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17129:16:2;;;;;:8;:16;;;;;;;16982:170::o;11353:370::-;11407:18;11427:15;11455:14;11471:24;11499:18;11508:8;11499;:18::i;:::-;11527:17;11559:13;;;:5;:13;;;;;;;;:24;;;-1:-1:-1;;;11559:24:2;;-1:-1:-1;;;;;11559:24:2;11547:37;;:11;:37;;;;;;11559:13;;-1:-1:-1;11454:63:2;-1:-1:-1;11547:37:2;11594:64;;-1:-1:-1;11642:1:2;;-1:-1:-1;11642:1:2;;-1:-1:-1;11627:20:2;;-1:-1:-1;;11627:20:2;11594:64;11674:42;11691:6;11699:16;11674;:42::i;:::-;11667:49;;;;;;;11353:370;;;;:::o;11808:1744::-;11915:17;11977:14;;;:5;:14;;;;;;;;:25;;;-1:-1:-1;;;11977:25:2;;-1:-1:-1;;;;;11977:25:2;12028:23;;;:11;:23;;;;;;;;;12065:166;;12115:40;12132:10;12152:1;12115:16;:40::i;:::-;12103:52;;12065:166;-1:-1:-1;12251:23:2;12277:14;;;:5;:14;;;;;:27;;:34;;12342:19;;12378:1106;12401:10;12397:1;:14;12378:1106;;;12432:25;12460:19;;12480:1;12460:22;;;;;;;;;;;;;12432:50;;12524:15;12504:17;:35;12496:71;;;;;-1:-1:-1;;;12496:71:2;;;;;;;;;;;;-1:-1:-1;;;12496:71:2;;;;;;;;;;;;;;;12581:19;12603:14;;;:5;:14;;;;;:27;;:46;;12631:17;;12603:46;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12603:46:2;;-1:-1:-1;12686:10:2;12671:25;;12663:63;;;;;-1:-1:-1;;;12663:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;12797:1;12740:14;;;:5;:14;;;;;:27;;:46;;12768:17;;12740:46;;;;;;;;;;;;;;:59;;-1:-1:-1;;;;;;12740:59:2;-1:-1:-1;;;;;12740:59:2;;;;;;;;;;;12852:60;12874:9;12885:7;12894:17;12852:21;:60::i;:::-;12930:14;;;;:5;:14;;;;;:39;;12831:81;;-1:-1:-1;12930:14:2;12831:81;;12930:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12930:39:2;-1:-1:-1;;;;;12930:52:2;;12991:4;12998:11;13011:5;:14;13017:7;13011:14;;;;;;;;;;;:23;;13035:10;13011:35;;;;;;;;;;;;;;;;;12930:117;;;-1:-1:-1;;;;;;12930:117:2;;;;;;;-1:-1:-1;;;;;12930:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;13011:35;12930:117;;;;;13011:35;12930:117;;;;5:2:-1;;;;30:1;27;20:12;5:2;12930:117:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;13114:1:2;13065:14;;;:5;:14;;;;;:39;;13114:1;;-1:-1:-1;13065:14:2;13093:10;;13065:39;;;;;;;;;;;;;;:51;;;;;-1:-1:-1;;;;;13065:51:2;;;;;-1:-1:-1;;;;;13065:51:2;;;;;;13172:1;13134:5;:14;13140:7;13134:14;;;;;;;;;;;:23;;13158:10;13134:35;;;;;;;;;;;;;;;:39;;;;13244:11;-1:-1:-1;;;;;13196:60:2;13216:7;13196:60;13225:17;13196:60;;;;;;;;;;;;;;;;;;-1:-1:-1;13365:71:2;;-1:-1:-1;;;13399:16:2;;:36;;;13395:1;;-1:-1:-1;;;;;13365:71:2;;;-1:-1:-1;;;;;;;;;;;13365:71:2;13395:1;;13365:71;-1:-1:-1;;12413:3:2;;12378:1106;;;-1:-1:-1;13520:10:2;13511:20;;;;:8;:20;;;;;:34;;;;;;;;-1:-1:-1;;;;;11808:1744:2:o;7491:110::-;7554:40;7571:10;7583;7554:16;:40::i;:::-;;7491:110;:::o;6637:184::-;6739:7;6765:27;;;:15;:27;;;;;;;;-1:-1:-1;;;;;6765:37:2;;;;;;;;;;:49;;;;;;;;;;;6637:184::o;20477:97::-;20551:16;;;;;;;;;;;;-1:-1:-1;;;20551:16:2;;;;20477:97;:::o;19289:270::-;-1:-1:-1;;;;;19377:23:2;;19369:60;;;;;-1:-1:-1;;;19369:60:2;;;;;;;;;;;;-1:-1:-1;;;19369:60:2;;;;;;;;;;;;;;;19455:10;19439:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;19439:38:2;;;;;;;;;;;;:50;;-1:-1:-1;;19439:50:2;;;;;;;;;;19504:48;;;;;;;19439:38;;19455:10;19504:48;;;;;;;;;;;19289:270;;:::o;17517:249::-;17629:35;17643:5;17650:3;17655:8;17629:13;:35::i;:::-;17682:48;17703:5;17710:3;17715:8;17725:4;;17682:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;17682:20:2;;-1:-1:-1;;;17682:48:2:i;:::-;17674:85;;;;;-1:-1:-1;;;17674:85:2;;;;;;;;;;;;-1:-1:-1;;;17674:85:2;;;;;;;;;;;;;;;17517:249;;;;;:::o;21658:721::-;21717:13;21742:17;21750:8;21742:7;:17::i;:::-;;21770:14;21786:24;21814:18;21823:8;21814;:18::i;:::-;21769:63;;;;21842:25;21870:5;:13;21876:6;21870:13;;;;;;;;;;;:22;;21842:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21902:15;21926:11;21902:36;;21964:1;21952:2;:9;:13;:41;;;;;21981:2;21984:1;21981:5;;;;;;;;;;;;;-1:-1:-1;;;;;;21981:5:2;-1:-1:-1;;;21981:12:2;21952:41;:69;;;;;22009:2;22012:1;22009:5;;;;;;;;;;;;;-1:-1:-1;;;;;;22009:5:2;-1:-1:-1;;;22009:12:2;21952:69;:97;;;;;22037:2;22040:1;22037:5;;;;;;;;;;;;;-1:-1:-1;;;;;;22037:5:2;-1:-1:-1;;;22037:12:2;21952:97;:125;;;;;22065:2;22068:1;22065:5;;;;;;;;;;;;;-1:-1:-1;;;;;;22065:5:2;-1:-1:-1;;;22065:12:2;21952:125;21948:425;;;22183:11;22231:21;22243:8;22231:11;:21::i;:::-;22145:154;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;-1:-1;;;22145:154:2;;;;;;;;;;;;;;;;;-1:-1:-1;22145:154:2;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;22145:154:2;;;;;;;-1:-1:-1;;;22145:154:2;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22145:154:2;;;22102:211;;;;;;;;21948:425;-1:-1:-1;22351:11:2;-1:-1:-1;22344:18:2;;-1:-1:-1;;22344:18:2;4204:2224;4327:17;4347:14;;;:5;:14;;;;;;;;4392:15;;;;4437:13;;;:20;4493:17;;;:24;4548:15;;;;4347:14;;-1:-1:-1;;;;;4392:15:2;;-1:-1:-1;;;4548:15:2;;-1:-1:-1;;;;;4548:15:2;4643;-1:-1:-1;;4635:52:2;;;;;-1:-1:-1;;;4635:52:2;;;;;;;;;;;;-1:-1:-1;;;4635:52:2;;;;;;;;;;;;;;;4723:9;4705:15;:27;4697:76;;;;-1:-1:-1;;;4697:76:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4784:17;;;27:10:-1;;39:1;23:18;;45:23;;-1:-1;4784:33:2;;;;;;;;;;-1:-1:-1;;;;;;4784:33:2;-1:-1:-1;;;;;4784:33:2;;;;;4922:1;4910:13;;4907:772;;;5036:41;;;-1:-1:-1;;4973:12:2;:14;4963:25;5036:41;;;;;;;-1:-1:-1;;;5036:41:2;;;;;;22:32:-1;26:21;;;22:32;6:49;;5036:41:2;;;;;;;5026:52;;;;;;;4939:21;;5082:9;;;5018:73;;;;5139:41;;;;;;;;;;-1:-1:-1;;;5139:41:2;;;;;;22:32:-1;26:21;;;22:32;6:49;;5139:41:2;;;;;;;5129:52;;;;;5018:73;;;;-1:-1:-1;5105:13:2;;5185:9;;;5121:73;;;;;5105:89;;5220:5;5211;:14;5208:83;;;5267:9;5254:5;5262:1;5254:9;5253:23;;;;;;5245:31;;5208:83;5304:10;5317:4;:13;;5331:5;5317:20;;;;;;;;;;;;;;;;5304:33;;5374:4;:13;;5388:5;5374:20;;;;;;;;;;;;;;;;5351:4;:13;;5365:5;5351:20;;;;;;;;;;;;;;;:43;;;;5431:2;5408:4;:13;;5422:5;5408:20;;;;;;;;;;;;;;;:25;;;;5447:9;5459:4;:17;;5477:5;5459:24;;;;;;;;;;;;;;;;;5509;;-1:-1:-1;;;;;5459:24:2;;;;-1:-1:-1;5509:4:2;;5527:5;;5509:24;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5509:24:2;;;;-1:-1:-1;5550:8:2;;;;5547:122;;5605:2;5578:4;:17;;5596:5;5578:24;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;5578:29:2;;;;;-1:-1:-1;;;;;5578:29:2;;;;;;5652:2;5625:4;:17;;5643:5;5625:24;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;5625:29:2;;;;;-1:-1:-1;;;;;5625:29:2;;;;;;5547:122;4907:772;;;;;;;5719:10;;;;5703:13;5820:27;;;:15;:27;;;;;;;;5848:13;;;;-1:-1:-1;;;;;5848:13:2;;;5820:42;;;;;;;;:54;;;;;;;;;;;:66;;-1:-1:-1;;;;;;;;5878:8:2;;;;5820:66;;;;;;5719:10;;;;5901:250;;5969:5;5956:9;:18;5948:49;;;;;-1:-1:-1;;;5948:49:2;;;;;;;;;;;;-1:-1:-1;;;5948:49:2;;;;;;;;;;;;;;;5901:250;;;6044:63;6062:10;6074;6094:4;6101:5;6044:17;:63::i;:::-;6036:100;;;;;-1:-1:-1;;;6036:100:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6176:53:2;;;;;;;;-1:-1:-1;;;;;6176:53:2;;;6193:7;;6176:53;;;;;;;;;-1:-1:-1;;;;;6309:19:2;;;;;;:8;:19;;;;;;:22;;;;;;6346:67;-1:-1:-1;;;6378:16:2;;:34;;;6309:19;;-1:-1:-1;;;;;;;;;;;6346:67:2;6309:19;;6346:67;4204:2224;;;;;;;:::o;3766:87::-;3821:25;3826:10;3838:7;3821:4;:25::i;:::-;3766:87;:::o;19711:280::-;19795:4;-1:-1:-1;;;;;19818:20:2;;19810:53;;;;;-1:-1:-1;;;19810:53:2;;;;;;;;;;;;-1:-1:-1;;;19810:53:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;19881:23:2;;19873:60;;;;;-1:-1:-1;;;19873:60:2;;;;;;;;;;;;-1:-1:-1;;;19873:60:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19950:23:2;;;;;;;:15;:23;;;;;;;;:34;;;;;;;;;;;;19711:280;;;;;:::o;6480:151::-;6533:7;6559:17;;;:11;:17;;;;;;;6480:151::o;9029:112::-;9091:43;9113:7;9122:1;-1:-1:-1;;9091:21:2;:43::i;13558:1285::-;13642:18;13663:14;;;:5;:14;;;;;;;;:25;;;-1:-1:-1;;;13663:25:2;;-1:-1:-1;;;;;13663:25:2;13718:23;;;:11;:23;;;;;;;;13751:158;;13797:40;13814:10;13834:1;13797:16;:40::i;:::-;13785:52;;13751:158;13946:14;;;;:5;:14;;;;;:27;;:34;13926:54;;13918:90;;;;;-1:-1:-1;;;13918:90:2;;;;;;;;;;;;-1:-1:-1;;;13918:90:2;;;;;;;;;;;;;;;14018:19;14040:14;;;:5;:14;;;;;:27;;:46;;14068:17;;14040:46;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14040:46:2;;-1:-1:-1;14119:10:2;14104:25;;14096:68;;;;;-1:-1:-1;;;14096:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;14231:1;14174:14;;;:5;:14;;;;;:27;;:46;;14202:17;;14174:46;;;;;;;;;;;;;;:59;;-1:-1:-1;;;;;;14174:59:2;-1:-1:-1;;;;;14174:59:2;;;;;;;;;;;14264:60;14286:9;14297:7;14306:17;14264:21;:60::i;:::-;14334:14;;;;:5;:14;;;;;:39;;14243:81;;-1:-1:-1;14334:14:2;14243:81;;14334:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14334:39:2;-1:-1:-1;;;;;14334:52:2;;14395:4;14402:11;14415:5;:14;14421:7;14415:14;;;;;;;;;;;:23;;14439:10;14415:35;;;;;;;;;;;;;;;;;14334:117;;;-1:-1:-1;;;;;;14334:117:2;;;;;;;-1:-1:-1;;;;;14334:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;14415:35;14334:117;;;;;14415:35;14334:117;;;;5:2:-1;;;;30:1;27;20:12;5:2;14334:117:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;14510:1:2;14461:14;;;:5;:14;;;;;:39;;14510:1;;-1:-1:-1;14461:14:2;14489:10;;14461:39;;;;;;;;;;;;;;:51;;;;;-1:-1:-1;;;;;14461:51:2;;;;;-1:-1:-1;;;;;14461:51:2;;;;;;14560:1;14522:5;:14;14528:7;14522:14;;;;;;;;;;;:23;;14546:10;14522:35;;;;;;;;;;;;;;;:39;;;;14624:11;-1:-1:-1;;;;;14576:60:2;14596:7;14576:60;14605:17;14576:60;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14718:21:2;;;;;;:8;:21;;;;;;:24;;-1:-1:-1;;14718:24:2;;;14757:71;-1:-1:-1;;;14791:16:2;;:36;;;14718:21;-1:-1:-1;;;;;;;;;;;14757:71:2;14718:21;;14757:71;13558:1285;;;;;;:::o;10904:189::-;-1:-1:-1;;;11023:17:2;;;-1:-1:-1;;;;;11050:36:2;;;;10904:189::o;18139:790::-;-1:-1:-1;;;;;18235:17:2;;18227:50;;;;;-1:-1:-1;;;18227:50:2;;;;;;;;;;;;-1:-1:-1;;;18227:50:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;18295:19:2;;18287:52;;;;;-1:-1:-1;;;18287:52:2;;;;;;;;;;;;-1:-1:-1;;;18287:52:2;;;;;;;;;;;;;;;18349:16;18368:19;;;:9;:19;;;;;;-1:-1:-1;;;;;18368:19:2;;;;18405;;:10;:19;;:50;;-1:-1:-1;;;;;;18428:22:2;;;;;;;:15;:22;;;;;;;;:27;;;;;;;;;;;;18405:50;:76;;;-1:-1:-1;18459:10:2;-1:-1:-1;;;;;18459:22:2;;;18405:76;18397:101;;;;;-1:-1:-1;;;18397:101:2;;;;;;;;;;;;-1:-1:-1;;;18397:101:2;;;;;;;;;;;;;;;18509:14;18525:24;18553:18;18562:8;18553;:18::i;:::-;18508:63;;;;18637:5;-1:-1:-1;;;;;18589:53:2;:5;:13;18595:6;18589:13;;;;;;;;;;;:26;;18616:16;18589:44;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18589:44:2;:53;18581:88;;;;;-1:-1:-1;;;18581:88:2;;;;;;;;;;;;-1:-1:-1;;;18581:88:2;;;;;;;;;;;;;;;18679:13;;;;:5;:13;;;;;:26;;:44;;18726:3;;18679:26;18706:16;;18679:44;;;;;;;;;;;;;;;:50;;-1:-1:-1;;;;;;18679:50:2;-1:-1:-1;;;;;18679:50:2;;;;;;18743:22;;;18739:85;;18811:1;18781:19;;;:9;:19;;;;;:32;;-1:-1:-1;;;;;;18781:32:2;;;18739:85;-1:-1:-1;;;;;18833:15:2;;;;;;;:8;:15;;;;;;:18;;-1:-1:-1;;18833:18:2;;;18861:13;;;;;;;;;:16;;18833:18;18861:16;;;18892:30;;18913:8;;18861:13;18833:15;-1:-1:-1;;;;;;;;;;;18892:30:2;;18139:790;;;;;;:::o;15126:336::-;15218:18;15315:14;;;:5;:14;;;;;;;;:25;;;-1:-1:-1;;;15315:25:2;;-1:-1:-1;;;;;15315:25:2;15303:38;;:11;:38;;;;;;15218:18;;;;15281:89;;15315:14;15352:17;15281:21;:89::i;:::-;15388:14;;;;:5;:14;;;;;:34;;15265:105;;-1:-1:-1;15388:14:2;15265:105;;15388:34;;;;;;;;;;;;;;;;;;15424:14;;;15388:34;15424:14;;;;;;;;:23;:30;;-1:-1:-1;;;;;15388:34:2;;;;15448:5;;15424:30;;;;;;;;;;;;;;15380:75;;;;;15126:336;;;;;:::o;16324:469::-;16500:9;16496:291;16519:12;16515:1;:16;16496:291;;;16551:20;16574:13;16588:1;16574:16;;;;;;;;;;;;;;-1:-1:-1;;;;;16574:24:2;;16599:9;16609:1;16599:12;;;;;;;;;;;;;;16574:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16574:38:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16574:38:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16574:38:2;;-1:-1:-1;;;;;;16634:23:2;;;;;;;16626:64;;;;;-1:-1:-1;;;16626:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;16704:13;16718:1;16704:16;;;;;;;;;;;;;;-1:-1:-1;;;;;16704:29:2;;16734:12;16756:4;16763:9;16773:1;16763:12;;;;;;;;;;;;;;16704:72;;;;;;;;;;;;;-1:-1:-1;;;;;16704:72:2;-1:-1:-1;;;;;16704:72:2;;;;;;-1:-1:-1;;;;;16704:72:2;-1:-1:-1;;;;;16704:72:2;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16704:72:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;16533:3:2;;;;;-1:-1:-1;16496:291:2;;-1:-1:-1;;16496:291:2;2741:1018;3064:14;3081:12;;;;;;;;;3119:296;;;;;;;;;;;;;;;;;;3187:13;;-1:-1:-1;;;;;3119:296:2;;;;;;;3221:10;;-1:-1:-1;;;;;3119:296:2;;;;;3246:13;;;;3119:296;;;;;;3281:10;;;;-1:-1:-1;;;;;3119:296:2;;;;;;;3314:10;;;;3119:296;;;;;3339:16;;;;;;;;;;3119:296;;;;3369:13;;;;3119:296;;;;;;;;;;;3103:13;;;;;;;;:312;;;;3081:12;;3119:296;3103:13;;:312;;:13;;:312;;;:::i;:::-;-1:-1:-1;3103:312:2;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3103:312:2;;;;;;;;;;;;;-1:-1:-1;;;;;3103:312:2;-1:-1:-1;;;3103:312:2;-1:-1:-1;;;;;3103:312:2;;;-1:-1:-1;;;;;;3103:312:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3103:312:2;;;-1:-1:-1;;;3103:312:2;;;;-1:-1:-1;;;;;;3103:312:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3103:312:2;;;;;;;;;-1:-1:-1;;;;;;3103:312:2;-1:-1:-1;;;;;3103:312:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3673:10:2;;-1:-1:-1;3684:1:2;;-1:-1:-1;3673:13:2;;;;-1:-1:-1;;;;;3430:322:2;3504:10;3515:1;3504:13;;;;-1:-1:-1;;;;;3430:322:2;;3465:6;3485:5;3538:7;3546:1;3538:10;;;;3563;3574:1;3563:13;;;;3598:7;3606:1;3598:10;;;;3623:9;3646:13;3708:7;3716:1;3708:10;;;;3733:9;3430:322;;;;;;;;;;;;-1:-1:-1;;;;;3430:322:2;-1:-1:-1;;;;;3430:322:2;;;;;;-1:-1:-1;;;;;3430:322:2;-1:-1:-1;;;;;3430:322:2;;;;;;-1:-1:-1;;;;;3430:322:2;-1:-1:-1;;;;;3430:322:2;;;;;;;;;;;;-1:-1:-1;;;;;3430:322:2;-1:-1:-1;;;;;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;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;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;3430:322:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2741:1018;;;;;;;:::o;20047:294::-;20156:4;20177:15;20188:3;20177:10;:15::i;:::-;20172:58;;-1:-1:-1;20215:4:2;20208:11;;20172:58;20247:67;;-1:-1:-1;;;20247:67:2;;;-1:-1:-1;;;;;20247:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20318:15;;20247:41;;;;20031:10;;20289:5;;;;20303:3;;20308:5;;20247:67;;;;;;;;;;-1:-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;20247:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20247:67:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20247:67:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20247:67:2;-1:-1:-1;;;;;;20247:86:2;;;-1:-1:-1;20047:294:2;;;;;;;:::o;23480:750::-;23669:70;;;-1:-1:-1;;;;;23669:70:2;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23669:70:2;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23900:11:2;;23617:16;;23669:70;23617:16;;;;;23873:5;23865;23860:3;23856:15;23851:67;23948:4;23942:11;23989:14;23986:1;23981:3;23966:38;24024:14;24051:33;;;;24102:4;24097:76;;;;24211:1;24196:16;;24017:197;;24051:33;24075:7;24060:22;;24051:33;;24097:76;24164:3;24158:10;24151:18;24141:7;24134:15;24131:39;24124:47;24109:62;;24017:197;;23822:402;;;;;;;;:::o;14849:271::-;14965:18;15083:14;;;:5;:14;;;;;;;;:23;;;:30;15021:36;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;15021:36:2;;;;;;;15011:47;;;;;;;;;;15003:76;;15083:30;15002:111;;;;;;14849:271;-1:-1:-1;;;;14849:271:2:o;7607:1416::-;7688:7;7790:15;7777:10;:28;7769:81;;;;-1:-1:-1;;;7769:81:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8017:22;;;:58;;;-1:-1:-1;;;8017:58:2;;;;7938:15;:28;;;;7922:13;;-1:-1:-1;;;;;8017:22:2;;:56;;:58;;;;;;;;;;;:22;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;8017:58:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8017:58:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8017:58:2;;-1:-1:-1;8085:18:2;8017:58;8116:4;8108:12;;8017:58;8107:47;;;;;8085:71;;8187:1;8174:10;:14;8166:68;;;;-1:-1:-1;;;8166:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8244:19;8321:23;;;:11;:23;;;;;;8266:12;:25;;;;-1:-1:-1;;;;;8452:22:2;;;;;;:61;;-1:-1:-1;8479:13:2;;;;:33;;;8509:3;8496:10;:16;8479:33;8452:100;;;;-1:-1:-1;8518:24:2;;;;:12;:24;;;;;;;;-1:-1:-1;;;;;8518:34:2;;;;;;;;;;;;8517:35;8452:100;8448:172;;;8568:24;;;;:12;:24;;;;;;;;-1:-1:-1;;;;;8568:34:2;;;;;;;;;:41;;-1:-1:-1;;8568:41:2;8605:4;8568:41;;;8448:172;8634:13;;8630:80;;8670:9;-1:-1:-1;8663:16:2;;-1:-1:-1;;;;8663:16:2;8630:80;8736:3;8723:10;:16;8720:179;;;-1:-1:-1;8767:22:2;;8720:179;;;8878:3;-1:-1:-1;;8860:14:2;;8859:22;8885:1;8858:28;8842:12;:45;8832:56;8820:68;;8720:179;8908:23;;;;:11;:23;;;;;;;;;:35;;;8958:32;;;;;;;8920:10;;8958:32;;;;;;;;;9007:9;7607:1416;-1:-1:-1;;;;;;;7607:1416:2:o;20580:564::-;20635:13;20660:17;20680:15;20693:1;20680:12;:15::i;:::-;20660:35;;20705:14;20737:9;20732:2;:14;20722:25;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;20722:25:2;87:34:-1;135:17;;-1:-1;20722:25:2;-1:-1:-1;20705:42:2;-1:-1:-1;20785:1:2;20773:13;;;20796:316;20821:2;20817:1;:6;20796:316;;;20844:6;20887:1;20882:2;:6;20879:1;:10;20875:1;:15;20869:1;20864:27;;;;;;20853:40;;20844:49;;20907:7;20933:2;20928:1;20922:8;;:13;;;;;;;;20917:19;;20907:29;;20950:7;20987:2;20981:9;;20976:2;:14;20971:1;20965:8;;:25;20960:31;;20950:41;;21006:13;21027:5;21025:1;:7;21022:1;:11;21006:27;;21058:8;21063:2;21058:4;:8::i;:::-;21047:1;21049:5;21047:8;;;;;;;;;;;:19;-1:-1:-1;;;;;21047:19:2;;;;;;;;;21093:8;21098:2;21093:4;:8::i;:::-;21080:1;21082:5;21088:1;21082:7;21080:10;;;;;;;;;;;:21;-1:-1:-1;;;;;21080:21:2;;;;;;;;-1:-1:-1;;20825:3:2;;;;;-1:-1:-1;20796:316:2;;-1:-1:-1;;20796:316:2;;-1:-1:-1;21135:1:2;;20580:564;-1:-1:-1;;;;20580:564:2:o;24236:794::-;24451:88;;;-1:-1:-1;;;;;24451:88:2;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24451:88:2;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;24700:11:2;;24399:16;;24451:88;24399:16;;;;;24673:5;24665;24660:3;24656:15;24651:67;24748:4;24742:11;24789:14;24786:1;24781:3;24766:38;24824:14;24851:33;;;;24902:4;24897:76;;;;25011:1;24996:16;;24817:197;;24851:33;24875:7;24860:22;;24851:33;;24897:76;24964:3;24958:10;24951:18;24941:7;24934:15;24931:39;24924:47;24909:62;;24817:197;;24622:402;;;;;;;;;:::o;23084:390::-;23141:4;23179:66;23380:17;;23424:15;;;;;:42;;-1:-1:-1;23443:23:2;;;23416:51;-1:-1:-1;;23084:390:2:o;21150:336::-;21206:7;;;21256:198;21280:2;21276:1;:6;21256:198;;;21303:6;21346:1;21341:2;:6;21338:1;:10;21334:1;:15;21328:1;21323:27;;;;;;21312:40;;;-1:-1:-1;;;;;;;21370:6:2;;;21366:50;;21396:5;;;21366:50;-1:-1:-1;21442:1:2;21429:14;;;;;21284:3;;21256:198;;;-1:-1:-1;21470:9:2;21150:336;-1:-1:-1;;21150:336:2:o;21492:160::-;21537:6;21570:2;21559:8;;;;:13;21555:90;;;21592:1;21586:8;;21597:4;21586:15;21581:21;;21574:28;;;;21555:90;21635:1;21629:8;;21640:4;21629:15;21624:21;;21617:28;;;;92:24941;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;92:24941:2;;;-1:-1:-1;;92:24941:2:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;92:24941:2;-1:-1:-1;;;;;92:24941:2;;;;;;;;;;;-1:-1:-1;92:24941:2;;;;;;;-1:-1:-1;92:24941:2;;;-1:-1:-1;92:24941:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92:24941:2;;;-1:-1:-1;92:24941:2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;92:24941:2;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://839af8f0bfb8fed8d936c4decce1256304f95b6701cd67303694a3a593850cb4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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