ETH Price: $3,461.60 (+0.20%)
Gas: 5 Gwei

Token

Mystery Market (MYSTERY)
 

Overview

Max Total Supply

0 MYSTERY

Holders

4

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vengist.eth
Balance
1 MYSTERY
0xd26a3F686D43f2A62BA9eaE2ff77e9f516d945B9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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 : 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 2 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);
}

File 3 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 }
        }
    }

}

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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.