Address Details
contract

0xC85d80669400Ea6a6AED0fed4b5E69810398a7eA

Contract Name
Legacies
Creator
0xc167ec–120669 at 0xc93f64–6a6a7c
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
18 Transactions
Transfers
0 Transfers
Gas Used
1,178,566
Last Balance Update
14459250
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
Legacies




Optimization enabled
false
Compiler version
v0.8.9+commit.e5eed63a




EVM Version
london




Verified at
2023-01-24T01:00:03.235149Z

contracts/Legacies.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol";
import "./TransferHelper.sol";

interface IERC20 {
    function balanceOf(address owner) external returns(uint256 balance);
    function allowance(address owner, address spender) external returns(uint256 remaining);
}

contract Legacies is KeeperCompatible {
    Legacy[] public legacies;
    mapping(address=>uint256) public legacyIndexes;

    struct Legacy {
        address owner;
        address legatee;
        address[] tokens;
        uint256 lastSeen;
        uint256 checkInterval;
        bool fulfilled;
    }

    constructor() {
        //Create dummy legacy to occupy index 0
        create(address(0), 0);
    }

    function create(address _legatee, uint256 _checkInterval) public {
        uint256 _index = legacies.length;
        // Revert if msg.sender already has an active legacy!
        require(legacyIndexes[msg.sender] == 0, "Legacy exist!");
        legacies.push(Legacy(msg.sender, _legatee, new address[](0), block.timestamp, _checkInterval, false));
        legacyIndexes[msg.sender] = _index;
    }

    function cancel() public {
        uint256 _index = legacyIndexes[msg.sender];
        require(legacies[_index].owner == msg.sender, "not owner!");
        delete legacies[_index];
        legacyIndexes[msg.sender] = 0;
    }
    
    function updateLegacy(address _legatee, uint256 _checkInterval) public {
        uint256 _index = legacyIndexes[msg.sender];
        require(legacies[_index].owner == msg.sender, "not owner!");
        legacies[_index].checkInterval = _checkInterval;
        legacies[_index].legatee = _legatee;
    }

    function updateCheckInterval(uint256 _checkInterval) public {
        uint256 _index = legacyIndexes[msg.sender];
        require(legacies[_index].owner == msg.sender, "not owner!");
        legacies[_index].checkInterval = _checkInterval;
    }

    function updateLegatee(address _legatee) public {
        uint256 _index = legacyIndexes[msg.sender];
        require(legacies[_index].owner == msg.sender, "not owner!");
        legacies[_index].legatee = _legatee;
    }

    function checkIn() public {
        uint256 _index = legacyIndexes[msg.sender];
        require(legacies[_index].owner == msg.sender, "not owner!");
        legacies[_index].lastSeen = block.timestamp;
    }

    function getLegacyTokens(uint256 _index) public view returns(address[] memory) {
        return legacies[_index].tokens;
    }

    function addTokens(address[] memory _tokens) public {
	uint256 _index = legacyIndexes[msg.sender];
        for (uint256 i = 0; i < _tokens.length; i++) {
            IERC20 _token = IERC20(_tokens[i]);
            //Confirm token approval
            require(_token.allowance(msg.sender, address(this)) == type(uint256).max, "not approved!");
            legacies[_index].tokens.push(_tokens[i]);
        }
    }

    function checkUpkeep(bytes calldata /* checkData */) external view override returns (bool upkeepNeeded, bytes memory performData ) {
        upkeepNeeded = false;
        //Get 10 legacies due for fulfillment
        for (uint256 i = 0; i < legacies.length; i++) {
            Legacy memory _legacy = legacies[i];
            if (!_legacy.fulfilled && block.timestamp - _legacy.lastSeen > _legacy.checkInterval) {
                upkeepNeeded = true;
                performData = abi.encode(i);
                break;
            }
        }

    }

    function performUpkeep(bytes calldata performData ) external override {
        //Decode perfromData
        uint256 index = abi.decode(performData, (uint256));

        Legacy memory _legacy = legacies[index];    
        //Confirm performData
        require(block.timestamp - _legacy.lastSeen > _legacy.checkInterval, "not due!" );
        legacies[index].fulfilled = true;

        //Transfer tokens to legatee
        for (uint256 i = 0; i < _legacy.tokens.length; i++) {
  		    address _token = _legacy.tokens[i];
            uint256 _allowed = IERC20(_token).allowance(_legacy.owner, address(this));
            uint256 _balance = IERC20(_token).balanceOf(_legacy.owner);
            // Skip tokens not approved
            if (_allowed < _balance) {
                continue;
            }
            TransferHelper.safeTransferFrom(
                _token,
                _legacy.owner,
                _legacy.legatee,
                _balance
            );
        }
    }
}
        

/_chainlink/contracts/src/v0.8/AutomationBase.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract AutomationBase {
  error OnlySimulatedBackend();

  /**
   * @notice method that allows it to be simulated via eth_call by checking that
   * the sender is the zero address.
   */
  function preventExecution() internal view {
    if (tx.origin != address(0)) {
      revert OnlySimulatedBackend();
    }
  }

  /**
   * @notice modifier that allows it to be simulated via eth_call by checking
   * that the sender is the zero address.
   */
  modifier cannotExecute() {
    preventExecution();
    _;
  }
}
          

/_chainlink/contracts/src/v0.8/AutomationCompatible.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./AutomationBase.sol";
import "./interfaces/AutomationCompatibleInterface.sol";

abstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}
          

/_chainlink/contracts/src/v0.8/KeeperCompatible.sol

// SPDX-License-Identifier: MIT
/**
 * @notice This is a deprecated interface. Please use AutomationCompatible directly.
 */
pragma solidity ^0.8.0;
import {AutomationCompatible as KeeperCompatible} from "./AutomationCompatible.sol";
import {AutomationBase as KeeperBase} from "./AutomationBase.sol";
import {AutomationCompatibleInterface as KeeperCompatibleInterface} from "./interfaces/AutomationCompatibleInterface.sol";
          

/_chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AutomationCompatibleInterface {
  /**
   * @notice method that is simulated by the keepers to see if any work actually
   * needs to be performed. This method does does not actually need to be
   * executable, and since it is only ever simulated it can consume lots of gas.
   * @dev To ensure that it is never called, you may want to add the
   * cannotExecute modifier from KeeperBase to your implementation of this
   * method.
   * @param checkData specified in the upkeep registration so it is always the
   * same for a registered upkeep. This can easily be broken down into specific
   * arguments using `abi.decode`, so multiple upkeeps can be registered on the
   * same contract and easily differentiated by the contract.
   * @return upkeepNeeded boolean to indicate whether the keeper should call
   * performUpkeep or not.
   * @return performData bytes that the keeper should call performUpkeep with, if
   * upkeep is needed. If you would like to encode data to decode later, try
   * `abi.encode`.
   */
  function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);

  /**
   * @notice method that is actually executed by the keepers, via the registry.
   * The data returned by the checkUpkeep simulation will be passed into
   * this method to actually be executed.
   * @dev The input to this method should not be trusted, and the caller of the
   * method should not even be restricted to any single registry. Anyone should
   * be able call it, and the input should be validated, there is no guarantee
   * that the data passed in is the performData returned from checkUpkeep. This
   * could happen due to malicious keepers, racing keepers, or simply a state
   * change while the performUpkeep transaction is waiting for confirmation.
   * Always validate the data passed in.
   * @param performData is the data which was passed back from the checkData
   * simulation. If it is encoded, it can easily be decoded into other types by
   * calling `abi.decode`. This data should not be trusted, and should be
   * validated against the contract's current state.
   */
  function performUpkeep(bytes calldata performData) external;
}
          

/contracts/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"OnlySimulatedBackend","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addTokens","inputs":[{"type":"address[]","name":"_tokens","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkIn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"upkeepNeeded","internalType":"bool"},{"type":"bytes","name":"performData","internalType":"bytes"}],"name":"checkUpkeep","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"create","inputs":[{"type":"address","name":"_legatee","internalType":"address"},{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getLegacyTokens","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"legatee","internalType":"address"},{"type":"uint256","name":"lastSeen","internalType":"uint256"},{"type":"uint256","name":"checkInterval","internalType":"uint256"},{"type":"bool","name":"fulfilled","internalType":"bool"}],"name":"legacies","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"legacyIndexes","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"performUpkeep","inputs":[{"type":"bytes","name":"performData","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateCheckInterval","inputs":[{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLegacy","inputs":[{"type":"address","name":"_legatee","internalType":"address"},{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLegatee","inputs":[{"type":"address","name":"_legatee","internalType":"address"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b50620000256000806200002b60201b60201c565b62000419565b6000808054905090506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620000b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000b090620003c8565b60405180910390fd5b60006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156200011c576200011b620003ea565b5b6040519080825280602002602001820160405280156200014b5781602001602082028036833780820191505090505b50815260200142815260200184815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908051906020019062000239929190620002b9565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908315150217905550505080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b82805482825590600052602060002090810192821562000335579160200282015b82811115620003345782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620002da565b5b50905062000344919062000348565b5090565b5b808211156200036357600081600090555060010162000349565b5090565b600082825260208201905092915050565b7f4c65676163792065786973742100000000000000000000000000000000000000600082015250565b6000620003b0600d8362000367565b9150620003bd8262000378565b602082019050919050565b60006020820190508181036000830152620003e381620003a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121e280620004296000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80635b63c009116100715780635b63c0091461014f5780636031b9d21461016b5780636e04ff0d1461019f578063884c53ad146101d0578063c91e78e814610200578063ea8a1af014610230576100b4565b80630ecaea73146100b9578063183ff085146100d55780631ffd0844146100df578063443e0184146100fb5780634585e33b146101175780634ae05c7d14610133575b600080fd5b6100d360048036038101906100ce91906117f2565b61023a565b005b6100dd6104bf565b005b6100f960048036038101906100f49190611832565b6105e3565b005b6101156004803603810190610110919061185f565b610708565b005b610131600480360381019061012c91906118f1565b610867565b005b61014d60048036038101906101489190611a8d565b610c43565b005b610169600480360381019061016491906117f2565b610e59565b005b61018560048036038101906101809190611832565b610fe3565b604051610196959493929190611b0f565b60405180910390f35b6101b960048036038101906101b491906118f1565b611076565b6040516101c7929190611bea565b60405180910390f35b6101ea60048036038101906101e5919061185f565b611298565b6040516101f79190611c1a565b60405180910390f35b61021a60048036038101906102159190611832565b6112b0565b6040516102279190611cf3565b60405180910390f35b610238611363565b005b6000808054905090506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bc90611d72565b60405180910390fd5b60006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156103255761032461194f565b5b6040519080825280602002602001820160405280156103535781602001602082028036833780820191505090505b50815260200142815260200184815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908051906020019061043f929190611682565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908315150217905550505080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061052e5761052d611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90611e0d565b60405180910390fd5b42600082815481106105cb576105ca611d92565b5b90600052602060002090600602016003018190555050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061065257610651611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d190611e0d565b60405180910390fd5b81600082815481106106ef576106ee611d92565b5b9060005260206000209060060201600401819055505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061077757610776611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611e0d565b60405180910390fd5b816000828154811061081457610813611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082828101906108789190611832565b9050600080828154811061088f5761088e611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156109d957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161098f575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060800151816060015142610a289190611e5c565b11610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90611edc565b60405180910390fd5b600160008381548110610a7e57610a7d611d92565b5b906000526020600020906006020160050160006101000a81548160ff02191690831515021790555060005b816040015151811015610c3c57600082604001518281518110610acf57610ace611d92565b5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8560000151306040518363ffffffff1660e01b8152600401610b1a929190611efc565b602060405180830381600087803b158015610b3457600080fd5b505af1158015610b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6c9190611f3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a0823186600001516040518263ffffffff1660e01b8152600401610bad9190611f67565b602060405180830381600087803b158015610bc757600080fd5b505af1158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff9190611f3a565b905080821015610c1157505050610c29565b610c25838660000151876020015184611549565b5050505b8080610c3490611f82565b915050610aa9565b5050505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8251811015610e54576000838281518110610ca857610ca7611d92565b5b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610d0e929190611efc565b602060405180830381600087803b158015610d2857600080fd5b505af1158015610d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d609190611f3a565b14610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612017565b60405180910390fd5b60008381548110610db457610db3611d92565b5b9060005260206000209060060201600201848381518110610dd857610dd7611d92565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610e4c90611f82565b915050610c8a565b505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660008281548110610ec857610ec7611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790611e0d565b60405180910390fd5b8160008281548110610f6557610f64611d92565b5b9060005260206000209060060201600401819055508260008281548110610f8f57610f8e611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008181548110610ff357600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050160009054906101000a900460ff16905085565b600060606000915060005b6000805490508110156112905760008082815481106110a3576110a2611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156111ed57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111a3575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060a0015115801561124b575080608001518160600151426112499190611e5c565b115b1561127c5760019350816040516020016112659190611c1a565b604051602081830303815290604052925050611290565b50808061128890611f82565b915050611081565b509250929050565b60016020528060005260406000206000915090505481565b6060600082815481106112c6576112c5611d92565b5b906000526020600020906006020160020180548060200260200160405190810160405280929190818152602001828054801561135757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161130d575b50505050509050919050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff16600082815481106113d2576113d1611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190611e0d565b60405180910390fd5b6000818154811061146e5761146d611d92565b5b9060005260206000209060060201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160006114db919061170c565b600382016000905560048201600090556005820160006101000a81549060ff021916905550506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161157d93929190612037565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115cb91906120aa565b6000604051808303816000865af19150503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b509150915081801561163b575060008151148061163a57508080602001905181019061163991906120ed565b5b5b61167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061218c565b60405180910390fd5b505050505050565b8280548282559060005260206000209081019282156116fb579160200282015b828111156116fa5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906116a2565b5b509050611708919061172d565b5090565b508054600082559060005260206000209081019061172a919061172d565b50565b5b8082111561174657600081600090555060010161172e565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117898261175e565b9050919050565b6117998161177e565b81146117a457600080fd5b50565b6000813590506117b681611790565b92915050565b6000819050919050565b6117cf816117bc565b81146117da57600080fd5b50565b6000813590506117ec816117c6565b92915050565b6000806040838503121561180957611808611754565b5b6000611817858286016117a7565b9250506020611828858286016117dd565b9150509250929050565b60006020828403121561184857611847611754565b5b6000611856848285016117dd565b91505092915050565b60006020828403121561187557611874611754565b5b6000611883848285016117a7565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126118b1576118b061188c565b5b8235905067ffffffffffffffff8111156118ce576118cd611891565b5b6020830191508360018202830111156118ea576118e9611896565b5b9250929050565b6000806020838503121561190857611907611754565b5b600083013567ffffffffffffffff81111561192657611925611759565b5b6119328582860161189b565b92509250509250929050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6119878261193e565b810181811067ffffffffffffffff821117156119a6576119a561194f565b5b80604052505050565b60006119b961174a565b90506119c5828261197e565b919050565b600067ffffffffffffffff8211156119e5576119e461194f565b5b602082029050602081019050919050565b6000611a09611a04846119ca565b6119af565b90508083825260208201905060208402830185811115611a2c57611a2b611896565b5b835b81811015611a555780611a4188826117a7565b845260208401935050602081019050611a2e565b5050509392505050565b600082601f830112611a7457611a7361188c565b5b8135611a848482602086016119f6565b91505092915050565b600060208284031215611aa357611aa2611754565b5b600082013567ffffffffffffffff811115611ac157611ac0611759565b5b611acd84828501611a5f565b91505092915050565b611adf8161177e565b82525050565b611aee816117bc565b82525050565b60008115159050919050565b611b0981611af4565b82525050565b600060a082019050611b246000830188611ad6565b611b316020830187611ad6565b611b3e6040830186611ae5565b611b4b6060830185611ae5565b611b586080830184611b00565b9695505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b9c578082015181840152602081019050611b81565b83811115611bab576000848401525b50505050565b6000611bbc82611b62565b611bc68185611b6d565b9350611bd6818560208601611b7e565b611bdf8161193e565b840191505092915050565b6000604082019050611bff6000830185611b00565b8181036020830152611c118184611bb1565b90509392505050565b6000602082019050611c2f6000830184611ae5565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611c6a8161177e565b82525050565b6000611c7c8383611c61565b60208301905092915050565b6000602082019050919050565b6000611ca082611c35565b611caa8185611c40565b9350611cb583611c51565b8060005b83811015611ce6578151611ccd8882611c70565b9750611cd883611c88565b925050600181019050611cb9565b5085935050505092915050565b60006020820190508181036000830152611d0d8184611c95565b905092915050565b600082825260208201905092915050565b7f4c65676163792065786973742100000000000000000000000000000000000000600082015250565b6000611d5c600d83611d15565b9150611d6782611d26565b602082019050919050565b60006020820190508181036000830152611d8b81611d4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6e6f74206f776e65722100000000000000000000000000000000000000000000600082015250565b6000611df7600a83611d15565b9150611e0282611dc1565b602082019050919050565b60006020820190508181036000830152611e2681611dea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e67826117bc565b9150611e72836117bc565b925082821015611e8557611e84611e2d565b5b828203905092915050565b7f6e6f742064756521000000000000000000000000000000000000000000000000600082015250565b6000611ec6600883611d15565b9150611ed182611e90565b602082019050919050565b60006020820190508181036000830152611ef581611eb9565b9050919050565b6000604082019050611f116000830185611ad6565b611f1e6020830184611ad6565b9392505050565b600081519050611f34816117c6565b92915050565b600060208284031215611f5057611f4f611754565b5b6000611f5e84828501611f25565b91505092915050565b6000602082019050611f7c6000830184611ad6565b92915050565b6000611f8d826117bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fc057611fbf611e2d565b5b600182019050919050565b7f6e6f7420617070726f7665642100000000000000000000000000000000000000600082015250565b6000612001600d83611d15565b915061200c82611fcb565b602082019050919050565b6000602082019050818103600083015261203081611ff4565b9050919050565b600060608201905061204c6000830186611ad6565b6120596020830185611ad6565b6120666040830184611ae5565b949350505050565b600081905092915050565b600061208482611b62565b61208e818561206e565b935061209e818560208601611b7e565b80840191505092915050565b60006120b68284612079565b915081905092915050565b6120ca81611af4565b81146120d557600080fd5b50565b6000815190506120e7816120c1565b92915050565b60006020828403121561210357612102611754565b5b6000612111848285016120d8565b91505092915050565b7f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260008201527f616e7366657246726f6d206661696c6564000000000000000000000000000000602082015250565b6000612176603183611d15565b91506121818261211a565b604082019050919050565b600060208201905081810360008301526121a581612169565b905091905056fea26469706673582212201a7dab81aab52f5b0def81e816f92923c5eca667c56eb90b0ad92f906369c75764736f6c63430008090033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80635b63c009116100715780635b63c0091461014f5780636031b9d21461016b5780636e04ff0d1461019f578063884c53ad146101d0578063c91e78e814610200578063ea8a1af014610230576100b4565b80630ecaea73146100b9578063183ff085146100d55780631ffd0844146100df578063443e0184146100fb5780634585e33b146101175780634ae05c7d14610133575b600080fd5b6100d360048036038101906100ce91906117f2565b61023a565b005b6100dd6104bf565b005b6100f960048036038101906100f49190611832565b6105e3565b005b6101156004803603810190610110919061185f565b610708565b005b610131600480360381019061012c91906118f1565b610867565b005b61014d60048036038101906101489190611a8d565b610c43565b005b610169600480360381019061016491906117f2565b610e59565b005b61018560048036038101906101809190611832565b610fe3565b604051610196959493929190611b0f565b60405180910390f35b6101b960048036038101906101b491906118f1565b611076565b6040516101c7929190611bea565b60405180910390f35b6101ea60048036038101906101e5919061185f565b611298565b6040516101f79190611c1a565b60405180910390f35b61021a60048036038101906102159190611832565b6112b0565b6040516102279190611cf3565b60405180910390f35b610238611363565b005b6000808054905090506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bc90611d72565b60405180910390fd5b60006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156103255761032461194f565b5b6040519080825280602002602001820160405280156103535781602001602082028036833780820191505090505b50815260200142815260200184815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908051906020019061043f929190611682565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908315150217905550505080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061052e5761052d611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90611e0d565b60405180910390fd5b42600082815481106105cb576105ca611d92565b5b90600052602060002090600602016003018190555050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061065257610651611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d190611e0d565b60405180910390fd5b81600082815481106106ef576106ee611d92565b5b9060005260206000209060060201600401819055505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061077757610776611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611e0d565b60405180910390fd5b816000828154811061081457610813611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082828101906108789190611832565b9050600080828154811061088f5761088e611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156109d957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161098f575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060800151816060015142610a289190611e5c565b11610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90611edc565b60405180910390fd5b600160008381548110610a7e57610a7d611d92565b5b906000526020600020906006020160050160006101000a81548160ff02191690831515021790555060005b816040015151811015610c3c57600082604001518281518110610acf57610ace611d92565b5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8560000151306040518363ffffffff1660e01b8152600401610b1a929190611efc565b602060405180830381600087803b158015610b3457600080fd5b505af1158015610b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6c9190611f3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a0823186600001516040518263ffffffff1660e01b8152600401610bad9190611f67565b602060405180830381600087803b158015610bc757600080fd5b505af1158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff9190611f3a565b905080821015610c1157505050610c29565b610c25838660000151876020015184611549565b5050505b8080610c3490611f82565b915050610aa9565b5050505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8251811015610e54576000838281518110610ca857610ca7611d92565b5b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610d0e929190611efc565b602060405180830381600087803b158015610d2857600080fd5b505af1158015610d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d609190611f3a565b14610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612017565b60405180910390fd5b60008381548110610db457610db3611d92565b5b9060005260206000209060060201600201848381518110610dd857610dd7611d92565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610e4c90611f82565b915050610c8a565b505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660008281548110610ec857610ec7611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790611e0d565b60405180910390fd5b8160008281548110610f6557610f64611d92565b5b9060005260206000209060060201600401819055508260008281548110610f8f57610f8e611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008181548110610ff357600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050160009054906101000a900460ff16905085565b600060606000915060005b6000805490508110156112905760008082815481106110a3576110a2611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156111ed57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111a3575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060a0015115801561124b575080608001518160600151426112499190611e5c565b115b1561127c5760019350816040516020016112659190611c1a565b604051602081830303815290604052925050611290565b50808061128890611f82565b915050611081565b509250929050565b60016020528060005260406000206000915090505481565b6060600082815481106112c6576112c5611d92565b5b906000526020600020906006020160020180548060200260200160405190810160405280929190818152602001828054801561135757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161130d575b50505050509050919050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff16600082815481106113d2576113d1611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190611e0d565b60405180910390fd5b6000818154811061146e5761146d611d92565b5b9060005260206000209060060201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160006114db919061170c565b600382016000905560048201600090556005820160006101000a81549060ff021916905550506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161157d93929190612037565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115cb91906120aa565b6000604051808303816000865af19150503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b509150915081801561163b575060008151148061163a57508080602001905181019061163991906120ed565b5b5b61167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061218c565b60405180910390fd5b505050505050565b8280548282559060005260206000209081019282156116fb579160200282015b828111156116fa5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906116a2565b5b509050611708919061172d565b5090565b508054600082559060005260206000209081019061172a919061172d565b50565b5b8082111561174657600081600090555060010161172e565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117898261175e565b9050919050565b6117998161177e565b81146117a457600080fd5b50565b6000813590506117b681611790565b92915050565b6000819050919050565b6117cf816117bc565b81146117da57600080fd5b50565b6000813590506117ec816117c6565b92915050565b6000806040838503121561180957611808611754565b5b6000611817858286016117a7565b9250506020611828858286016117dd565b9150509250929050565b60006020828403121561184857611847611754565b5b6000611856848285016117dd565b91505092915050565b60006020828403121561187557611874611754565b5b6000611883848285016117a7565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126118b1576118b061188c565b5b8235905067ffffffffffffffff8111156118ce576118cd611891565b5b6020830191508360018202830111156118ea576118e9611896565b5b9250929050565b6000806020838503121561190857611907611754565b5b600083013567ffffffffffffffff81111561192657611925611759565b5b6119328582860161189b565b92509250509250929050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6119878261193e565b810181811067ffffffffffffffff821117156119a6576119a561194f565b5b80604052505050565b60006119b961174a565b90506119c5828261197e565b919050565b600067ffffffffffffffff8211156119e5576119e461194f565b5b602082029050602081019050919050565b6000611a09611a04846119ca565b6119af565b90508083825260208201905060208402830185811115611a2c57611a2b611896565b5b835b81811015611a555780611a4188826117a7565b845260208401935050602081019050611a2e565b5050509392505050565b600082601f830112611a7457611a7361188c565b5b8135611a848482602086016119f6565b91505092915050565b600060208284031215611aa357611aa2611754565b5b600082013567ffffffffffffffff811115611ac157611ac0611759565b5b611acd84828501611a5f565b91505092915050565b611adf8161177e565b82525050565b611aee816117bc565b82525050565b60008115159050919050565b611b0981611af4565b82525050565b600060a082019050611b246000830188611ad6565b611b316020830187611ad6565b611b3e6040830186611ae5565b611b4b6060830185611ae5565b611b586080830184611b00565b9695505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b9c578082015181840152602081019050611b81565b83811115611bab576000848401525b50505050565b6000611bbc82611b62565b611bc68185611b6d565b9350611bd6818560208601611b7e565b611bdf8161193e565b840191505092915050565b6000604082019050611bff6000830185611b00565b8181036020830152611c118184611bb1565b90509392505050565b6000602082019050611c2f6000830184611ae5565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611c6a8161177e565b82525050565b6000611c7c8383611c61565b60208301905092915050565b6000602082019050919050565b6000611ca082611c35565b611caa8185611c40565b9350611cb583611c51565b8060005b83811015611ce6578151611ccd8882611c70565b9750611cd883611c88565b925050600181019050611cb9565b5085935050505092915050565b60006020820190508181036000830152611d0d8184611c95565b905092915050565b600082825260208201905092915050565b7f4c65676163792065786973742100000000000000000000000000000000000000600082015250565b6000611d5c600d83611d15565b9150611d6782611d26565b602082019050919050565b60006020820190508181036000830152611d8b81611d4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6e6f74206f776e65722100000000000000000000000000000000000000000000600082015250565b6000611df7600a83611d15565b9150611e0282611dc1565b602082019050919050565b60006020820190508181036000830152611e2681611dea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e67826117bc565b9150611e72836117bc565b925082821015611e8557611e84611e2d565b5b828203905092915050565b7f6e6f742064756521000000000000000000000000000000000000000000000000600082015250565b6000611ec6600883611d15565b9150611ed182611e90565b602082019050919050565b60006020820190508181036000830152611ef581611eb9565b9050919050565b6000604082019050611f116000830185611ad6565b611f1e6020830184611ad6565b9392505050565b600081519050611f34816117c6565b92915050565b600060208284031215611f5057611f4f611754565b5b6000611f5e84828501611f25565b91505092915050565b6000602082019050611f7c6000830184611ad6565b92915050565b6000611f8d826117bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fc057611fbf611e2d565b5b600182019050919050565b7f6e6f7420617070726f7665642100000000000000000000000000000000000000600082015250565b6000612001600d83611d15565b915061200c82611fcb565b602082019050919050565b6000602082019050818103600083015261203081611ff4565b9050919050565b600060608201905061204c6000830186611ad6565b6120596020830185611ad6565b6120666040830184611ae5565b949350505050565b600081905092915050565b600061208482611b62565b61208e818561206e565b935061209e818560208601611b7e565b80840191505092915050565b60006120b68284612079565b915081905092915050565b6120ca81611af4565b81146120d557600080fd5b50565b6000815190506120e7816120c1565b92915050565b60006020828403121561210357612102611754565b5b6000612111848285016120d8565b91505092915050565b7f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260008201527f616e7366657246726f6d206661696c6564000000000000000000000000000000602082015250565b6000612176603183611d15565b91506121818261211a565b604082019050919050565b600060208201905081810360008301526121a581612169565b905091905056fea26469706673582212201a7dab81aab52f5b0def81e816f92923c5eca667c56eb90b0ad92f906369c75764736f6c63430008090033