ETH Price: $2,325.73 (-6.53%)

Doomsday: Settlers of the Wasteland (SETTLEMENT)
 

Overview

TokenID

4

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
DoomsdaySettlersV3

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : DoomsdaySettlersV3.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.21;

import "./interfaces/IERC721TokenReceiver.sol";
import "./interfaces/IDoomsdaySettlersDarkAge.sol";
import "./interfaces/IDoomsdaySettlersMetadata.sol";
import "./interfaces/IDoomsdaySettlersBlacklist.sol";

contract DoomsdaySettlersV3 {

    struct Settlement{
        uint32 settleBlock;
        uint24 supplyAtMint;
        uint16 age;
        uint8 settlementType;
        uint80 relics;
        uint80 supplies;
    }

    uint80 constant CREATOR_PERCENT = 15;
    uint80 constant DESTRUCTION_FEE = 0.01 ether;
    uint80 constant DAMAGE_FEE      = 0.008 ether;
    uint80 constant REINFORCE_PERCENT_WINNER  = 85;
    uint80 constant REINFORCE_PERCENT_CREATOR = 15;
    uint256 constant BLOCK_TIME = 12 seconds;
    uint256 constant DISASTER_BLOCK_INTERVAL = 75;

    uint256 immutable BASE_DIFFICULTY;
    uint256 immutable DIFFICULTY_RAMP;
    uint256 immutable DIFFICULTY_COOLDOWN;
    uint256 immutable DIFFICULTY_COOLDOWN_SLOPE;
    address immutable DARK_AGE;
    uint256 immutable COLLAPSE_INITIAL;
    uint256 immutable COLLAPSE_RAMP;
    uint256 immutable COLLAPSE_MIN;



    uint16 age = 3;
    uint32 firstSettlement;

    uint32 abandoned;


    bool itIsTheDawnOfANewAge;

    address public owner;
    address creator;
    address confirmer;
    uint80 supplies;
    uint80 relics;

    uint80 mintFee;
    uint80 creatorEarnings;
    bytes32[] hashes;

    mapping( uint32 => Settlement) public settlements;

    event Settle(uint32 _tokenId, bytes32 _hash, address _settler, uint24 _newSupply, uint80 _newMintFee, uint32 _collapseBlock, uint8 _settlementType, address indexed _data, uint32 _blockNumber);
    event Abandon(uint32 indexed _tokenId, bytes32 _hash, uint80 _growth, uint24 _supplyAtMint, uint32 _newAbandoned, uint80 _newMintFee, uint80 _eth, uint32 _settled, bool _itIsTheDawnOfANewAge, uint32 _blockNumber);
    event Reinforce(uint32 indexed _tokenId, uint8 _type);
    event Disaster(uint32 indexed _tokenId, uint8 _type, bool _destroyed, bool _darkAgeOver);
    event Fund(uint amount);


    constructor(
        address _darkAge,
        uint256 _BASE_DIFFICULTY,
        uint256 _DIFFICULTY_RAMP,
        uint256 _DIFFICULTY_COOLDOWN,
        uint256 _DIFFICULTY_COOLDOWN_SLOPE,
        uint256 _COLLAPSE_INITIAL,
        uint256 _COLLAPSE_RAMP,
        uint256 _COLLAPSE_MIN
    ) payable {

        BASE_DIFFICULTY     = _BASE_DIFFICULTY;
        DIFFICULTY_RAMP     = _DIFFICULTY_RAMP;
        DIFFICULTY_COOLDOWN = _DIFFICULTY_COOLDOWN;
        DIFFICULTY_COOLDOWN_SLOPE = _DIFFICULTY_COOLDOWN_SLOPE;
        COLLAPSE_INITIAL    = _COLLAPSE_INITIAL;
        COLLAPSE_RAMP       = _COLLAPSE_RAMP;
        COLLAPSE_MIN        = _COLLAPSE_MIN;

        DARK_AGE = _darkAge;

        require(msg.value == DESTRUCTION_FEE,"destruction");

        // ERC165 stuff
        supportsInterface[0x80ac58cd] = true; //ERC721
        supportsInterface[0x5b5e139f] = true; //ERC721Metadata
        supportsInterface[0x01ffc9a7] = true; //ERC165

        owner = msg.sender;
        creator = msg.sender;

        bytes32 _hash = blockhash(block.number - 1);
        uint256 _settlementType = settlementType(_hash,0);

        _mint(1,msg.sender,_hash);

        settlements[1] = Settlement(uint32(block.number),0,age,uint8(_settlementType), 0,0);

        mintFee += uint80((uint88(2363029719748390562045450) >> _settlementType * 9)%uint88(512))  * uint80(0.000002 ether);
        firstSettlement = 1;
    }

    receive() external payable{
        require(address(this).balance < type(uint80).max,"balance overflow");
        relics += uint80(msg.value);
        emit Fund(msg.value);
    }


    function _settle(uint32 tokenId, bytes32 _hash, uint32 index, uint supply, uint32 collapseBlock, address data) internal returns(uint cost){

        cost = uint256(mintFee) + DESTRUCTION_FEE;
        uint80 creatorFee = uint80(cost * CREATOR_PERCENT / 100);
        creatorEarnings += creatorFee;
        cost += creatorFee;

        bytes32 hash = keccak256(abi.encodePacked(
                _hash,
                index
            ));

        uint8 _settlementType = uint8(settlementType(hash,supply));

        hash = keccak256(abi.encodePacked(hash,block.prevrandao));

        settlements[tokenId] = Settlement( uint32(block.number), uint24(supply), age, _settlementType, 0, 0);

        relics += mintFee/2;

        mintFee +=    uint80((uint88(2363029719748390562045450) >> _settlementType * 9)%uint88(512))  * uint80(0.000002 ether);

        _mint(tokenId,msg.sender,hash);

        emit Settle(tokenId, hash, msg.sender, uint24(supply + 1), mintFee, collapseBlock, _settlementType,  data, uint32(block.number));

        return cost;

    }

    function settle(uint256 location, uint8 count, address data) external payable {
        require(!isDarkAge(),"dark age");
        require(count != 0,"count min");
        require(count <= 20,"count max");

        unchecked{
            require(address(this).balance < type(uint80).max,"balance overflow");

            uint32 tokenId = uint32(hashes.length + 1);

            if(itIsTheDawnOfANewAge){
                ++age;
                firstSettlement = tokenId;
                itIsTheDawnOfANewAge = false;
            }

    //        uint256 supply = (hashes.length - destroyed.length - abandoned);
            uint256 supply = (hashes.length - abandoned);
            uint256 difficulty = BASE_DIFFICULTY - (DIFFICULTY_RAMP * supply);
            uint256 lastSettleBlock = settlements[uint32(hashes.length )].settleBlock;

            require(block.number > lastSettleBlock,"lastSettleBlock");
            uint256 blockDif = (block.number - lastSettleBlock);

            if(blockDif < DIFFICULTY_COOLDOWN){
                difficulty /= DIFFICULTY_COOLDOWN_SLOPE * (DIFFICULTY_COOLDOWN - blockDif);
            }

            bytes32 hash = keccak256(abi.encodePacked(
                    msg.sender,
                    hashes[hashes.length - 1],
                    location
                ));

            require(uint256(hash) < difficulty,"difficulty");

            uint32 collapseBlock;
            if((supply + count) * COLLAPSE_RAMP <  COLLAPSE_INITIAL - COLLAPSE_MIN){
                collapseBlock = uint32(block.number + (COLLAPSE_INITIAL - (supply + count) * COLLAPSE_RAMP) / BLOCK_TIME);
            } else{
                collapseBlock = uint32(block.number + COLLAPSE_MIN / BLOCK_TIME);
            }

            uint256 cost;
            for(uint32 i = 0; i < uint32(count); ++i){
                cost += _settle(tokenId + i, hash,i,supply + i,collapseBlock,data);
            }

            require(msg.value >= cost,"cost");
            require(gasleft() > 10000,"gas");
            if(msg.value > cost){
                payable(msg.sender).transfer(msg.value - cost);
            }
        }
    }

    function abandon(uint32[] calldata _tokenIds, uint32 _data) external {
        unchecked{
            require(_tokenIds.length != 0,"tokenIds");
            uint256 total;
            for(uint256 i = 0; i < _tokenIds.length; ++i){
                total += _abandon(_tokenIds[i],_data);
            }
            payable(msg.sender).transfer(total);
        }
    }

    function confirmDisaster(uint32 _tokenId, uint32 _data) external {
        require(isDarkAge(),"dark age");
        require(_isValidToken(_tokenId),"invalid");
        uint256 eliminationWindow = (block.number % DISASTER_BLOCK_INTERVAL);


        if(eliminationWindow < 20){
            require(msg.sender == ownerOf(_tokenId),"owner");
        }else if(eliminationWindow < 40){
            require(msg.sender == ownerOf(_tokenId)
                || msg.sender == confirmer
            ,"sender");
        }else if(eliminationWindow < 60){
            require(balanceOf[msg.sender] != 0,"balance");
        }

        uint8 _type;
        bool _destroyed;

        uint minted = hashes.length;
//        uint supply = minted - destroyed.length - abandoned;
        uint supply = minted - abandoned;

        unchecked{
            (_type, _destroyed) =
            IDoomsdaySettlersDarkAge(DARK_AGE).disaster(_tokenId, supply);
        }

        bool darkAgeOver = false;
        uint80 disaster_fee;

        if(_destroyed){
            unchecked{
                uint80 tokenFee = uint80((uint88(2363029719748390562045450) >> settlements[_tokenId].settlementType * 9)%uint88(512))  * uint80(0.000002 ether);
                uint80 growth;
                if(_tokenId >= firstSettlement){
                    growth = uint80(minted - _tokenId);
                }else{
                    growth = uint80(minted - firstSettlement) + 1;
                }
                uint80 _relics = growth * tokenFee;

                relics += _relics/2 +
                settlements[_tokenId].relics +
                settlements[_tokenId].supplies +
                IDoomsdaySettlersDarkAge(DARK_AGE).getUnusedFees(_tokenId) * DAMAGE_FEE;

    //            destroyed.push(_tokenId);
                ++abandoned;

                _burn(_tokenId);
                --supply;

                if(supply == 1){
                    _processWinner(_data);
                    darkAgeOver = true;
                }
            }

            disaster_fee = DESTRUCTION_FEE;
        }else{
            disaster_fee = DAMAGE_FEE;
        }

        emit Disaster(_tokenId,_type, _destroyed, darkAgeOver);
        payable(msg.sender).transfer(disaster_fee);
    }

    function reinforce(uint32 _tokenId, bool[4] memory _resources) external payable{
        require(msg.sender == ownerOf(_tokenId),"ownerOf");
        unchecked{
            require(address(this).balance < type(uint80).max,"balance overflow");
            uint80 cost = IDoomsdaySettlersDarkAge(DARK_AGE).reinforce(
                _tokenId,
                hashOf(_tokenId),
                _resources,
                isDarkAge()
            );
            uint80 total;
            for(uint256 i = 0; i < 4; ++i){
                if(_resources[i]){
                    total += DAMAGE_FEE;
                    emit Reinforce(_tokenId,uint8(i));
                }
            }
            require(total != 0,"empty");

            cost *= mintFee / uint80(4);
            total += cost;

            require(total <= msg.value,"msg.value");

            creatorEarnings += cost * REINFORCE_PERCENT_CREATOR / 100;
            supplies        += cost * REINFORCE_PERCENT_WINNER  / 100;

            require(gasleft() > 10000,"gas");
            if(msg.value > total){
                payable(msg.sender).transfer(msg.value - total);
            }
        }
    }

    function miningState() external view returns(
        bytes32 _lastHash,
        uint32 _settled,
        uint32 _abandoned,
        uint32 _lastSettleBlock,
        uint32 _collapseBlock,
        uint80 _mintFee,
        uint256 _blockNumber
    ){
        unchecked{

            uint256 collapseBlock = settlements[uint32(hashes.length )].settleBlock;
            uint32 collapseSupply = settlements[uint32(hashes.length)].supplyAtMint + 1;

            if(collapseSupply * COLLAPSE_RAMP <  COLLAPSE_INITIAL - COLLAPSE_MIN){
                collapseBlock += ( COLLAPSE_INITIAL - collapseSupply * COLLAPSE_RAMP ) / BLOCK_TIME;
            } else{
                collapseBlock +=  COLLAPSE_MIN / BLOCK_TIME;
            }
            return (
            hashes[hashes.length - 1],
            uint32(hashes.length),
    //        uint32(destroyed.length) + abandoned,
            abandoned,
            settlements[uint32(hashes.length)].settleBlock,
            uint32(collapseBlock),
            mintFee,
            block.number
            );
        }

    }

    function currentState() external view returns(
        bool _itIsTheDawnOfANewAge,
        uint32 _firstSettlement,
        uint16 _age,
        uint80 _creatorEarnings,
        uint80 _relics,
        uint80 _supplies,
        address _creator,
        uint256 _blockNumber
    ){
        return (
        itIsTheDawnOfANewAge,
        firstSettlement,
        age,
        creatorEarnings,
        relics,
        supplies,
        creator,
        block.number
        );
    }


    function settlementType(bytes32 hash, uint256 _supplyAtMint) private pure returns(uint256){
        unchecked{
            uint256 settlementTypeMax = _supplyAtMint / 450 + 2 ;
            if(settlementTypeMax > 8) settlementTypeMax = 8;
            return (uint256(hash)%100)**2 * ( settlementTypeMax + 1 ) / 1_00_00;
        }
    }

    function isDarkAge() public view returns(bool){
        unchecked{
            uint minted = hashes.length;
    //        uint256 supply = (minted - destroyed.length - abandoned);
            uint256 supply = (minted - abandoned);
            uint256 collapseBlock = settlements[uint32(minted)].settleBlock;
            uint32 collapseSupply = settlements[uint32(minted)].supplyAtMint + 1;

            if(collapseSupply * COLLAPSE_RAMP <  COLLAPSE_INITIAL - COLLAPSE_MIN){
                collapseBlock += ( COLLAPSE_INITIAL - collapseSupply * COLLAPSE_RAMP ) / BLOCK_TIME;
            } else{
                collapseBlock +=  COLLAPSE_MIN / BLOCK_TIME;
            }
            return supply > 1 && (block.number > collapseBlock );
        }
    }


    function hashOf(uint32 _tokenId) public view returns(bytes32){
        require(_isValidToken(_tokenId),"invalid");
        unchecked{
            return hashes[_tokenId - 1];
        }
    }


    function _processWinner(uint32 _winner) private{
        require(_isValidToken(_winner),"invalid");
        unchecked{
            settlements[_winner].relics     += relics;
            settlements[_winner].supplies   += supplies;

            uint80 tokenFee = uint80((uint88(2363029719748390562045450) >> settlements[_winner].settlementType * 9)%uint88(512))  * uint80(0.000002 ether);
            uint80 growth;
            if(_winner > firstSettlement){
                growth = uint80(hashes.length) - uint80(_winner);
            }else{
                growth = (uint80(hashes.length) - uint80(firstSettlement)) + 1;
            }
            uint80 _relics = growth * tokenFee;
            settlements[_winner].relics += _relics / 2;
            relics = 0;
            supplies = 0;
            mintFee = tokenFee;
            itIsTheDawnOfANewAge = true;
        }
    }

    function _abandon(uint32 _tokenId, uint32 _data) private returns(uint256){
        unchecked{
            require(msg.sender == ownerOf(_tokenId),"ownerOf");
            bytes32 hash = hashes[_tokenId - 1];
            uint80 growth;
            if(_tokenId >= firstSettlement){
                growth = uint80(hashes.length - _tokenId);
            }else{
                growth = uint80(hashes.length) - uint80(firstSettlement) + 1;
            }
            uint80 _relics;
            if(!itIsTheDawnOfANewAge){
                _relics = growth * uint80((uint88(2363029719748390562045450) >> settlements[_tokenId].settlementType * 9)%uint88(512))  * uint80(0.000002 ether);
            }

            bool _isDarkAge = isDarkAge();
            if(_isDarkAge){
                require(!IDoomsdaySettlersDarkAge(DARK_AGE).checkVulnerable(_tokenId),"vulnerable");
                _relics /= 2;
                uint __abandoned;
                uint __settled;

                if(age > 3){
                    ++__abandoned;
                    ++__settled;
                }

    //            __abandoned += uint80(destroyed.length + abandoned) - (uint80(firstSettlement) - 1);
                __abandoned += uint(abandoned) - (uint(firstSettlement) - 1);
                __settled   += hashes.length - (uint(firstSettlement) - 1);

    //            uint80 spoils = uint80 ( uint(relics) / (hashes.length - destroyed.length - uint(abandoned))
                uint80 spoils = uint80 ( uint(relics) / (hashes.length - uint(abandoned))
                            * (10_000_000_000 + ( 30_000_000_000 * __abandoned / __settled  ))  / 40_000_000_000 );



                _relics += spoils;
                relics -= spoils;
            }else if(!itIsTheDawnOfANewAge){
                relics -= _relics / 2;
                mintFee -= uint80((uint88(2363029719748390562045450) >> settlements[_tokenId].settlementType * 9)%uint88(512))  * uint80(0.000002 ether);
            }

            ++abandoned;
            _relics +=
                DESTRUCTION_FEE + IDoomsdaySettlersDarkAge(DARK_AGE).getUnusedFees(_tokenId) * DAMAGE_FEE
                + settlements[_tokenId].relics
                + settlements[_tokenId].supplies;

            _burn(_tokenId);
            if(_isDarkAge){
    //            if(hashes.length - destroyed.length - abandoned == 1){
                if(hashes.length - abandoned == 1){
                    _processWinner(_data);
                }
            }
            emit Abandon(
                _tokenId,
                hash,
                growth,
                settlements[_tokenId].supplyAtMint,
    //            uint32(destroyed.length) + abandoned,
                abandoned,
                mintFee,
                _relics,
                uint32(hashes.length),
                itIsTheDawnOfANewAge,
                uint32(block.number)
            );
            return _relics;
        }
    }



    //////===721 Standard
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    //////===721 Implementation

    mapping(address => uint256) public balanceOf;
    mapping (uint256 => address) internal allowance;
    mapping (address => mapping (address => bool)) public isApprovedForAll;

    mapping(uint256 => address) owners;

    //    METADATA VARS
    string constant public name = "Doomsday: Settlers of the Wasteland";
    string constant public symbol = "SETTLEMENT";

    address private __metadata;
    function _mint(uint256 _tokenId,address _to, bytes32 _hash) private{
        unchecked{
            owners[_tokenId] = msg.sender;
            ++balanceOf[_to];
            hashes.push(_hash);
            emit Transfer(address(0),_to,_tokenId);
        }
    }
    function _burn(uint256 _tokenId) private{
        unchecked{
            address _owner = owners[_tokenId];
            --balanceOf[ _owner ];
            delete owners[_tokenId];
            emit Transfer(_owner,address(0),_tokenId);
        }
    }

    function _isValidToken(uint256 _tokenId) internal view returns(bool){
        return owners[_tokenId] != address(0);
    }

    function ownerOf(uint256 _tokenId) public view returns(address){
        require(_isValidToken(_tokenId),"invalid");
        return owners[_tokenId];
    }

    function approve(address _approved, uint256 _tokenId)  external{
        _noBlocked(_approved);

        address _owner = ownerOf(_tokenId);
        require( _owner == msg.sender
            || isApprovedForAll[_owner][msg.sender]
        ,"permission");
        emit Approval(_owner, _approved, _tokenId);
        allowance[_tokenId] = _approved;
    }

    function getApproved(uint256 _tokenId) external view returns (address) {
        require(_isValidToken(_tokenId),"invalid");
        return allowance[_tokenId];
    }

    function setApprovalForAll(address _operator, bool _approved) external {
        _noBlocked(_operator);
        emit ApprovalForAll(msg.sender,_operator, _approved);
        isApprovedForAll[msg.sender][_operator] = _approved;
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public {
        address _owner = ownerOf(_tokenId);
        if(isDarkAge()){
            require(!IDoomsdaySettlersDarkAge(DARK_AGE).checkVulnerable(uint32(_tokenId)),"vulnerable");
        }
        if(_from != msg.sender){
            _noBlocked(msg.sender);
        }

        require ( _owner == msg.sender
            || allowance[_tokenId] == msg.sender
            || isApprovedForAll[_owner][msg.sender]
        ,"permission");

        require(_owner == _from,"owner");
        require(_to != address(0),"zero");

        emit Transfer(_from, _to, _tokenId);
        owners[_tokenId] =_to;
        --balanceOf[_from];
        ++balanceOf[_to];

        if(allowance[_tokenId] != address(0)){
            delete allowance[_tokenId];
        }
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public {
        transferFrom(_from, _to, _tokenId);

        uint32 size;
        assembly {
            size := extcodesize(_to)
        }
        if(size != 0){
//        if(address(_to).code.length != 0){

            IERC721TokenReceiver receiver = IERC721TokenReceiver(_to);
            require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(0x150b7a02),"receiver");
        }


    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        safeTransferFrom(_from,_to,_tokenId,"");
    }

    function tokenURI(uint256 _tokenId) external view returns (string memory){
        ownerOf(_tokenId);
        return IDoomsdaySettlersMetadata(__metadata).tokenURI(
            _tokenId
        );
    }

    function totalSupply() external view returns (uint256){
        unchecked{
    //        return hashes.length - destroyed.length - abandoned;
            return hashes.length - abandoned;
        }
    }
    ///==End 721

    ///////===165 Implementation
    mapping (bytes4 => bool) public supportsInterface;
    ///==End 165

    //// ==== Admin
    function _onlyOwner() private view{
        require(msg.sender == owner,"owner");
    }
    function _onlyCreator() private view{
        require(msg.sender == creator,"creator");
    }

    function setOwner(address newOwner) external  {
        _onlyOwner();
        owner = newOwner;
    }

    function setMetadata(address _metadata) external {
        _onlyOwner();
        __metadata = _metadata;
    }

    function creatorWithdraw() external {
        _onlyCreator();
        uint256 toWithdraw = creatorEarnings;
        delete creatorEarnings;
        payable(msg.sender).transfer(toWithdraw);
    }

    function setCreator(address newCreator) external {
        _onlyCreator();
        creator = newCreator;
    }

    function setConfirmer(address _newConfirmer) external{
        _onlyOwner();
        confirmer = _newConfirmer;
    }

    //OPERATOR FILTER
    IDoomsdaySettlersBlacklist blacklist;
    function _noBlocked(address _addr) private view{
        unchecked{

            uint32 size;
            address _blacklist = address(blacklist);
            assembly {
                size := extcodesize(_blacklist)
            }
            if(size != 0){
//            if (address(blacklist).code.length != 0) {
                try blacklist.checkBlocked(_addr) returns (bool result){
                    require(!result,"blocked");
                } catch {
                    //External error, let them cook
                }
            }
        }
    }

    function setBlacklist(address _newBlacklist) external{
        _onlyOwner();
        blacklist = IDoomsdaySettlersBlacklist(_newBlacklist);
    }



}

File 2 of 5 : IDoomsdaySettlersBlacklist.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.21;

interface IDoomsdaySettlersBlacklist {
    function checkBlocked(address _addr) external view returns(bool);
}

File 3 of 5 : IDoomsdaySettlersDarkAge.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.21;

interface IDoomsdaySettlersDarkAge {
    function checkVulnerable(uint32 _tokenId) external view returns (bool);
    function getUnusedFees(uint32 _tokenId) external view returns (uint80);
    function disaster(uint32 _tokenId, uint256 _totalSupply) external returns(uint8 _type, bool destroyed);
    function reinforce(
        uint32 _tokenId,
        bytes32 _tokenHash,
        bool[4] memory _resources,
        bool _isDarkAge
    ) external returns (uint80 _cost);
}

File 4 of 5 : IDoomsdaySettlersMetadata.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.21;

interface IDoomsdaySettlersMetadata {
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

File 5 of 5 : IERC721TokenReceiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @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.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_darkAge","type":"address"},{"internalType":"uint256","name":"_BASE_DIFFICULTY","type":"uint256"},{"internalType":"uint256","name":"_DIFFICULTY_RAMP","type":"uint256"},{"internalType":"uint256","name":"_DIFFICULTY_COOLDOWN","type":"uint256"},{"internalType":"uint256","name":"_DIFFICULTY_COOLDOWN_SLOPE","type":"uint256"},{"internalType":"uint256","name":"_COLLAPSE_INITIAL","type":"uint256"},{"internalType":"uint256","name":"_COLLAPSE_RAMP","type":"uint256"},{"internalType":"uint256","name":"_COLLAPSE_MIN","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"_tokenId","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":false,"internalType":"uint80","name":"_growth","type":"uint80"},{"indexed":false,"internalType":"uint24","name":"_supplyAtMint","type":"uint24"},{"indexed":false,"internalType":"uint32","name":"_newAbandoned","type":"uint32"},{"indexed":false,"internalType":"uint80","name":"_newMintFee","type":"uint80"},{"indexed":false,"internalType":"uint80","name":"_eth","type":"uint80"},{"indexed":false,"internalType":"uint32","name":"_settled","type":"uint32"},{"indexed":false,"internalType":"bool","name":"_itIsTheDawnOfANewAge","type":"bool"},{"indexed":false,"internalType":"uint32","name":"_blockNumber","type":"uint32"}],"name":"Abandon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"_tokenId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"},{"indexed":false,"internalType":"bool","name":"_destroyed","type":"bool"},{"indexed":false,"internalType":"bool","name":"_darkAgeOver","type":"bool"}],"name":"Disaster","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"_tokenId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"}],"name":"Reinforce","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_tokenId","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_settler","type":"address"},{"indexed":false,"internalType":"uint24","name":"_newSupply","type":"uint24"},{"indexed":false,"internalType":"uint80","name":"_newMintFee","type":"uint80"},{"indexed":false,"internalType":"uint32","name":"_collapseBlock","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"_settlementType","type":"uint8"},{"indexed":true,"internalType":"address","name":"_data","type":"address"},{"indexed":false,"internalType":"uint32","name":"_blockNumber","type":"uint32"}],"name":"Settle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint32[]","name":"_tokenIds","type":"uint32[]"},{"internalType":"uint32","name":"_data","type":"uint32"}],"name":"abandon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_tokenId","type":"uint32"},{"internalType":"uint32","name":"_data","type":"uint32"}],"name":"confirmDisaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentState","outputs":[{"internalType":"bool","name":"_itIsTheDawnOfANewAge","type":"bool"},{"internalType":"uint32","name":"_firstSettlement","type":"uint32"},{"internalType":"uint16","name":"_age","type":"uint16"},{"internalType":"uint80","name":"_creatorEarnings","type":"uint80"},{"internalType":"uint80","name":"_relics","type":"uint80"},{"internalType":"uint80","name":"_supplies","type":"uint80"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_tokenId","type":"uint32"}],"name":"hashOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDarkAge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningState","outputs":[{"internalType":"bytes32","name":"_lastHash","type":"bytes32"},{"internalType":"uint32","name":"_settled","type":"uint32"},{"internalType":"uint32","name":"_abandoned","type":"uint32"},{"internalType":"uint32","name":"_lastSettleBlock","type":"uint32"},{"internalType":"uint32","name":"_collapseBlock","type":"uint32"},{"internalType":"uint80","name":"_mintFee","type":"uint80"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_tokenId","type":"uint32"},{"internalType":"bool[4]","name":"_resources","type":"bool[4]"}],"name":"reinforce","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBlacklist","type":"address"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newConfirmer","type":"address"}],"name":"setConfirmer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCreator","type":"address"}],"name":"setCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metadata","type":"address"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"location","type":"uint256"},{"internalType":"uint8","name":"count","type":"uint8"},{"internalType":"address","name":"data","type":"address"}],"name":"settle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"settlements","outputs":[{"internalType":"uint32","name":"settleBlock","type":"uint32"},{"internalType":"uint24","name":"supplyAtMint","type":"uint24"},{"internalType":"uint16","name":"age","type":"uint16"},{"internalType":"uint8","name":"settlementType","type":"uint8"},{"internalType":"uint80","name":"relics","type":"uint80"},{"internalType":"uint80","name":"supplies","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61018060405260035f806101000a81548161ffff021916908361ffff16021790555060405162006ab338038062006ab3833981810160405281019062000046919062000718565b86608081815250508560a081815250508460c081815250508360e081815250508261012081815250508161014081815250508061016081815250508773ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1681525050662386f26fc1000069ffffffffffffffffffff1634146200010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000105906200083a565b60405180910390fd5b6001600b5f6380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f6301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f6101000a81548160ff021916908315150217905550335f600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6001436200028b919062000887565b4090505f620002a1825f620004f360201b60201c565b9050620002b7600133846200055c60201b60201c565b6040518060c001604052804363ffffffff1681526020015f62ffffff1681526020015f8054906101000a900461ffff1661ffff1681526020018260ff1681526020015f69ffffffffffffffffffff1681526020015f69ffffffffffffffffffff1681525060055f600163ffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548162ffffff021916908362ffffff1602179055506040820151815f0160076101000a81548161ffff021916908361ffff1602179055506060820151815f0160096101000a81548160ff021916908360ff1602179055506080820151815f01600a6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060a0820151815f0160146101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055509050506501d1a94a20006102006009836200043d9190620008c1565b6a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6200046491906200094e565b6200047091906200099a565b6003600a8282829054906101000a900469ffffffffffffffffffff16620004989190620009df565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060015f60026101000a81548163ffffffff021916908363ffffffff1602179055505050505050505050505062000a23565b5f8060026101c284816200050c576200050b62000921565b5b0401905060088111156200051f57600890505b6127106001820160026064875f1c816200053e576200053d62000921565b5b060a028162000552576200055162000921565b5b0491505092915050565b3360095f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550600481908060018154018082558091505060019003905f5260205f20015f9091909190915055828273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620006aa826200067f565b9050919050565b620006bc816200069e565b8114620006c7575f80fd5b50565b5f81519050620006da81620006b1565b92915050565b5f819050919050565b620006f481620006e0565b8114620006ff575f80fd5b50565b5f815190506200071281620006e9565b92915050565b5f805f805f805f80610100898b0312156200073857620007376200067b565b5b5f620007478b828c01620006ca565b98505060206200075a8b828c0162000702565b97505060406200076d8b828c0162000702565b9650506060620007808b828c0162000702565b9550506080620007938b828c0162000702565b94505060a0620007a68b828c0162000702565b93505060c0620007b98b828c0162000702565b92505060e0620007cc8b828c0162000702565b9150509295985092959890939650565b5f82825260208201905092915050565b7f6465737472756374696f6e0000000000000000000000000000000000000000005f82015250565b5f62000822600b83620007dc565b91506200082f82620007ec565b602082019050919050565b5f6020820190508181035f830152620008538162000814565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200089382620006e0565b9150620008a083620006e0565b9250828203905081811115620008bb57620008ba6200085a565b5b92915050565b5f620008cd82620006e0565b9150620008da83620006e0565b9250828202620008ea81620006e0565b915082820484148315176200090457620009036200085a565b5b5092915050565b5f6affffffffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6200095a826200090b565b915062000967836200090b565b9250826200097a576200097962000921565b5b828206905092915050565b5f69ffffffffffffffffffff82169050919050565b5f620009a68262000985565b9150620009b38362000985565b9250828202620009c38162000985565b9150808214620009d857620009d76200085a565b5b5092915050565b5f620009eb8262000985565b9150620009f88362000985565b9250828201905069ffffffffffffffffffff81111562000a1d5762000a1c6200085a565b5b92915050565b60805160a05160c05160e05161010051610120516101405161016051615fa162000b125f395f8181610c4301528181610d1c015281816116db015281816117b201528181612be60152612cbf01525f8181610c8601528181610cb70152818161171e0152818161174e01528181612c290152612c5a01525f8181610c6401528181610ce0015281816116fc0152818161177601528181612c070152612c8301525f8181610df20152818161220a0152818161239c0152818161279d015281816136920152613ada01525f61160f01525f81816115c401526115ed01525f6114f901525f61151b0152615fa15ff3fe6080604052600436106101d0575f3560e01c80636352211e116100f6578063a22cb46511610094578063cfa5344011610063578063cfa5344014610746578063e985e9c514610762578063f06d67bb1461079e578063f3cb8385146107ce576102ac565b8063a22cb46514610692578063b88d4fde146106ba578063c259e1cc146106e2578063c87b56dd1461070a576102ac565b806370a08231116100d057806370a08231146105da5780638da5cb5b146106165780638e30c7661461064057806395d89b4114610668576102ac565b80636352211e1461054757806364ec8bdb146105835780636c2b836a14610599576102ac565b806313af40351161016e5780632f640a091161013d5780632f640a09146104a75780633f516018146104cf57806342842e0e146104f75780634e054a671461051f576102ac565b806313af40351461041157806318160ddd1461043957806323b872dd146104635780632579cb6d1461048b576102ac565b8063081812fc116101aa578063081812fc14610352578063095ea7b31461038e5780630c3f6acf146103b657806311f6dcbd146103e7576102ac565b806301ffc9a7146102b05780630357f5aa146102ec57806306fdde0314610328576102ac565b366102ac5769ffffffffffffffffffff80164710610223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021a906142da565b60405180910390fd5b3460035f8282829054906101000a900469ffffffffffffffffffff16610249919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055507f27b2dc149fd3048bc27eadaaf660801a04305c72845da74066a17b72d6c5bb66346040516102a2919061438f565b60405180910390a1005b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d1919061440e565b6107f6565b6040516102e39190614453565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d91906144a5565b610813565b60405161031f91906144e8565b60405180910390f35b348015610333575f80fd5b5061033c61088f565b604051610349919061457b565b60405180910390f35b34801561035d575f80fd5b50610378600480360381019061037391906145c5565b6108ab565b604051610385919061462f565b60405180910390f35b348015610399575f80fd5b506103b460048036038101906103af9190614672565b61092c565b005b3480156103c1575f80fd5b506103ca610aea565b6040516103de9897969594939291906146ea565b60405180910390f35b3480156103f2575f80fd5b506103fb610ba8565b6040516104089190614453565b60405180910390f35b34801561041c575f80fd5b5061043760048036038101906104329190614766565b610d67565b005b348015610444575f80fd5b5061044d610db2565b60405161045a919061438f565b60405180910390f35b34801561046e575f80fd5b5061048960048036038101906104849190614791565b610dd7565b005b6104a560048036038101906104a09190614817565b611329565b005b3480156104b2575f80fd5b506104cd60048036038101906104c89190614766565b61190d565b005b3480156104da575f80fd5b506104f560048036038101906104f09190614766565b611958565b005b348015610502575f80fd5b5061051d60048036038101906105189190614791565b6119a3565b005b34801561052a575f80fd5b5061054560048036038101906105409190614766565b6119c2565b005b348015610552575f80fd5b5061056d600480360381019061056891906145c5565b611a0d565b60405161057a919061462f565b60405180910390f35b34801561058e575f80fd5b50610597611a8e565b005b3480156105a4575f80fd5b506105bf60048036038101906105ba91906144a5565b611b20565b6040516105d196959493929190614893565b60405180910390f35b3480156105e5575f80fd5b5061060060048036038101906105fb9190614766565b611bb8565b60405161060d919061438f565b60405180910390f35b348015610621575f80fd5b5061062a611bcd565b604051610637919061462f565b60405180910390f35b34801561064b575f80fd5b5061066660048036038101906106619190614953565b611bf2565b005b348015610673575f80fd5b5061067c611cd3565b604051610689919061457b565b60405180910390f35b34801561069d575f80fd5b506106b860048036038101906106b391906149da565b611d0c565b005b3480156106c5575f80fd5b506106e060048036038101906106db9190614b40565b611e0d565b005b3480156106ed575f80fd5b5061070860048036038101906107039190614bc0565b611f3c565b005b348015610715575f80fd5b50610730600480360381019061072b91906145c5565b612621565b60405161073d919061457b565b60405180910390f35b610760600480360381019061075b9190614cac565b6126d0565b005b34801561076d575f80fd5b5061078860048036038101906107839190614cea565b612b37565b6040516107959190614453565b60405180910390f35b3480156107a9575f80fd5b506107b2612b61565b6040516107c59796959493929190614d28565b60405180910390f35b3480156107d9575f80fd5b506107f460048036038101906107ef9190614766565b612d97565b005b600b602052805f5260405f205f915054906101000a900460ff1681565b5f6108238263ffffffff16612de2565b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990614ddf565b60405180910390fd5b60046001830363ffffffff168154811061087f5761087e614dfd565b5b905f5260205f2001549050919050565b604051806060016040528060238152602001615f496023913981565b5f6108b582612de2565b6108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90614ddf565b60405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093582612e4a565b5f61093f82611a0d565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806109fc575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290614e74565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a48260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f805f805f805f805f600a9054906101000a900460ff165f60029054906101000a900463ffffffff165f8054906101000a900461ffff16600360149054906101000a900469ffffffffffffffffffff1660035f9054906101000a900469ffffffffffffffffffff16600260149054906101000a900469ffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1643975097509750975097509750975097509091929394959697565b5f8060048054905090505f8060069054906101000a900463ffffffff1663ffffffff16820390505f60055f8463ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690505f600160055f8663ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff160162ffffff1690507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000037f00000000000000000000000000000000000000000000000000000000000000008263ffffffff16021015610d1857600c7f00000000000000000000000000000000000000000000000000000000000000008263ffffffff16027f00000000000000000000000000000000000000000000000000000000000000000381610d0e57610d0d614e92565b5b0482019150610d4f565b600c7f000000000000000000000000000000000000000000000000000000000000000081610d4957610d48614e92565b5b04820191505b600183118015610d5e57508143115b94505050505090565b610d6f612f63565b805f600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8060069054906101000a900463ffffffff1663ffffffff1660048054905003905090565b5f610de182611a0d565b9050610deb610ba8565b15610ec9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166382657a85836040518263ffffffff1660e01b8152600401610e499190614ebf565b602060405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e889190614eec565b15610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614f61565b60405180910390fd5b5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f0657610f0533612e4a565b5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f9b57503373ffffffffffffffffffffffffffffffffffffffff1660075f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611027575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90614e74565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614fc9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990615031565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48260095f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546112359061504f565b9190508190555060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815461128590615076565b919050819055505f73ffffffffffffffffffffffffffffffffffffffff1660075f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113235760075f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b611331610ba8565b15611371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136890615107565b60405180910390fd5b5f8260ff16036113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad9061516f565b60405180910390fd5b60148260ff1611156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f4906151d7565b60405180910390fd5b69ffffffffffffffffffff8016471061144b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611442906142da565b60405180910390fd5b5f60016004805490500190505f600a9054906101000a900460ff16156114d3575f8081819054906101000a900461ffff1660010191906101000a81548161ffff021916908361ffff160217905550805f60026101000a81548163ffffffff021916908363ffffffff1602179055505f80600a6101000a81548160ff0219169083151502179055505b5f8060069054906101000a900463ffffffff1663ffffffff166004805490500390505f817f0000000000000000000000000000000000000000000000000000000000000000027f00000000000000000000000000000000000000000000000000000000000000000390505f60055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690508043116115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b39061523f565b60405180910390fd5b5f81430390507f000000000000000000000000000000000000000000000000000000000000000081101561164257807f0000000000000000000000000000000000000000000000000000000000000000037f000000000000000000000000000000000000000000000000000000000000000002838161163e5761163d614e92565b5b0492505b5f336004600160048054905003815481106116605761165f614dfd565b5b905f5260205f2001548a60405160200161167c939291906152e2565b60405160208183030381529060405280519060200120905083815f1c106116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf90615368565b60405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000037f00000000000000000000000000000000000000000000000000000000000000008a60ff1688010210156117ae57600c7f00000000000000000000000000000000000000000000000000000000000000008a60ff168801027f000000000000000000000000000000000000000000000000000000000000000003816117a4576117a3614e92565b5b04430190506117e5565b600c7f0000000000000000000000000000000000000000000000000000000000000000816117df576117de614e92565b5b04430190505b5f805f90505b8a60ff1663ffffffff168163ffffffff1610156118295761181a818a0185838463ffffffff168c01878f612ff4565b820191508060010190506117eb565b508034101561186d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611864906153d0565b60405180910390fd5b6127105a116118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890615438565b60405180910390fd5b80341115611900573373ffffffffffffffffffffffffffffffffffffffff166108fc82340390811502906040515f60405180830381858888f193505050501580156118fe573d5f803e3d5ffd5b505b5050505050505050505050565b611915612f63565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61196061344e565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119bd83838360405180602001604052805f815250611e0d565b505050565b6119ca612f63565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f611a1782612de2565b611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614ddf565b60405180910390fd5b60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a9661344e565b5f600360149054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff169050600360146101000a81549069ffffffffffffffffffff02191690553373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611b1c573d5f803e3d5ffd5b5050565b6005602052805f5260405f205f91509050805f015f9054906101000a900463ffffffff1690805f0160049054906101000a900462ffffff1690805f0160079054906101000a900461ffff1690805f0160099054906101000a900460ff1690805f01600a9054906101000a900469ffffffffffffffffffff1690805f0160149054906101000a900469ffffffffffffffffffff16905086565b6006602052805f5260405f205f915090505481565b5f600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8383905003611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e906154a0565b60405180910390fd5b5f805f90505b84849050811015611c8857611c79858583818110611c5e57611c5d614dfd565b5b9050602002016020810190611c7391906144a5565b846134df565b82019150806001019050611c3d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611ccc573d5f803e3d5ffd5b5050505050565b6040518060400160405280600a81526020017f534554544c454d454e540000000000000000000000000000000000000000000081525081565b611d1582612e4a565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d729190614453565b60405180910390a38060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611e18848484610dd7565b5f833b90505f8163ffffffff1614611f35575f84905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b8152600401611e949493929190615510565b6020604051808303815f875af1158015611eb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed4919061556e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2a906155e3565b60405180910390fd5b505b5050505050565b611f44610ba8565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90615107565b60405180910390fd5b611f928263ffffffff16612de2565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890614ddf565b60405180910390fd5b5f604b43611fdf9190615601565b9050601481101561206b57611ff98363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614fc9565b60405180910390fd5b6121d7565b602881101561214c576120838363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612108575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061567b565b60405180910390fd5b6121d6565b603c8110156121d5575f60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb906156e3565b60405180910390fd5b5b5b5b5f805f60048054905090505f8060069054906101000a900463ffffffff1663ffffffff16826122069190615701565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a54f604588836040518363ffffffff1660e01b8152600401612263929190615734565b60408051808303815f875af115801561227e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a2919061576f565b80945081955050505f808415612579575f6501d1a94a20006102006affffffffffffffffffffff16600960055f8e63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff168161233357612332614e92565b5b060290505f8060029054906101000a900463ffffffff1663ffffffff168b63ffffffff161061236c578a63ffffffff168603905061238c565b60015f60029054906101000a900463ffffffff1663ffffffff1687030190505b5f8282029050661c6bf5263400007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633d7606d28e6040518263ffffffff1660e01b81526004016123f39190614ebf565b602060405180830381865afa15801561240e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243291906157d7565b0260055f8e63ffffffff1663ffffffff1681526020019081526020015f205f0160149054906101000a900469ffffffffffffffffffff1660055f8f63ffffffff1663ffffffff1681526020019081526020015f205f01600a9054906101000a900469ffffffffffffffffffff1660028469ffffffffffffffffffff16816124bc576124bb614e92565b5b0401010160035f8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f600681819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790555061254a8c63ffffffff16613c97565b8560019003955060018603612567576125628b613da8565b600194505b505050662386f26fc100009050612584565b661c6bf52634000090505b8863ffffffff167fb42dc0fdbad9c34e94c321dcafde1913063d2654671596956fcf873387ee0d378787856040516125be93929190615802565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff166108fc8269ffffffffffffffffffff1690811502906040515f60405180830381858888f19350505050158015612615573d5f803e3d5ffd5b50505050505050505050565b606061262c82611a0d565b50600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b8152600401612687919061438f565b5f60405180830381865afa1580156126a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906126c991906158d5565b9050919050565b6126df8263ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461274c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274390615966565b60405180910390fd5b69ffffffffffffffffffff8016471061279a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791906142da565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a56946b846127e186610813565b856127ea610ba8565b6040518563ffffffff1660e01b81526004016128099493929190615a29565b6020604051808303815f875af1158015612825573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061284991906157d7565b90505f805f90505b60048110156128cd5783816004811061286d5761286c614dfd565b5b6020020151156128c257661c6bf526340000820191508463ffffffff167f2f3508f35cf9b0ed68f9abba5458799a360ddf42fcd12c6f41fd4860ba71631f826040516128b99190615a6c565b60405180910390a25b806001019050612851565b505f8169ffffffffffffffffffff160361291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291390615acf565b60405180910390fd5b600469ffffffffffffffffffff166003600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff168161295d5761295c614e92565b5b04820291508181019050348169ffffffffffffffffffff1611156129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90615b37565b60405180910390fd5b6064600f830269ffffffffffffffffffff16816129d6576129d5614e92565b5b04600360148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060646055830269ffffffffffffffffffff1681612a3e57612a3d614e92565b5b04600260148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506127105a11612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac190615438565b60405180910390fd5b8069ffffffffffffffffffff16341115612b31573373ffffffffffffffffffffffffffffffffffffffff166108fc8269ffffffffffffffffffff16340390811502906040515f60405180830381858888f19350505050158015612b2f573d5f803e3d5ffd5b505b50505050565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f805f805f805f8060055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690505f600160055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff160162ffffff1690507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000037f00000000000000000000000000000000000000000000000000000000000000008263ffffffff16021015612cbb57600c7f00000000000000000000000000000000000000000000000000000000000000008263ffffffff16027f00000000000000000000000000000000000000000000000000000000000000000381612cb157612cb0614e92565b5b0482019150612cf2565b600c7f000000000000000000000000000000000000000000000000000000000000000081612cec57612ceb614e92565b5b04820191505b600460016004805490500381548110612d0e57612d0d614dfd565b5b905f5260205f2001546004805490505f60069054906101000a900463ffffffff1660055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff16856003600a9054906101000a900469ffffffffffffffffffff16439850985098509850985098509850505090919293949596565b612d9f612f63565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f80600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050803b91505f8263ffffffff1614612f5e57600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ba06ca4846040518263ffffffff1660e01b8152600401612edb919061462f565b602060405180830381865afa925050508015612f1557506040513d601f19601f82011682018060405250810190612f129190614eec565b60015b15612f5d578015612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290615b9f565b60405180910390fd5b505b5b505050565b5f600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe990614fc9565b60405180910390fd5b565b5f662386f26fc1000069ffffffffffffffffffff166003600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff166130389190615bbd565b90505f6064600f69ffffffffffffffffffff16836130569190615bf0565b6130609190615c31565b905080600360148282829054906101000a900469ffffffffffffffffffff16613089919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055508069ffffffffffffffffffff16826130cb9190615bbd565b91505f87876040516020016130e1929190615c95565b6040516020818303038152906040528051906020012090505f6131048288614102565b90508144604051602001613119929190615cc0565b6040516020818303038152906040528051906020012091506040518060c001604052804363ffffffff1681526020018862ffffff1681526020015f8054906101000a900461ffff1661ffff1681526020018260ff1681526020015f69ffffffffffffffffffff1681526020015f69ffffffffffffffffffff1681525060055f8c63ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548162ffffff021916908362ffffff1602179055506040820151815f0160076101000a81548161ffff021916908361ffff1602179055506060820151815f0160096101000a81548160ff021916908360ff1602179055506080820151815f01600a6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060a0820151815f0160146101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555090505060026003600a9054906101000a900469ffffffffffffffffffff166132c89190615ceb565b60035f8282829054906101000a900469ffffffffffffffffffff166132ed919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506501d1a94a200061020060098361332e9190615d1b565b60ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6133569190615d6d565b6133609190615d9d565b6003600a8282829054906101000a900469ffffffffffffffffffff16613386919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506133c18a63ffffffff163384614161565b8473ffffffffffffffffffffffffffffffffffffffff167f444ecbf9f5083183eadb792d6e970912963d46d7530cc1429557b40c8eee836e8b843360018c6134099190615bbd565b6003600a9054906101000a900469ffffffffffffffffffff168c8843604051613439989796959493929190615dd9565b60405180910390a25050509695505050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d490615e9f565b60405180910390fd5b565b5f6134ef8363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461355c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355390615966565b60405180910390fd5b5f60046001850363ffffffff168154811061357a57613579614dfd565b5b905f5260205f20015490505f8060029054906101000a900463ffffffff1663ffffffff168563ffffffff16106135bf578463ffffffff166004805490500390506135e4565b60015f60029054906101000a900463ffffffff1663ffffffff16600480549050030190505b5f80600a9054906101000a900460ff1661367f576501d1a94a20006102006affffffffffffffffffffff16600960055f8a63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff168161367857613677614e92565b5b0683020290505b5f613688610ba8565b905080156138ed577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166382657a85886040518263ffffffff1660e01b81526004016136e99190614ebf565b602060405180830381865afa158015613704573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137289190614eec565b15613768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375f90614f61565b60405180910390fd5b60028269ffffffffffffffffffff168161378557613784614e92565b5b0491505f8060035f8054906101000a900461ffff1661ffff1611156137b1578160010191508060010190505b60015f60029054906101000a900463ffffffff1663ffffffff16035f60069054906101000a900463ffffffff1663ffffffff16038201915060015f60029054906101000a900463ffffffff1663ffffffff160360048054905003810190505f6409502f900082846406fc23ac00028161382d5761382c614e92565b5b046402540be400015f60069054906101000a900463ffffffff1663ffffffff166004805490500360035f9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff168161388657613885614e92565b5b04028161389657613895614e92565b5b04905080850194508060035f8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550505050613a2f565b5f600a9054906101000a900460ff16613a2e5760028269ffffffffffffffffffff168161391d5761391c614e92565b5b0460035f8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506501d1a94a20006102006affffffffffffffffffffff16600960055f8b63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff16816139e4576139e3614e92565b5b06026003600a8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505b5b5f600681819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790555060055f8863ffffffff1663ffffffff1681526020019081526020015f205f0160149054906101000a900469ffffffffffffffffffff1660055f8963ffffffff1663ffffffff1681526020019081526020015f205f01600a9054906101000a900469ffffffffffffffffffff16661c6bf5263400007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633d7606d28b6040518263ffffffff1660e01b8152600401613b319190614ebf565b602060405180830381865afa158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7091906157d7565b02662386f26fc1000001010182019150613b8f8763ffffffff16613c97565b8015613bc65760015f60069054906101000a900463ffffffff1663ffffffff166004805490500303613bc557613bc486613da8565b5b5b8663ffffffff167f043a95ff614f8dc4d9248f78dc6c860496987da7edc830f8189494f7eff4f6b0858560055f8c63ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff165f60069054906101000a900463ffffffff166003600a9054906101000a900469ffffffffffffffffffff16886004805490505f600a9054906101000a900460ff1643604051613c7699989796959493929190615ebd565b60405180910390a28169ffffffffffffffffffff1694505050505092915050565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060095f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613db78163ffffffff16612de2565b613df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ded90614ddf565b60405180910390fd5b60035f9054906101000a900469ffffffffffffffffffff1660055f8363ffffffff1663ffffffff1681526020019081526020015f205f01600a8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550600260149054906101000a900469ffffffffffffffffffff1660055f8363ffffffff1663ffffffff1681526020019081526020015f205f0160148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f6501d1a94a20006102006affffffffffffffffffffff16600960055f8663ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff1681613f7057613f6f614e92565b5b060290505f8060029054906101000a900463ffffffff1663ffffffff168363ffffffff161115613faf578263ffffffff16600480549050039050613fd4565b60015f60029054906101000a900463ffffffff1663ffffffff16600480549050030190505b5f828202905060028169ffffffffffffffffffff1681613ff757613ff6614e92565b5b0460055f8663ffffffff1663ffffffff1681526020019081526020015f205f01600a8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f60035f6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f600260146101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550826003600a6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060015f600a6101000a81548160ff02191690831515021790555050505050565b5f8060026101c2848161411857614117614e92565b5b04019050600881111561412a57600890505b6127106001820160026064875f1c8161414657614145614e92565b5b060a028161415757614156614e92565b5b0491505092915050565b3360095f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550600481908060018154018082558091505060019003905f5260205f20015f9091909190915055828273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b5f82825260208201905092915050565b7f62616c616e6365206f766572666c6f77000000000000000000000000000000005f82015250565b5f6142c4601083614280565b91506142cf82614290565b602082019050919050565b5f6020820190508181035f8301526142f1816142b8565b9050919050565b5f69ffffffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614344826142f8565b915061434f836142f8565b9250828201905069ffffffffffffffffffff8111156143715761437061430d565b5b92915050565b5f819050919050565b61438981614377565b82525050565b5f6020820190506143a25f830184614380565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143ed816143b9565b81146143f7575f80fd5b50565b5f81359050614408816143e4565b92915050565b5f60208284031215614423576144226143b1565b5b5f614430848285016143fa565b91505092915050565b5f8115159050919050565b61444d81614439565b82525050565b5f6020820190506144665f830184614444565b92915050565b5f63ffffffff82169050919050565b6144848161446c565b811461448e575f80fd5b50565b5f8135905061449f8161447b565b92915050565b5f602082840312156144ba576144b96143b1565b5b5f6144c784828501614491565b91505092915050565b5f819050919050565b6144e2816144d0565b82525050565b5f6020820190506144fb5f8301846144d9565b92915050565b5f81519050919050565b5f5b8381101561452857808201518184015260208101905061450d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61454d82614501565b6145578185614280565b935061456781856020860161450b565b61457081614533565b840191505092915050565b5f6020820190508181035f8301526145938184614543565b905092915050565b6145a481614377565b81146145ae575f80fd5b50565b5f813590506145bf8161459b565b92915050565b5f602082840312156145da576145d96143b1565b5b5f6145e7848285016145b1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614619826145f0565b9050919050565b6146298161460f565b82525050565b5f6020820190506146425f830184614620565b92915050565b6146518161460f565b811461465b575f80fd5b50565b5f8135905061466c81614648565b92915050565b5f8060408385031215614688576146876143b1565b5b5f6146958582860161465e565b92505060206146a6858286016145b1565b9150509250929050565b6146b98161446c565b82525050565b5f61ffff82169050919050565b6146d5816146bf565b82525050565b6146e4816142f8565b82525050565b5f610100820190506146fe5f83018b614444565b61470b602083018a6146b0565b61471860408301896146cc565b61472560608301886146db565b61473260808301876146db565b61473f60a08301866146db565b61474c60c0830185614620565b61475960e0830184614380565b9998505050505050505050565b5f6020828403121561477b5761477a6143b1565b5b5f6147888482850161465e565b91505092915050565b5f805f606084860312156147a8576147a76143b1565b5b5f6147b58682870161465e565b93505060206147c68682870161465e565b92505060406147d7868287016145b1565b9150509250925092565b5f60ff82169050919050565b6147f6816147e1565b8114614800575f80fd5b50565b5f81359050614811816147ed565b92915050565b5f805f6060848603121561482e5761482d6143b1565b5b5f61483b868287016145b1565b935050602061484c86828701614803565b925050604061485d8682870161465e565b9150509250925092565b5f62ffffff82169050919050565b61487e81614867565b82525050565b61488d816147e1565b82525050565b5f60c0820190506148a65f8301896146b0565b6148b36020830188614875565b6148c060408301876146cc565b6148cd6060830186614884565b6148da60808301856146db565b6148e760a08301846146db565b979650505050505050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614913576149126148f2565b5b8235905067ffffffffffffffff8111156149305761492f6148f6565b5b60208301915083602082028301111561494c5761494b6148fa565b5b9250929050565b5f805f6040848603121561496a576149696143b1565b5b5f84013567ffffffffffffffff811115614987576149866143b5565b5b614993868287016148fe565b935093505060206149a686828701614491565b9150509250925092565b6149b981614439565b81146149c3575f80fd5b50565b5f813590506149d4816149b0565b92915050565b5f80604083850312156149f0576149ef6143b1565b5b5f6149fd8582860161465e565b9250506020614a0e858286016149c6565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614a5282614533565b810181811067ffffffffffffffff82111715614a7157614a70614a1c565b5b80604052505050565b5f614a836143a8565b9050614a8f8282614a49565b919050565b5f67ffffffffffffffff821115614aae57614aad614a1c565b5b614ab782614533565b9050602081019050919050565b828183375f83830152505050565b5f614ae4614adf84614a94565b614a7a565b905082815260208101848484011115614b0057614aff614a18565b5b614b0b848285614ac4565b509392505050565b5f82601f830112614b2757614b266148f2565b5b8135614b37848260208601614ad2565b91505092915050565b5f805f8060808587031215614b5857614b576143b1565b5b5f614b658782880161465e565b9450506020614b768782880161465e565b9350506040614b87878288016145b1565b925050606085013567ffffffffffffffff811115614ba857614ba76143b5565b5b614bb487828801614b13565b91505092959194509250565b5f8060408385031215614bd657614bd56143b1565b5b5f614be385828601614491565b9250506020614bf485828601614491565b9150509250929050565b5f67ffffffffffffffff821115614c1857614c17614a1c565b5b602082029050919050565b5f614c35614c3084614bfe565b614a7a565b90508060208402830185811115614c4f57614c4e6148fa565b5b835b81811015614c785780614c6488826149c6565b845260208401935050602081019050614c51565b5050509392505050565b5f82601f830112614c9657614c956148f2565b5b6004614ca3848285614c23565b91505092915050565b5f8060a08385031215614cc257614cc16143b1565b5b5f614ccf85828601614491565b9250506020614ce085828601614c82565b9150509250929050565b5f8060408385031215614d0057614cff6143b1565b5b5f614d0d8582860161465e565b9250506020614d1e8582860161465e565b9150509250929050565b5f60e082019050614d3b5f83018a6144d9565b614d4860208301896146b0565b614d5560408301886146b0565b614d6260608301876146b0565b614d6f60808301866146b0565b614d7c60a08301856146db565b614d8960c0830184614380565b98975050505050505050565b7f696e76616c6964000000000000000000000000000000000000000000000000005f82015250565b5f614dc9600783614280565b9150614dd482614d95565b602082019050919050565b5f6020820190508181035f830152614df681614dbd565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7065726d697373696f6e000000000000000000000000000000000000000000005f82015250565b5f614e5e600a83614280565b9150614e6982614e2a565b602082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f602082019050614ed25f8301846146b0565b92915050565b5f81519050614ee6816149b0565b92915050565b5f60208284031215614f0157614f006143b1565b5b5f614f0e84828501614ed8565b91505092915050565b7f76756c6e657261626c65000000000000000000000000000000000000000000005f82015250565b5f614f4b600a83614280565b9150614f5682614f17565b602082019050919050565b5f6020820190508181035f830152614f7881614f3f565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f614fb3600583614280565b9150614fbe82614f7f565b602082019050919050565b5f6020820190508181035f830152614fe081614fa7565b9050919050565b7f7a65726f000000000000000000000000000000000000000000000000000000005f82015250565b5f61501b600483614280565b915061502682614fe7565b602082019050919050565b5f6020820190508181035f8301526150488161500f565b9050919050565b5f61505982614377565b91505f820361506b5761506a61430d565b5b600182039050919050565b5f61508082614377565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150b2576150b161430d565b5b600182019050919050565b7f6461726b206167650000000000000000000000000000000000000000000000005f82015250565b5f6150f1600883614280565b91506150fc826150bd565b602082019050919050565b5f6020820190508181035f83015261511e816150e5565b9050919050565b7f636f756e74206d696e00000000000000000000000000000000000000000000005f82015250565b5f615159600983614280565b915061516482615125565b602082019050919050565b5f6020820190508181035f8301526151868161514d565b9050919050565b7f636f756e74206d617800000000000000000000000000000000000000000000005f82015250565b5f6151c1600983614280565b91506151cc8261518d565b602082019050919050565b5f6020820190508181035f8301526151ee816151b5565b9050919050565b7f6c617374536574746c65426c6f636b00000000000000000000000000000000005f82015250565b5f615229600f83614280565b9150615234826151f5565b602082019050919050565b5f6020820190508181035f8301526152568161521d565b9050919050565b5f8160601b9050919050565b5f6152738261525d565b9050919050565b5f61528482615269565b9050919050565b61529c6152978261460f565b61527a565b82525050565b5f819050919050565b6152bc6152b7826144d0565b6152a2565b82525050565b5f819050919050565b6152dc6152d782614377565b6152c2565b82525050565b5f6152ed828661528b565b6014820191506152fd82856152ab565b60208201915061530d82846152cb565b602082019150819050949350505050565b7f646966666963756c7479000000000000000000000000000000000000000000005f82015250565b5f615352600a83614280565b915061535d8261531e565b602082019050919050565b5f6020820190508181035f83015261537f81615346565b9050919050565b7f636f7374000000000000000000000000000000000000000000000000000000005f82015250565b5f6153ba600483614280565b91506153c582615386565b602082019050919050565b5f6020820190508181035f8301526153e7816153ae565b9050919050565b7f67617300000000000000000000000000000000000000000000000000000000005f82015250565b5f615422600383614280565b915061542d826153ee565b602082019050919050565b5f6020820190508181035f83015261544f81615416565b9050919050565b7f746f6b656e4964730000000000000000000000000000000000000000000000005f82015250565b5f61548a600883614280565b915061549582615456565b602082019050919050565b5f6020820190508181035f8301526154b78161547e565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6154e2826154be565b6154ec81856154c8565b93506154fc81856020860161450b565b61550581614533565b840191505092915050565b5f6080820190506155235f830187614620565b6155306020830186614620565b61553d6040830185614380565b818103606083015261554f81846154d8565b905095945050505050565b5f81519050615568816143e4565b92915050565b5f60208284031215615583576155826143b1565b5b5f6155908482850161555a565b91505092915050565b7f72656365697665720000000000000000000000000000000000000000000000005f82015250565b5f6155cd600883614280565b91506155d882615599565b602082019050919050565b5f6020820190508181035f8301526155fa816155c1565b9050919050565b5f61560b82614377565b915061561683614377565b92508261562657615625614e92565b5b828206905092915050565b7f73656e64657200000000000000000000000000000000000000000000000000005f82015250565b5f615665600683614280565b915061567082615631565b602082019050919050565b5f6020820190508181035f83015261569281615659565b9050919050565b7f62616c616e6365000000000000000000000000000000000000000000000000005f82015250565b5f6156cd600783614280565b91506156d882615699565b602082019050919050565b5f6020820190508181035f8301526156fa816156c1565b9050919050565b5f61570b82614377565b915061571683614377565b925082820390508181111561572e5761572d61430d565b5b92915050565b5f6040820190506157475f8301856146b0565b6157546020830184614380565b9392505050565b5f81519050615769816147ed565b92915050565b5f8060408385031215615785576157846143b1565b5b5f6157928582860161575b565b92505060206157a385828601614ed8565b9150509250929050565b6157b6816142f8565b81146157c0575f80fd5b50565b5f815190506157d1816157ad565b92915050565b5f602082840312156157ec576157eb6143b1565b5b5f6157f9848285016157c3565b91505092915050565b5f6060820190506158155f830186614884565b6158226020830185614444565b61582f6040830184614444565b949350505050565b5f67ffffffffffffffff82111561585157615850614a1c565b5b61585a82614533565b9050602081019050919050565b5f61587961587484615837565b614a7a565b90508281526020810184848401111561589557615894614a18565b5b6158a084828561450b565b509392505050565b5f82601f8301126158bc576158bb6148f2565b5b81516158cc848260208601615867565b91505092915050565b5f602082840312156158ea576158e96143b1565b5b5f82015167ffffffffffffffff811115615907576159066143b5565b5b615913848285016158a8565b91505092915050565b7f6f776e65724f66000000000000000000000000000000000000000000000000005f82015250565b5f615950600783614280565b915061595b8261591c565b602082019050919050565b5f6020820190508181035f83015261597d81615944565b9050919050565b5f60049050919050565b5f81905092915050565b5f819050919050565b6159aa81614439565b82525050565b5f6159bb83836159a1565b60208301905092915050565b5f602082019050919050565b6159dc81615984565b6159e6818461598e565b92506159f182615998565b805f5b83811015615a21578151615a0887826159b0565b9650615a13836159c7565b9250506001810190506159f4565b505050505050565b5f60e082019050615a3c5f8301876146b0565b615a4960208301866144d9565b615a5660408301856159d3565b615a6360c0830184614444565b95945050505050565b5f602082019050615a7f5f830184614884565b92915050565b7f656d7074790000000000000000000000000000000000000000000000000000005f82015250565b5f615ab9600583614280565b9150615ac482615a85565b602082019050919050565b5f6020820190508181035f830152615ae681615aad565b9050919050565b7f6d73672e76616c756500000000000000000000000000000000000000000000005f82015250565b5f615b21600983614280565b9150615b2c82615aed565b602082019050919050565b5f6020820190508181035f830152615b4e81615b15565b9050919050565b7f626c6f636b6564000000000000000000000000000000000000000000000000005f82015250565b5f615b89600783614280565b9150615b9482615b55565b602082019050919050565b5f6020820190508181035f830152615bb681615b7d565b9050919050565b5f615bc782614377565b9150615bd283614377565b9250828201905080821115615bea57615be961430d565b5b92915050565b5f615bfa82614377565b9150615c0583614377565b9250828202615c1381614377565b91508282048414831517615c2a57615c2961430d565b5b5092915050565b5f615c3b82614377565b9150615c4683614377565b925082615c5657615c55614e92565b5b828204905092915050565b5f8160e01b9050919050565b5f615c7782615c61565b9050919050565b615c8f615c8a8261446c565b615c6d565b82525050565b5f615ca082856152ab565b602082019150615cb08284615c7e565b6004820191508190509392505050565b5f615ccb82856152ab565b602082019150615cdb82846152cb565b6020820191508190509392505050565b5f615cf5826142f8565b9150615d00836142f8565b925082615d1057615d0f614e92565b5b828204905092915050565b5f615d25826147e1565b9150615d30836147e1565b9250828202615d3e816147e1565b9150808214615d5057615d4f61430d565b5b5092915050565b5f6affffffffffffffffffffff82169050919050565b5f615d7782615d57565b9150615d8283615d57565b925082615d9257615d91614e92565b5b828206905092915050565b5f615da7826142f8565b9150615db2836142f8565b9250828202615dc0816142f8565b9150808214615dd257615dd161430d565b5b5092915050565b5f61010082019050615ded5f83018b6146b0565b615dfa602083018a6144d9565b615e076040830189614620565b615e146060830188614875565b615e2160808301876146db565b615e2e60a08301866146b0565b615e3b60c0830185614884565b615e4860e08301846146b0565b9998505050505050505050565b7f63726561746f72000000000000000000000000000000000000000000000000005f82015250565b5f615e89600783614280565b9150615e9482615e55565b602082019050919050565b5f6020820190508181035f830152615eb681615e7d565b9050919050565b5f61012082019050615ed15f83018c6144d9565b615ede602083018b6146db565b615eeb604083018a614875565b615ef860608301896146b0565b615f0560808301886146db565b615f1260a08301876146db565b615f1f60c08301866146b0565b615f2c60e0830185614444565b615f3a6101008301846146b0565b9a995050505050505050505056fe446f6f6d736461793a20536574746c657273206f66207468652057617374656c616e64a26469706673582212200bfbe561ba45bf8c8c2e3c192f11d879c1c625fe33be84f6769e1f08c3f0dbea64736f6c6343000815003300000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f00000597a7e03ca484679197fbc312c8120b53a983aad3362bc462536a998a380000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000024

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c80636352211e116100f6578063a22cb46511610094578063cfa5344011610063578063cfa5344014610746578063e985e9c514610762578063f06d67bb1461079e578063f3cb8385146107ce576102ac565b8063a22cb46514610692578063b88d4fde146106ba578063c259e1cc146106e2578063c87b56dd1461070a576102ac565b806370a08231116100d057806370a08231146105da5780638da5cb5b146106165780638e30c7661461064057806395d89b4114610668576102ac565b80636352211e1461054757806364ec8bdb146105835780636c2b836a14610599576102ac565b806313af40351161016e5780632f640a091161013d5780632f640a09146104a75780633f516018146104cf57806342842e0e146104f75780634e054a671461051f576102ac565b806313af40351461041157806318160ddd1461043957806323b872dd146104635780632579cb6d1461048b576102ac565b8063081812fc116101aa578063081812fc14610352578063095ea7b31461038e5780630c3f6acf146103b657806311f6dcbd146103e7576102ac565b806301ffc9a7146102b05780630357f5aa146102ec57806306fdde0314610328576102ac565b366102ac5769ffffffffffffffffffff80164710610223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021a906142da565b60405180910390fd5b3460035f8282829054906101000a900469ffffffffffffffffffff16610249919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055507f27b2dc149fd3048bc27eadaaf660801a04305c72845da74066a17b72d6c5bb66346040516102a2919061438f565b60405180910390a1005b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d1919061440e565b6107f6565b6040516102e39190614453565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d91906144a5565b610813565b60405161031f91906144e8565b60405180910390f35b348015610333575f80fd5b5061033c61088f565b604051610349919061457b565b60405180910390f35b34801561035d575f80fd5b50610378600480360381019061037391906145c5565b6108ab565b604051610385919061462f565b60405180910390f35b348015610399575f80fd5b506103b460048036038101906103af9190614672565b61092c565b005b3480156103c1575f80fd5b506103ca610aea565b6040516103de9897969594939291906146ea565b60405180910390f35b3480156103f2575f80fd5b506103fb610ba8565b6040516104089190614453565b60405180910390f35b34801561041c575f80fd5b5061043760048036038101906104329190614766565b610d67565b005b348015610444575f80fd5b5061044d610db2565b60405161045a919061438f565b60405180910390f35b34801561046e575f80fd5b5061048960048036038101906104849190614791565b610dd7565b005b6104a560048036038101906104a09190614817565b611329565b005b3480156104b2575f80fd5b506104cd60048036038101906104c89190614766565b61190d565b005b3480156104da575f80fd5b506104f560048036038101906104f09190614766565b611958565b005b348015610502575f80fd5b5061051d60048036038101906105189190614791565b6119a3565b005b34801561052a575f80fd5b5061054560048036038101906105409190614766565b6119c2565b005b348015610552575f80fd5b5061056d600480360381019061056891906145c5565b611a0d565b60405161057a919061462f565b60405180910390f35b34801561058e575f80fd5b50610597611a8e565b005b3480156105a4575f80fd5b506105bf60048036038101906105ba91906144a5565b611b20565b6040516105d196959493929190614893565b60405180910390f35b3480156105e5575f80fd5b5061060060048036038101906105fb9190614766565b611bb8565b60405161060d919061438f565b60405180910390f35b348015610621575f80fd5b5061062a611bcd565b604051610637919061462f565b60405180910390f35b34801561064b575f80fd5b5061066660048036038101906106619190614953565b611bf2565b005b348015610673575f80fd5b5061067c611cd3565b604051610689919061457b565b60405180910390f35b34801561069d575f80fd5b506106b860048036038101906106b391906149da565b611d0c565b005b3480156106c5575f80fd5b506106e060048036038101906106db9190614b40565b611e0d565b005b3480156106ed575f80fd5b5061070860048036038101906107039190614bc0565b611f3c565b005b348015610715575f80fd5b50610730600480360381019061072b91906145c5565b612621565b60405161073d919061457b565b60405180910390f35b610760600480360381019061075b9190614cac565b6126d0565b005b34801561076d575f80fd5b5061078860048036038101906107839190614cea565b612b37565b6040516107959190614453565b60405180910390f35b3480156107a9575f80fd5b506107b2612b61565b6040516107c59796959493929190614d28565b60405180910390f35b3480156107d9575f80fd5b506107f460048036038101906107ef9190614766565b612d97565b005b600b602052805f5260405f205f915054906101000a900460ff1681565b5f6108238263ffffffff16612de2565b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990614ddf565b60405180910390fd5b60046001830363ffffffff168154811061087f5761087e614dfd565b5b905f5260205f2001549050919050565b604051806060016040528060238152602001615f496023913981565b5f6108b582612de2565b6108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90614ddf565b60405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093582612e4a565b5f61093f82611a0d565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806109fc575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290614e74565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a48260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f805f805f805f805f600a9054906101000a900460ff165f60029054906101000a900463ffffffff165f8054906101000a900461ffff16600360149054906101000a900469ffffffffffffffffffff1660035f9054906101000a900469ffffffffffffffffffff16600260149054906101000a900469ffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1643975097509750975097509750975097509091929394959697565b5f8060048054905090505f8060069054906101000a900463ffffffff1663ffffffff16820390505f60055f8463ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690505f600160055f8663ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff160162ffffff1690507f00000000000000000000000000000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000015180037f000000000000000000000000000000000000000000000000000000000000001e8263ffffffff16021015610d1857600c7f000000000000000000000000000000000000000000000000000000000000001e8263ffffffff16027f00000000000000000000000000000000000000000000000000000000000151800381610d0e57610d0d614e92565b5b0482019150610d4f565b600c7f000000000000000000000000000000000000000000000000000000000000002481610d4957610d48614e92565b5b04820191505b600183118015610d5e57508143115b94505050505090565b610d6f612f63565b805f600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8060069054906101000a900463ffffffff1663ffffffff1660048054905003905090565b5f610de182611a0d565b9050610deb610ba8565b15610ec9577f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff166382657a85836040518263ffffffff1660e01b8152600401610e499190614ebf565b602060405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e889190614eec565b15610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614f61565b60405180910390fd5b5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f0657610f0533612e4a565b5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f9b57503373ffffffffffffffffffffffffffffffffffffffff1660075f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611027575060085f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90614e74565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614fc9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990615031565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48260095f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546112359061504f565b9190508190555060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815461128590615076565b919050819055505f73ffffffffffffffffffffffffffffffffffffffff1660075f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113235760075f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50505050565b611331610ba8565b15611371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136890615107565b60405180910390fd5b5f8260ff16036113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad9061516f565b60405180910390fd5b60148260ff1611156113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f4906151d7565b60405180910390fd5b69ffffffffffffffffffff8016471061144b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611442906142da565b60405180910390fd5b5f60016004805490500190505f600a9054906101000a900460ff16156114d3575f8081819054906101000a900461ffff1660010191906101000a81548161ffff021916908361ffff160217905550805f60026101000a81548163ffffffff021916908363ffffffff1602179055505f80600a6101000a81548160ff0219169083151502179055505b5f8060069054906101000a900463ffffffff1663ffffffff166004805490500390505f817f0000000000000000000000000000000000000000000000000000000000003a98027f00000597a7e03ca484679197fbc312c8120b53a983aad3362bc462536a998a380390505f60055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690508043116115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b39061523f565b60405180910390fd5b5f81430390507f000000000000000000000000000000000000000000000000000000000000001981101561164257807f0000000000000000000000000000000000000000000000000000000000000019037f000000000000000000000000000000000000000000000000000000000000000f02838161163e5761163d614e92565b5b0492505b5f336004600160048054905003815481106116605761165f614dfd565b5b905f5260205f2001548a60405160200161167c939291906152e2565b60405160208183030381529060405280519060200120905083815f1c106116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf90615368565b60405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000015180037f000000000000000000000000000000000000000000000000000000000000001e8a60ff1688010210156117ae57600c7f000000000000000000000000000000000000000000000000000000000000001e8a60ff168801027f000000000000000000000000000000000000000000000000000000000001518003816117a4576117a3614e92565b5b04430190506117e5565b600c7f0000000000000000000000000000000000000000000000000000000000000024816117df576117de614e92565b5b04430190505b5f805f90505b8a60ff1663ffffffff168163ffffffff1610156118295761181a818a0185838463ffffffff168c01878f612ff4565b820191508060010190506117eb565b508034101561186d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611864906153d0565b60405180910390fd5b6127105a116118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890615438565b60405180910390fd5b80341115611900573373ffffffffffffffffffffffffffffffffffffffff166108fc82340390811502906040515f60405180830381858888f193505050501580156118fe573d5f803e3d5ffd5b505b5050505050505050505050565b611915612f63565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61196061344e565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119bd83838360405180602001604052805f815250611e0d565b505050565b6119ca612f63565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f611a1782612de2565b611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614ddf565b60405180910390fd5b60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611a9661344e565b5f600360149054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff169050600360146101000a81549069ffffffffffffffffffff02191690553373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611b1c573d5f803e3d5ffd5b5050565b6005602052805f5260405f205f91509050805f015f9054906101000a900463ffffffff1690805f0160049054906101000a900462ffffff1690805f0160079054906101000a900461ffff1690805f0160099054906101000a900460ff1690805f01600a9054906101000a900469ffffffffffffffffffff1690805f0160149054906101000a900469ffffffffffffffffffff16905086565b6006602052805f5260405f205f915090505481565b5f600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8383905003611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e906154a0565b60405180910390fd5b5f805f90505b84849050811015611c8857611c79858583818110611c5e57611c5d614dfd565b5b9050602002016020810190611c7391906144a5565b846134df565b82019150806001019050611c3d565b503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611ccc573d5f803e3d5ffd5b5050505050565b6040518060400160405280600a81526020017f534554544c454d454e540000000000000000000000000000000000000000000081525081565b611d1582612e4a565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d729190614453565b60405180910390a38060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611e18848484610dd7565b5f833b90505f8163ffffffff1614611f35575f84905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b8152600401611e949493929190615510565b6020604051808303815f875af1158015611eb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed4919061556e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2a906155e3565b60405180910390fd5b505b5050505050565b611f44610ba8565b611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90615107565b60405180910390fd5b611f928263ffffffff16612de2565b611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890614ddf565b60405180910390fd5b5f604b43611fdf9190615601565b9050601481101561206b57611ff98363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614fc9565b60405180910390fd5b6121d7565b602881101561214c576120838363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612108575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061567b565b60405180910390fd5b6121d6565b603c8110156121d5575f60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb906156e3565b60405180910390fd5b5b5b5b5f805f60048054905090505f8060069054906101000a900463ffffffff1663ffffffff16826122069190615701565b90507f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff1663a54f604588836040518363ffffffff1660e01b8152600401612263929190615734565b60408051808303815f875af115801561227e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a2919061576f565b80945081955050505f808415612579575f6501d1a94a20006102006affffffffffffffffffffff16600960055f8e63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff168161233357612332614e92565b5b060290505f8060029054906101000a900463ffffffff1663ffffffff168b63ffffffff161061236c578a63ffffffff168603905061238c565b60015f60029054906101000a900463ffffffff1663ffffffff1687030190505b5f8282029050661c6bf5263400007f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff16633d7606d28e6040518263ffffffff1660e01b81526004016123f39190614ebf565b602060405180830381865afa15801561240e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243291906157d7565b0260055f8e63ffffffff1663ffffffff1681526020019081526020015f205f0160149054906101000a900469ffffffffffffffffffff1660055f8f63ffffffff1663ffffffff1681526020019081526020015f205f01600a9054906101000a900469ffffffffffffffffffff1660028469ffffffffffffffffffff16816124bc576124bb614e92565b5b0401010160035f8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f600681819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790555061254a8c63ffffffff16613c97565b8560019003955060018603612567576125628b613da8565b600194505b505050662386f26fc100009050612584565b661c6bf52634000090505b8863ffffffff167fb42dc0fdbad9c34e94c321dcafde1913063d2654671596956fcf873387ee0d378787856040516125be93929190615802565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff166108fc8269ffffffffffffffffffff1690811502906040515f60405180830381858888f19350505050158015612615573d5f803e3d5ffd5b50505050505050505050565b606061262c82611a0d565b50600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b8152600401612687919061438f565b5f60405180830381865afa1580156126a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906126c991906158d5565b9050919050565b6126df8263ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461274c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274390615966565b60405180910390fd5b69ffffffffffffffffffff8016471061279a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791906142da565b60405180910390fd5b5f7f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff16632a56946b846127e186610813565b856127ea610ba8565b6040518563ffffffff1660e01b81526004016128099493929190615a29565b6020604051808303815f875af1158015612825573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061284991906157d7565b90505f805f90505b60048110156128cd5783816004811061286d5761286c614dfd565b5b6020020151156128c257661c6bf526340000820191508463ffffffff167f2f3508f35cf9b0ed68f9abba5458799a360ddf42fcd12c6f41fd4860ba71631f826040516128b99190615a6c565b60405180910390a25b806001019050612851565b505f8169ffffffffffffffffffff160361291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291390615acf565b60405180910390fd5b600469ffffffffffffffffffff166003600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff168161295d5761295c614e92565b5b04820291508181019050348169ffffffffffffffffffff1611156129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ad90615b37565b60405180910390fd5b6064600f830269ffffffffffffffffffff16816129d6576129d5614e92565b5b04600360148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060646055830269ffffffffffffffffffff1681612a3e57612a3d614e92565b5b04600260148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506127105a11612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac190615438565b60405180910390fd5b8069ffffffffffffffffffff16341115612b31573373ffffffffffffffffffffffffffffffffffffffff166108fc8269ffffffffffffffffffff16340390811502906040515f60405180830381858888f19350505050158015612b2f573d5f803e3d5ffd5b505b50505050565b6008602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f805f805f805f8060055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff1663ffffffff1690505f600160055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff160162ffffff1690507f00000000000000000000000000000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000015180037f000000000000000000000000000000000000000000000000000000000000001e8263ffffffff16021015612cbb57600c7f000000000000000000000000000000000000000000000000000000000000001e8263ffffffff16027f00000000000000000000000000000000000000000000000000000000000151800381612cb157612cb0614e92565b5b0482019150612cf2565b600c7f000000000000000000000000000000000000000000000000000000000000002481612cec57612ceb614e92565b5b04820191505b600460016004805490500381548110612d0e57612d0d614dfd565b5b905f5260205f2001546004805490505f60069054906101000a900463ffffffff1660055f60048054905063ffffffff1663ffffffff1681526020019081526020015f205f015f9054906101000a900463ffffffff16856003600a9054906101000a900469ffffffffffffffffffff16439850985098509850985098509850505090919293949596565b612d9f612f63565b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f80600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050803b91505f8263ffffffff1614612f5e57600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ba06ca4846040518263ffffffff1660e01b8152600401612edb919061462f565b602060405180830381865afa925050508015612f1557506040513d601f19601f82011682018060405250810190612f129190614eec565b60015b15612f5d578015612f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5290615b9f565b60405180910390fd5b505b5b505050565b5f600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe990614fc9565b60405180910390fd5b565b5f662386f26fc1000069ffffffffffffffffffff166003600a9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff166130389190615bbd565b90505f6064600f69ffffffffffffffffffff16836130569190615bf0565b6130609190615c31565b905080600360148282829054906101000a900469ffffffffffffffffffff16613089919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055508069ffffffffffffffffffff16826130cb9190615bbd565b91505f87876040516020016130e1929190615c95565b6040516020818303038152906040528051906020012090505f6131048288614102565b90508144604051602001613119929190615cc0565b6040516020818303038152906040528051906020012091506040518060c001604052804363ffffffff1681526020018862ffffff1681526020015f8054906101000a900461ffff1661ffff1681526020018260ff1681526020015f69ffffffffffffffffffff1681526020015f69ffffffffffffffffffff1681525060055f8c63ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548162ffffff021916908362ffffff1602179055506040820151815f0160076101000a81548161ffff021916908361ffff1602179055506060820151815f0160096101000a81548160ff021916908360ff1602179055506080820151815f01600a6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060a0820151815f0160146101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555090505060026003600a9054906101000a900469ffffffffffffffffffff166132c89190615ceb565b60035f8282829054906101000a900469ffffffffffffffffffff166132ed919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506501d1a94a200061020060098361332e9190615d1b565b60ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6133569190615d6d565b6133609190615d9d565b6003600a8282829054906101000a900469ffffffffffffffffffff16613386919061433a565b92506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506133c18a63ffffffff163384614161565b8473ffffffffffffffffffffffffffffffffffffffff167f444ecbf9f5083183eadb792d6e970912963d46d7530cc1429557b40c8eee836e8b843360018c6134099190615bbd565b6003600a9054906101000a900469ffffffffffffffffffff168c8843604051613439989796959493929190615dd9565b60405180910390a25050509695505050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d490615e9f565b60405180910390fd5b565b5f6134ef8363ffffffff16611a0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461355c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355390615966565b60405180910390fd5b5f60046001850363ffffffff168154811061357a57613579614dfd565b5b905f5260205f20015490505f8060029054906101000a900463ffffffff1663ffffffff168563ffffffff16106135bf578463ffffffff166004805490500390506135e4565b60015f60029054906101000a900463ffffffff1663ffffffff16600480549050030190505b5f80600a9054906101000a900460ff1661367f576501d1a94a20006102006affffffffffffffffffffff16600960055f8a63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff168161367857613677614e92565b5b0683020290505b5f613688610ba8565b905080156138ed577f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff166382657a85886040518263ffffffff1660e01b81526004016136e99190614ebf565b602060405180830381865afa158015613704573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137289190614eec565b15613768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375f90614f61565b60405180910390fd5b60028269ffffffffffffffffffff168161378557613784614e92565b5b0491505f8060035f8054906101000a900461ffff1661ffff1611156137b1578160010191508060010190505b60015f60029054906101000a900463ffffffff1663ffffffff16035f60069054906101000a900463ffffffff1663ffffffff16038201915060015f60029054906101000a900463ffffffff1663ffffffff160360048054905003810190505f6409502f900082846406fc23ac00028161382d5761382c614e92565b5b046402540be400015f60069054906101000a900463ffffffff1663ffffffff166004805490500360035f9054906101000a900469ffffffffffffffffffff1669ffffffffffffffffffff168161388657613885614e92565b5b04028161389657613895614e92565b5b04905080850194508060035f8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550505050613a2f565b5f600a9054906101000a900460ff16613a2e5760028269ffffffffffffffffffff168161391d5761391c614e92565b5b0460035f8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055506501d1a94a20006102006affffffffffffffffffffff16600960055f8b63ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff16816139e4576139e3614e92565b5b06026003600a8282829054906101000a900469ffffffffffffffffffff160392506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505b5b5f600681819054906101000a900463ffffffff1660010191906101000a81548163ffffffff021916908363ffffffff16021790555060055f8863ffffffff1663ffffffff1681526020019081526020015f205f0160149054906101000a900469ffffffffffffffffffff1660055f8963ffffffff1663ffffffff1681526020019081526020015f205f01600a9054906101000a900469ffffffffffffffffffff16661c6bf5263400007f00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f73ffffffffffffffffffffffffffffffffffffffff16633d7606d28b6040518263ffffffff1660e01b8152600401613b319190614ebf565b602060405180830381865afa158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7091906157d7565b02662386f26fc1000001010182019150613b8f8763ffffffff16613c97565b8015613bc65760015f60069054906101000a900463ffffffff1663ffffffff166004805490500303613bc557613bc486613da8565b5b5b8663ffffffff167f043a95ff614f8dc4d9248f78dc6c860496987da7edc830f8189494f7eff4f6b0858560055f8c63ffffffff1663ffffffff1681526020019081526020015f205f0160049054906101000a900462ffffff165f60069054906101000a900463ffffffff166003600a9054906101000a900469ffffffffffffffffffff16886004805490505f600a9054906101000a900460ff1643604051613c7699989796959493929190615ebd565b60405180910390a28169ffffffffffffffffffff1694505050505092915050565b5f60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060095f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613db78163ffffffff16612de2565b613df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ded90614ddf565b60405180910390fd5b60035f9054906101000a900469ffffffffffffffffffff1660055f8363ffffffff1663ffffffff1681526020019081526020015f205f01600a8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550600260149054906101000a900469ffffffffffffffffffff1660055f8363ffffffff1663ffffffff1681526020019081526020015f205f0160148282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f6501d1a94a20006102006affffffffffffffffffffff16600960055f8663ffffffff1663ffffffff1681526020019081526020015f205f0160099054906101000a900460ff160260ff166a01f4641908c320f0501e0a6affffffffffffffffffffff16901c6affffffffffffffffffffff1681613f7057613f6f614e92565b5b060290505f8060029054906101000a900463ffffffff1663ffffffff168363ffffffff161115613faf578263ffffffff16600480549050039050613fd4565b60015f60029054906101000a900463ffffffff1663ffffffff16600480549050030190505b5f828202905060028169ffffffffffffffffffff1681613ff757613ff6614e92565b5b0460055f8663ffffffff1663ffffffff1681526020019081526020015f205f01600a8282829054906101000a900469ffffffffffffffffffff160192506101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f60035f6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff1602179055505f600260146101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550826003600a6101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff16021790555060015f600a6101000a81548160ff02191690831515021790555050505050565b5f8060026101c2848161411857614117614e92565b5b04019050600881111561412a57600890505b6127106001820160026064875f1c8161414657614145614e92565b5b060a028161415757614156614e92565b5b0491505092915050565b3360095f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550600481908060018154018082558091505060019003905f5260205f20015f9091909190915055828273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b5f82825260208201905092915050565b7f62616c616e6365206f766572666c6f77000000000000000000000000000000005f82015250565b5f6142c4601083614280565b91506142cf82614290565b602082019050919050565b5f6020820190508181035f8301526142f1816142b8565b9050919050565b5f69ffffffffffffffffffff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614344826142f8565b915061434f836142f8565b9250828201905069ffffffffffffffffffff8111156143715761437061430d565b5b92915050565b5f819050919050565b61438981614377565b82525050565b5f6020820190506143a25f830184614380565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143ed816143b9565b81146143f7575f80fd5b50565b5f81359050614408816143e4565b92915050565b5f60208284031215614423576144226143b1565b5b5f614430848285016143fa565b91505092915050565b5f8115159050919050565b61444d81614439565b82525050565b5f6020820190506144665f830184614444565b92915050565b5f63ffffffff82169050919050565b6144848161446c565b811461448e575f80fd5b50565b5f8135905061449f8161447b565b92915050565b5f602082840312156144ba576144b96143b1565b5b5f6144c784828501614491565b91505092915050565b5f819050919050565b6144e2816144d0565b82525050565b5f6020820190506144fb5f8301846144d9565b92915050565b5f81519050919050565b5f5b8381101561452857808201518184015260208101905061450d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61454d82614501565b6145578185614280565b935061456781856020860161450b565b61457081614533565b840191505092915050565b5f6020820190508181035f8301526145938184614543565b905092915050565b6145a481614377565b81146145ae575f80fd5b50565b5f813590506145bf8161459b565b92915050565b5f602082840312156145da576145d96143b1565b5b5f6145e7848285016145b1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614619826145f0565b9050919050565b6146298161460f565b82525050565b5f6020820190506146425f830184614620565b92915050565b6146518161460f565b811461465b575f80fd5b50565b5f8135905061466c81614648565b92915050565b5f8060408385031215614688576146876143b1565b5b5f6146958582860161465e565b92505060206146a6858286016145b1565b9150509250929050565b6146b98161446c565b82525050565b5f61ffff82169050919050565b6146d5816146bf565b82525050565b6146e4816142f8565b82525050565b5f610100820190506146fe5f83018b614444565b61470b602083018a6146b0565b61471860408301896146cc565b61472560608301886146db565b61473260808301876146db565b61473f60a08301866146db565b61474c60c0830185614620565b61475960e0830184614380565b9998505050505050505050565b5f6020828403121561477b5761477a6143b1565b5b5f6147888482850161465e565b91505092915050565b5f805f606084860312156147a8576147a76143b1565b5b5f6147b58682870161465e565b93505060206147c68682870161465e565b92505060406147d7868287016145b1565b9150509250925092565b5f60ff82169050919050565b6147f6816147e1565b8114614800575f80fd5b50565b5f81359050614811816147ed565b92915050565b5f805f6060848603121561482e5761482d6143b1565b5b5f61483b868287016145b1565b935050602061484c86828701614803565b925050604061485d8682870161465e565b9150509250925092565b5f62ffffff82169050919050565b61487e81614867565b82525050565b61488d816147e1565b82525050565b5f60c0820190506148a65f8301896146b0565b6148b36020830188614875565b6148c060408301876146cc565b6148cd6060830186614884565b6148da60808301856146db565b6148e760a08301846146db565b979650505050505050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614913576149126148f2565b5b8235905067ffffffffffffffff8111156149305761492f6148f6565b5b60208301915083602082028301111561494c5761494b6148fa565b5b9250929050565b5f805f6040848603121561496a576149696143b1565b5b5f84013567ffffffffffffffff811115614987576149866143b5565b5b614993868287016148fe565b935093505060206149a686828701614491565b9150509250925092565b6149b981614439565b81146149c3575f80fd5b50565b5f813590506149d4816149b0565b92915050565b5f80604083850312156149f0576149ef6143b1565b5b5f6149fd8582860161465e565b9250506020614a0e858286016149c6565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614a5282614533565b810181811067ffffffffffffffff82111715614a7157614a70614a1c565b5b80604052505050565b5f614a836143a8565b9050614a8f8282614a49565b919050565b5f67ffffffffffffffff821115614aae57614aad614a1c565b5b614ab782614533565b9050602081019050919050565b828183375f83830152505050565b5f614ae4614adf84614a94565b614a7a565b905082815260208101848484011115614b0057614aff614a18565b5b614b0b848285614ac4565b509392505050565b5f82601f830112614b2757614b266148f2565b5b8135614b37848260208601614ad2565b91505092915050565b5f805f8060808587031215614b5857614b576143b1565b5b5f614b658782880161465e565b9450506020614b768782880161465e565b9350506040614b87878288016145b1565b925050606085013567ffffffffffffffff811115614ba857614ba76143b5565b5b614bb487828801614b13565b91505092959194509250565b5f8060408385031215614bd657614bd56143b1565b5b5f614be385828601614491565b9250506020614bf485828601614491565b9150509250929050565b5f67ffffffffffffffff821115614c1857614c17614a1c565b5b602082029050919050565b5f614c35614c3084614bfe565b614a7a565b90508060208402830185811115614c4f57614c4e6148fa565b5b835b81811015614c785780614c6488826149c6565b845260208401935050602081019050614c51565b5050509392505050565b5f82601f830112614c9657614c956148f2565b5b6004614ca3848285614c23565b91505092915050565b5f8060a08385031215614cc257614cc16143b1565b5b5f614ccf85828601614491565b9250506020614ce085828601614c82565b9150509250929050565b5f8060408385031215614d0057614cff6143b1565b5b5f614d0d8582860161465e565b9250506020614d1e8582860161465e565b9150509250929050565b5f60e082019050614d3b5f83018a6144d9565b614d4860208301896146b0565b614d5560408301886146b0565b614d6260608301876146b0565b614d6f60808301866146b0565b614d7c60a08301856146db565b614d8960c0830184614380565b98975050505050505050565b7f696e76616c6964000000000000000000000000000000000000000000000000005f82015250565b5f614dc9600783614280565b9150614dd482614d95565b602082019050919050565b5f6020820190508181035f830152614df681614dbd565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f7065726d697373696f6e000000000000000000000000000000000000000000005f82015250565b5f614e5e600a83614280565b9150614e6982614e2a565b602082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f602082019050614ed25f8301846146b0565b92915050565b5f81519050614ee6816149b0565b92915050565b5f60208284031215614f0157614f006143b1565b5b5f614f0e84828501614ed8565b91505092915050565b7f76756c6e657261626c65000000000000000000000000000000000000000000005f82015250565b5f614f4b600a83614280565b9150614f5682614f17565b602082019050919050565b5f6020820190508181035f830152614f7881614f3f565b9050919050565b7f6f776e65720000000000000000000000000000000000000000000000000000005f82015250565b5f614fb3600583614280565b9150614fbe82614f7f565b602082019050919050565b5f6020820190508181035f830152614fe081614fa7565b9050919050565b7f7a65726f000000000000000000000000000000000000000000000000000000005f82015250565b5f61501b600483614280565b915061502682614fe7565b602082019050919050565b5f6020820190508181035f8301526150488161500f565b9050919050565b5f61505982614377565b91505f820361506b5761506a61430d565b5b600182039050919050565b5f61508082614377565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150b2576150b161430d565b5b600182019050919050565b7f6461726b206167650000000000000000000000000000000000000000000000005f82015250565b5f6150f1600883614280565b91506150fc826150bd565b602082019050919050565b5f6020820190508181035f83015261511e816150e5565b9050919050565b7f636f756e74206d696e00000000000000000000000000000000000000000000005f82015250565b5f615159600983614280565b915061516482615125565b602082019050919050565b5f6020820190508181035f8301526151868161514d565b9050919050565b7f636f756e74206d617800000000000000000000000000000000000000000000005f82015250565b5f6151c1600983614280565b91506151cc8261518d565b602082019050919050565b5f6020820190508181035f8301526151ee816151b5565b9050919050565b7f6c617374536574746c65426c6f636b00000000000000000000000000000000005f82015250565b5f615229600f83614280565b9150615234826151f5565b602082019050919050565b5f6020820190508181035f8301526152568161521d565b9050919050565b5f8160601b9050919050565b5f6152738261525d565b9050919050565b5f61528482615269565b9050919050565b61529c6152978261460f565b61527a565b82525050565b5f819050919050565b6152bc6152b7826144d0565b6152a2565b82525050565b5f819050919050565b6152dc6152d782614377565b6152c2565b82525050565b5f6152ed828661528b565b6014820191506152fd82856152ab565b60208201915061530d82846152cb565b602082019150819050949350505050565b7f646966666963756c7479000000000000000000000000000000000000000000005f82015250565b5f615352600a83614280565b915061535d8261531e565b602082019050919050565b5f6020820190508181035f83015261537f81615346565b9050919050565b7f636f7374000000000000000000000000000000000000000000000000000000005f82015250565b5f6153ba600483614280565b91506153c582615386565b602082019050919050565b5f6020820190508181035f8301526153e7816153ae565b9050919050565b7f67617300000000000000000000000000000000000000000000000000000000005f82015250565b5f615422600383614280565b915061542d826153ee565b602082019050919050565b5f6020820190508181035f83015261544f81615416565b9050919050565b7f746f6b656e4964730000000000000000000000000000000000000000000000005f82015250565b5f61548a600883614280565b915061549582615456565b602082019050919050565b5f6020820190508181035f8301526154b78161547e565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6154e2826154be565b6154ec81856154c8565b93506154fc81856020860161450b565b61550581614533565b840191505092915050565b5f6080820190506155235f830187614620565b6155306020830186614620565b61553d6040830185614380565b818103606083015261554f81846154d8565b905095945050505050565b5f81519050615568816143e4565b92915050565b5f60208284031215615583576155826143b1565b5b5f6155908482850161555a565b91505092915050565b7f72656365697665720000000000000000000000000000000000000000000000005f82015250565b5f6155cd600883614280565b91506155d882615599565b602082019050919050565b5f6020820190508181035f8301526155fa816155c1565b9050919050565b5f61560b82614377565b915061561683614377565b92508261562657615625614e92565b5b828206905092915050565b7f73656e64657200000000000000000000000000000000000000000000000000005f82015250565b5f615665600683614280565b915061567082615631565b602082019050919050565b5f6020820190508181035f83015261569281615659565b9050919050565b7f62616c616e6365000000000000000000000000000000000000000000000000005f82015250565b5f6156cd600783614280565b91506156d882615699565b602082019050919050565b5f6020820190508181035f8301526156fa816156c1565b9050919050565b5f61570b82614377565b915061571683614377565b925082820390508181111561572e5761572d61430d565b5b92915050565b5f6040820190506157475f8301856146b0565b6157546020830184614380565b9392505050565b5f81519050615769816147ed565b92915050565b5f8060408385031215615785576157846143b1565b5b5f6157928582860161575b565b92505060206157a385828601614ed8565b9150509250929050565b6157b6816142f8565b81146157c0575f80fd5b50565b5f815190506157d1816157ad565b92915050565b5f602082840312156157ec576157eb6143b1565b5b5f6157f9848285016157c3565b91505092915050565b5f6060820190506158155f830186614884565b6158226020830185614444565b61582f6040830184614444565b949350505050565b5f67ffffffffffffffff82111561585157615850614a1c565b5b61585a82614533565b9050602081019050919050565b5f61587961587484615837565b614a7a565b90508281526020810184848401111561589557615894614a18565b5b6158a084828561450b565b509392505050565b5f82601f8301126158bc576158bb6148f2565b5b81516158cc848260208601615867565b91505092915050565b5f602082840312156158ea576158e96143b1565b5b5f82015167ffffffffffffffff811115615907576159066143b5565b5b615913848285016158a8565b91505092915050565b7f6f776e65724f66000000000000000000000000000000000000000000000000005f82015250565b5f615950600783614280565b915061595b8261591c565b602082019050919050565b5f6020820190508181035f83015261597d81615944565b9050919050565b5f60049050919050565b5f81905092915050565b5f819050919050565b6159aa81614439565b82525050565b5f6159bb83836159a1565b60208301905092915050565b5f602082019050919050565b6159dc81615984565b6159e6818461598e565b92506159f182615998565b805f5b83811015615a21578151615a0887826159b0565b9650615a13836159c7565b9250506001810190506159f4565b505050505050565b5f60e082019050615a3c5f8301876146b0565b615a4960208301866144d9565b615a5660408301856159d3565b615a6360c0830184614444565b95945050505050565b5f602082019050615a7f5f830184614884565b92915050565b7f656d7074790000000000000000000000000000000000000000000000000000005f82015250565b5f615ab9600583614280565b9150615ac482615a85565b602082019050919050565b5f6020820190508181035f830152615ae681615aad565b9050919050565b7f6d73672e76616c756500000000000000000000000000000000000000000000005f82015250565b5f615b21600983614280565b9150615b2c82615aed565b602082019050919050565b5f6020820190508181035f830152615b4e81615b15565b9050919050565b7f626c6f636b6564000000000000000000000000000000000000000000000000005f82015250565b5f615b89600783614280565b9150615b9482615b55565b602082019050919050565b5f6020820190508181035f830152615bb681615b7d565b9050919050565b5f615bc782614377565b9150615bd283614377565b9250828201905080821115615bea57615be961430d565b5b92915050565b5f615bfa82614377565b9150615c0583614377565b9250828202615c1381614377565b91508282048414831517615c2a57615c2961430d565b5b5092915050565b5f615c3b82614377565b9150615c4683614377565b925082615c5657615c55614e92565b5b828204905092915050565b5f8160e01b9050919050565b5f615c7782615c61565b9050919050565b615c8f615c8a8261446c565b615c6d565b82525050565b5f615ca082856152ab565b602082019150615cb08284615c7e565b6004820191508190509392505050565b5f615ccb82856152ab565b602082019150615cdb82846152cb565b6020820191508190509392505050565b5f615cf5826142f8565b9150615d00836142f8565b925082615d1057615d0f614e92565b5b828204905092915050565b5f615d25826147e1565b9150615d30836147e1565b9250828202615d3e816147e1565b9150808214615d5057615d4f61430d565b5b5092915050565b5f6affffffffffffffffffffff82169050919050565b5f615d7782615d57565b9150615d8283615d57565b925082615d9257615d91614e92565b5b828206905092915050565b5f615da7826142f8565b9150615db2836142f8565b9250828202615dc0816142f8565b9150808214615dd257615dd161430d565b5b5092915050565b5f61010082019050615ded5f83018b6146b0565b615dfa602083018a6144d9565b615e076040830189614620565b615e146060830188614875565b615e2160808301876146db565b615e2e60a08301866146b0565b615e3b60c0830185614884565b615e4860e08301846146b0565b9998505050505050505050565b7f63726561746f72000000000000000000000000000000000000000000000000005f82015250565b5f615e89600783614280565b9150615e9482615e55565b602082019050919050565b5f6020820190508181035f830152615eb681615e7d565b9050919050565b5f61012082019050615ed15f83018c6144d9565b615ede602083018b6146db565b615eeb604083018a614875565b615ef860608301896146b0565b615f0560808301886146db565b615f1260a08301876146db565b615f1f60c08301866146b0565b615f2c60e0830185614444565b615f3a6101008301846146b0565b9a995050505050505050505056fe446f6f6d736461793a20536574746c657273206f66207468652057617374656c616e64a26469706673582212200bfbe561ba45bf8c8c2e3c192f11d879c1c625fe33be84f6769e1f08c3f0dbea64736f6c63430008150033

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

00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f00000597a7e03ca484679197fbc312c8120b53a983aad3362bc462536a998a380000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000024

-----Decoded View---------------
Arg [0] : _darkAge (address): 0x44104DC98668a293C64d26A90e5b2883cf835D8F
Arg [1] : _BASE_DIFFICULTY (uint256): 38597363079105398474523661669562635951089994888546854679819194669304376
Arg [2] : _DIFFICULTY_RAMP (uint256): 15000
Arg [3] : _DIFFICULTY_COOLDOWN (uint256): 25
Arg [4] : _DIFFICULTY_COOLDOWN_SLOPE (uint256): 15
Arg [5] : _COLLAPSE_INITIAL (uint256): 86400
Arg [6] : _COLLAPSE_RAMP (uint256): 30
Arg [7] : _COLLAPSE_MIN (uint256): 36

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000044104dc98668a293c64d26a90e5b2883cf835d8f
Arg [1] : 00000597a7e03ca484679197fbc312c8120b53a983aad3362bc462536a998a38
Arg [2] : 0000000000000000000000000000000000000000000000000000000000003a98
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000024


Loading...
Loading
Loading...
Loading
[ 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.