false
true
0

Contract Address Details

0x78B37409628e10df0B661C6B205B872a4DF8DD6E

Contract Name
Account
Creator
0x3e990e–e2cb87 at 0xbdeeb3–e1bbf9
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26315101
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
Account




Optimization enabled
true
Compiler version
v0.4.24+commit.e67f0147




Optimization runs
200
EVM Version
byzantium




Verified at
2026-04-18T11:20:01.631812Z

Account.sol

pragma solidity 0.4.24;

contract SelfAuthorized {
    modifier authorized() {
        require(msg.sender == address(this), "Method can only be called from this contract");
        _;
    }
}


contract ErrorUtils {

    event LogError(string methodSig, string errMsg);
    event LogErrorWithHintBytes32(bytes32 indexed bytes32Value, string methodSig, string errMsg);
    event LogErrorWithHintAddress(address indexed addressValue, string methodSig, string errMsg);

}


contract WETH9 {
    string public name     = "Wrapped Ether";
    string public symbol   = "WETH";
    uint8  public decimals = 18;

    event  Approval(address indexed _owner, address indexed _spender, uint _value);
    event  Transfer(address indexed _from, address indexed _to, uint _value);
    event  Deposit(address indexed _owner, uint _value);
    event  Withdrawal(address indexed _owner, uint _value);

    mapping (address => uint)                       public  balanceOf;
    mapping (address => mapping (address => uint))  public  allowance;

    function() public payable {
        deposit();
    }

    function deposit() public payable {
        balanceOf[msg.sender] += msg.value;
        Deposit(msg.sender, msg.value);
    }

    function withdraw(uint wad) public {
        require(balanceOf[msg.sender] >= wad);
        balanceOf[msg.sender] -= wad;
        msg.sender.transfer(wad);
        Withdrawal(msg.sender, wad);
    }

    function totalSupply() public view returns (uint) {
        return this.balance;
    }

    function approve(address guy, uint wad) public returns (bool) {
        allowance[msg.sender][guy] = wad;
        Approval(msg.sender, guy, wad);
        return true;
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        require(balanceOf[src] >= wad);

        if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
            require(allowance[src][msg.sender] >= wad);
            allowance[src][msg.sender] -= wad;
        }

        balanceOf[src] -= wad;
        balanceOf[dst] += wad;

        Transfer(src, dst, wad);

        return true;
    }
}


contract Utils {

    modifier addressValid(address _address) {
        require(_address != address(0), "Utils::_ INVALID_ADDRESS");
        _;
    }

}


contract DSAuthority {
    function canCall(address src, address dst, bytes4 sig) public view returns (bool);
}


contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}


contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    constructor() public {
        owner = msg.sender;
        emit LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        public
        auth
    {
        owner = owner_;
        emit LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        public
        auth
    {
        authority = authority_;
        emit LogSetAuthority(authority);
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig), "DSAuth::_ SENDER_NOT_AUTHORIZED");
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }
}


contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint              wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}


interface ERC20 {

    function name() external view returns(string);
    function symbol() external view returns(string);
    function decimals() external view returns(uint8);
    function totalSupply() external view returns (uint);

    function balanceOf(address tokenOwner) external view returns (uint balance);
    function allowance(address tokenOwner, address spender) external view returns (uint remaining);
    function transfer(address to, uint tokens) external returns (bool success);
    function approve(address spender, uint tokens) external returns (bool success);
    function transferFrom(address from, address to, uint tokens) external returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}


contract MasterCopy is SelfAuthorized {
  // masterCopy always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.
  // It should also always be ensured that the address is stored alone (uses a full word)
    address masterCopy;

  /// @dev Allows to upgrade the contract. This can only be done via a Safe transaction.
  /// @param _masterCopy New contract address.
    function changeMasterCopy(address _masterCopy)
        public
        authorized
    {
        // Master copy address cannot be null.
        require(_masterCopy != 0, "Invalid master copy address provided");
        masterCopy = _masterCopy;
    }
}


contract Config is DSNote, DSAuth, Utils {

    WETH9 public weth9;
    mapping (address => bool) public isAccountHandler;
    mapping (address => bool) public isAdmin;
    address[] public admins;
    bool public disableAdminControl = false;
    
    event LogAdminAdded(address indexed _admin, address _by);
    event LogAdminRemoved(address indexed _admin, address _by);

    constructor() public {
        admins.push(msg.sender);
        isAdmin[msg.sender] = true;
    }

    modifier onlyAdmin(){
        require(isAdmin[msg.sender], "Config::_ SENDER_NOT_AUTHORIZED");
        _;
    }

    function setWETH9
    (
        address _weth9
    ) 
        public
        auth
        note
        addressValid(_weth9) 
    {
        weth9 = WETH9(_weth9);
    }

    function setAccountHandler
    (
        address _accountHandler,
        bool _isAccountHandler
    )
        public
        auth
        note
        addressValid(_accountHandler)
    {
        isAccountHandler[_accountHandler] = _isAccountHandler;
    }

    function toggleAdminsControl() 
        public
        auth
        note
    {
        disableAdminControl = !disableAdminControl;
    }

    function isAdminValid(address _admin)
        public
        view
        returns (bool)
    {
        if(disableAdminControl) {
            return true;
        } else {
            return isAdmin[_admin];
        }
    }

    function getAllAdmins()
        public
        view
        returns(address[])
    {
        return admins;
    }

    function addAdmin
    (
        address _admin
    )
        external
        note
        onlyAdmin
        addressValid(_admin)
    {   
        require(!isAdmin[_admin], "Config::addAdmin ADMIN_ALREADY_EXISTS");

        admins.push(_admin);
        isAdmin[_admin] = true;

        emit LogAdminAdded(_admin, msg.sender);
    }

    function removeAdmin
    (
        address _admin
    ) 
        external
        note
        onlyAdmin
        addressValid(_admin)
    {   
        require(isAdmin[_admin], "Config::removeAdmin ADMIN_DOES_NOT_EXIST");
        require(msg.sender != _admin, "Config::removeAdmin ADMIN_NOT_AUTHORIZED");

        isAdmin[_admin] = false;

        for (uint i = 0; i < admins.length - 1; i++) {
            if (admins[i] == _admin) {
                admins[i] = admins[admins.length - 1];
                admins.length -= 1;
                break;
            }
        }

        emit LogAdminRemoved(_admin, msg.sender);
    }
}



library ECRecovery {

    function recover(bytes32 _hash, bytes _sig)
        internal
        pure
    returns (address)
    {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (_sig.length != 65) {
            return (address(0));
        }

        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            v := byte(0, mload(add(_sig, 96)))
        }

        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            return ecrecover(_hash, v, r, s);
        }
    }

    function toEthSignedMessageHash(bytes32 _hash)
        internal
        pure
    returns (bytes32)
    {
        return keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)
        );
    }
}


contract Utils2 {
    using ECRecovery for bytes32;
    
    function _recoverSigner(bytes32 _hash, bytes _signature) 
        internal
        pure
        returns(address _signer)
    {
        return _hash.toEthSignedMessageHash().recover(_signature);
    }

}



contract Account is MasterCopy, DSNote, Utils, Utils2, ErrorUtils {

    address[] public users;
    mapping (address => bool) public isUser;
    mapping (bytes32 => bool) public actionCompleted;

    WETH9 public weth9;
    Config public config;
    bool public isInitialized = false;

    event LogTransferBySystem(address indexed token, address indexed to, uint value, address by);
    event LogTransferByUser(address indexed token, address indexed to, uint value, address by);
    event LogUserAdded(address indexed user, address by);
    event LogUserRemoved(address indexed user, address by);
    event LogImplChanged(address indexed newImpl, address indexed oldImpl);

    modifier initialized() {
        require(isInitialized, "Account::_ ACCOUNT_NOT_INITIALIZED");
        _;
    }

    modifier notInitialized() {
        require(!isInitialized, "Account::_ ACCOUNT_ALREADY_INITIALIZED");
        _;
    }

    modifier userExists(address _user) {
        require(isUser[_user], "Account::_ INVALID_USER");
        _;
    }

    modifier userDoesNotExist(address _user) {
        require(!isUser[_user], "Account::_ USER_DOES_NOT_EXISTS");
        _;
    }

    modifier onlyAdmin() {
        require(config.isAdminValid(msg.sender), "Account::_ INVALID_ADMIN_ACCOUNT");
        _;
    }

    modifier onlyHandler(){
        require(config.isAccountHandler(msg.sender), "Account::_ INVALID_ACC_HANDLER");
        _;
    }

    function init(address _user, address _config)
        public 
        notInitialized
    {
        users.push(_user);
        isUser[_user] = true;
        config = Config(_config);
        weth9 = config.weth9();
        isInitialized = true;
    }
    
    function getAllUsers() public view returns (address[]) {
        return users;
    }

    function balanceFor(address _token) public view returns (uint _balance){
        _balance = ERC20(_token).balanceOf(this);
    }
    
    function transferBySystem
    (   
        address _token,
        address _to,
        uint _value
    ) 
        external 
        onlyHandler
        note 
        initialized
    {
        require(ERC20(_token).balanceOf(this) >= _value, "Account::transferBySystem INSUFFICIENT_BALANCE_IN_ACCOUNT");
        ERC20(_token).transfer(_to, _value);

        emit LogTransferBySystem(_token, _to, _value, msg.sender);
    }
    
    function transferByUser
    (   
        address _token,
        address _to,
        uint _value,
        uint _salt,
        bytes _signature
    )
        external
        addressValid(_to)
        note
        initialized
        onlyAdmin
    {
        bytes32 actionHash = _getTransferActionHash(_token, _to, _value, _salt);

        if(actionCompleted[actionHash]) {
            emit LogError("Account::transferByUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        if(ERC20(_token).balanceOf(this) < _value){
            emit LogError("Account::transferByUser", "INSUFFICIENT_BALANCE_IN_ACCOUNT");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::transferByUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;
        
        if (_token == address(weth9)) {
            weth9.withdraw(_value);
            _to.transfer(_value);
        } else {
            require(ERC20(_token).transfer(_to, _value), "Account::transferByUser TOKEN_TRANSFER_FAILED");
        }

        emit LogTransferByUser(_token, _to, _value, signer);
    }

    function addUser
    (
        address _user,
        uint _salt,
        bytes _signature
    )
        external 
        note 
        addressValid(_user)
        userDoesNotExist(_user)
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_user, "ADD_USER", _salt);
        if(actionCompleted[actionHash])
        {
            emit LogError("Account::addUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::addUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;

        users.push(_user);
        isUser[_user] = true;

        emit LogUserAdded(_user, signer);
    }

    function removeUser
    (
        address _user,
        uint _salt,
        bytes _signature
    ) 
        external
        note
        userExists(_user) 
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_user, "REMOVE_USER", _salt);

        if(actionCompleted[actionHash]) {
            emit LogError("Account::removeUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);
        
        if(users.length == 1){
            emit LogError("Account::removeUser",  "ACC_SHOULD_HAVE_ATLEAST_ONE_USER");
            return;
        }
        
        if(!isUser[signer]){
            emit LogError("Account::removeUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }
        
        actionCompleted[actionHash] = true;

        // should delete value from isUser map? delete isUser[_user]?
        isUser[_user] = false;
        for (uint i = 0; i < users.length - 1; i++) {
            if (users[i] == _user) {
                users[i] = users[users.length - 1];
                users.length -= 1;
                break;
            }
        }

        emit LogUserRemoved(_user, signer);
    }

    function _getTransferActionHash
    ( 
        address _token,
        address _to,
        uint _value,
        uint _salt
    ) 
        internal
        view
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                address(this),
                _token,
                _to,
                _value,
                _salt
            )
        );
    }

    function _getUserActionHash
    ( 
        address _user,
        string _action,
        uint _salt
    ) 
        internal
        view
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                address(this),
                _user,
                _action,
                _salt
            )
        );
    }

    // to directly send ether to contract
    function() external payable {
        require(msg.data.length == 0 && msg.value > 0, "Account::fallback INVALID_ETHER_TRANSFER");

        if(msg.sender != address(weth9)){
            weth9.deposit.value(msg.value)();
        }
    }

    function changeImpl
    (
        address _to,
        uint _salt,
        bytes _signature
    )
        external 
        note 
        addressValid(_to)
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_to, "CHANGE_ACCOUNT_IMPLEMENTATION", _salt);
        if(actionCompleted[actionHash])
        {
            emit LogError("Account::changeImpl", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::changeImpl", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;

        address oldImpl = masterCopy;
        this.changeMasterCopy(_to);
        
        emit LogImplChanged(_to, oldImpl);
    }

}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"Account.sol":"Account"}}
              

Contract ABI

[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferByUser","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"},{"type":"uint256","name":"_salt"},{"type":"bytes","name":"_signature"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"users","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isUser","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"actionCompleted","inputs":[{"type":"bytes32","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"weth9","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_balance"}],"name":"balanceFor","inputs":[{"type":"address","name":"_token"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addUser","inputs":[{"type":"address","name":"_user"},{"type":"uint256","name":"_salt"},{"type":"bytes","name":"_signature"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"changeImpl","inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_salt"},{"type":"bytes","name":"_signature"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"config","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"changeMasterCopy","inputs":[{"type":"address","name":"_masterCopy"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferBySystem","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"removeUser","inputs":[{"type":"address","name":"_user"},{"type":"uint256","name":"_salt"},{"type":"bytes","name":"_signature"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address[]","name":""}],"name":"getAllUsers","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"init","inputs":[{"type":"address","name":"_user"},{"type":"address","name":"_config"}],"constant":false},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"LogTransferBySystem","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"address","name":"by","indexed":false}],"anonymous":false},{"type":"event","name":"LogTransferByUser","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"address","name":"by","indexed":false}],"anonymous":false},{"type":"event","name":"LogUserAdded","inputs":[{"type":"address","name":"user","indexed":true},{"type":"address","name":"by","indexed":false}],"anonymous":false},{"type":"event","name":"LogUserRemoved","inputs":[{"type":"address","name":"user","indexed":true},{"type":"address","name":"by","indexed":false}],"anonymous":false},{"type":"event","name":"LogImplChanged","inputs":[{"type":"address","name":"newImpl","indexed":true},{"type":"address","name":"oldImpl","indexed":true}],"anonymous":false},{"type":"event","name":"LogError","inputs":[{"type":"string","name":"methodSig","indexed":false},{"type":"string","name":"errMsg","indexed":false}],"anonymous":false},{"type":"event","name":"LogErrorWithHintBytes32","inputs":[{"type":"bytes32","name":"bytes32Value","indexed":true},{"type":"string","name":"methodSig","indexed":false},{"type":"string","name":"errMsg","indexed":false}],"anonymous":false},{"type":"event","name":"LogErrorWithHintAddress","inputs":[{"type":"address","name":"addressValue","indexed":true},{"type":"string","name":"methodSig","indexed":false},{"type":"string","name":"errMsg","indexed":false}],"anonymous":false},{"type":"event","name":"LogNote","inputs":[{"type":"bytes4","name":"sig","indexed":true},{"type":"address","name":"guy","indexed":true},{"type":"bytes32","name":"foo","indexed":true},{"type":"bytes32","name":"bar","indexed":true},{"type":"uint256","name":"wad","indexed":false},{"type":"bytes","name":"fax","indexed":false}],"anonymous":true}]
              

Contract Creation Code

Verify & Publish
0x60806040526005805460a060020a60ff021916905534801561002057600080fd5b506126ca806100306000396000f3006080604052600436106100c15763ffffffff60e060020a6000350416630b94a94581146101d7578063365b98b214610214578063392e53cd146102485780634209fff1146102715780634d41bc8e1461029257806350879c1c146102aa578063556849ea146102bf5780636a44f65f146102f2578063792280c31461032357806379502c55146103545780637de7edef1461036957806393ef43df1461038a578063b91ab1a6146103b4578063e2842d79146103e5578063f09a40161461044a575b361580156100cf5750600034115b151561014b576040805160e560020a62461bcd02815260206004820152602860248201527f4163636f756e743a3a66616c6c6261636b20494e56414c49445f45544845525f60448201527f5452414e53464552000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600454600160a060020a031633146101d55760048054604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169263d0e30db0923492808301926000929182900301818588803b1580156101bb57600080fd5b505af11580156101cf573d6000803e3d6000fd5b50505050505b005b3480156101e357600080fd5b506101d5600160a060020a036004803582169160248035909116916044359160643591608435918201910135610471565b34801561022057600080fd5b5061022c600435610b29565b60408051600160a060020a039092168252519081900360200190f35b34801561025457600080fd5b5061025d610b51565b604080519115158252519081900360200190f35b34801561027d57600080fd5b5061025d600160a060020a0360043516610b61565b34801561029e57600080fd5b5061025d600435610b76565b3480156102b657600080fd5b5061022c610b8b565b3480156102cb57600080fd5b506102e0600160a060020a0360043516610b9a565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506101d560048035600160a060020a0316906024803591604435918201910135610c30565b34801561032f57600080fd5b506101d560048035600160a060020a031690602480359160443591820191013561114a565b34801561036057600080fd5b5061022c6115ac565b34801561037557600080fd5b506101d5600160a060020a03600435166115bb565b34801561039657600080fd5b506101d5600160a060020a03600435811690602435166044356116ec565b3480156103c057600080fd5b506101d560048035600160a060020a0316906024803591604435918201910135611a70565b3480156103f157600080fd5b506103fa611ffa565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561043657818101518382015260200161041e565b505050509050019250505060405180910390f35b34801561045657600080fd5b506101d5600160a060020a036004358116906024351661205d565b60008086600160a060020a03811615156104d5576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a460055460a060020a900460ff161515610585576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b1580156105d557600080fd5b505af11580156105e9573d6000803e3d6000fd5b505050506040513d60208110156105ff57600080fd5b50511515610645576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b6106518b8b8b8b61223a565b60008181526003602052604090205490955060ff16156106e057604080518181526017818301527f4163636f756e743a3a7472616e73666572427955736572000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a1610b1c565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518a91600160a060020a038e16916370a08231916024808201926020929091908290030181600087803b15801561074457600080fd5b505af1158015610758573d6000803e3d6000fd5b505050506040513d602081101561076e57600080fd5b505110156107fd57604080518181526017818301527f4163636f756e743a3a7472616e736665724279557365720000000000000000006060820152608060208201819052601f908201527f494e53554646494349454e545f42414c414e43455f494e5f4143434f554e540060a0820152905160008051602061267f8339815191529181900360c00190a1610b1c565b6108378588888080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490945060ff1615156108df57604080518181526017818301527f4163636f756e743a3a7472616e7366657242795573657200000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a1610b1c565b6000858152600360205260409020805460ff19166001179055600454600160a060020a038c8116911614156109c65760048054604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529283018c905251600160a060020a0390911691632e1a7d4d91602480830192600092919082900301818387803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050604051600160a060020a038d1692508b156108fc0291508b906000818181858888f193505050501580156109c0573d6000803e3d6000fd5b50610ad1565b8a600160a060020a031663a9059cbb8b8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a2957600080fd5b505af1158015610a3d573d6000803e3d6000fd5b505050506040513d6020811015610a5357600080fd5b50511515610ad1576040805160e560020a62461bcd02815260206004820152602d60248201527f4163636f756e743a3a7472616e7366657242795573657220544f4b454e5f545260448201527f414e534645525f4641494c454400000000000000000000000000000000000000606482015290519081900360840190fd5b604080518a8152600160a060020a0386811660208301528251818e1693918f16927fd035e49162c5fa2d7dd7e4e4cf1b24c64f8169a3ea33156ea6e0e02349be61e592908290030190a35b5050505050505050505050565b6001805482908110610b3757fe5b600091825260209091200154600160a060020a0316905081565b60055460a060020a900460ff1681565b60026020526000908152604090205460ff1681565b60036020526000908152604090205460ff1681565b600454600160a060020a031681565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a082319160248082019260209290919082900301818787803b158015610bfe57600080fd5b505af1158015610c12573d6000803e3d6000fd5b505050506040513d6020811015610c2857600080fd5b505192915050565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a487600160a060020a0381161515610ce9576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600160a060020a038916600090815260026020526040902054899060ff1615610d5c576040805160e560020a62461bcd02815260206004820152601f60248201527f4163636f756e743a3a5f20555345525f444f45535f4e4f545f45584953545300604482015290519081900360640190fd5b60055460a060020a900460ff161515610dbb576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50511515610e7b576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b610ebb8a6040805190810160405280600881526020017f4144445f555345520000000000000000000000000000000000000000000000008152508b61231c565b60008181526003602052604090205490965060ff1615610f4a57604080518181526010818301527f4163636f756e743a3a6164645573657200000000000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b610f848689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490955060ff16151561102c57604080518181526010818301527f4163636f756e743a3a616464557365720000000000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b600160036000886000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555060018a90806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a03160217905550506001600260008c600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff02191690831515021790555089600160a060020a03167f341c3eb6378732c9923fd02ea04564f599626c0f9b3fc49526dfd712d7cf7a54866040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a25b50505050505050505050565b60408051348082526020820183815236938301849052600093849384936004359360243593849386933393600160e060020a03198a35169391928a9291606082018484808284376040519201829003965090945050505050a488600160a060020a0381161515611204576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b60055460a060020a900460ff161515611263576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050506040513d60208110156112dd57600080fd5b50511515611323576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b6113638a6040805190810160405280601d81526020017f4348414e47455f4143434f554e545f494d504c454d454e544154494f4e0000008152508b61231c565b60008181526003602052604090205490965060ff16156113f257604080518181526013818301527f4163636f756e743a3a6368616e6765496d706c00000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b61142c8689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490955060ff1615156114d457604080518181526013818301527f4163636f756e743a3a6368616e6765496d706c0000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b600086815260036020526040808220805460ff19166001179055815481517f7de7edef000000000000000000000000000000000000000000000000000000008152600160a060020a038e8116600483015292519290911696503092637de7edef9260248084019382900301818387803b15801561155057600080fd5b505af1158015611564573d6000803e3d6000fd5b5050604051600160a060020a0380881693508d1691507f46d1374f5d35916e487a873e8b564d81557708de676898818464dbe0271c66f190600090a350505050505050505050565b600554600160a060020a031681565b333014611638576040805160e560020a62461bcd02815260206004820152602c60248201527f4d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207460448201527f68697320636f6e74726163740000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03811615156116bd576040805160e560020a62461bcd028152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554604080517f6147f6d20000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691636147f6d2916024808201926020929091908290030181600087803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b505050506040513d602081101561177c57600080fd5b505115156117d4576040805160e560020a62461bcd02815260206004820152601e60248201527f4163636f756e743a3a5f20494e56414c49445f4143435f48414e444c45520000604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a460055460a060020a900460ff161515611884576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518491600160a060020a038816916370a08231916024808201926020929091908290030181600087803b1580156118e857600080fd5b505af11580156118fc573d6000803e3d6000fd5b505050506040513d602081101561191257600080fd5b50511015611990576040805160e560020a62461bcd02815260206004820152603960248201527f4163636f756e743a3a7472616e73666572427953797374656d20494e5355464660448201527f494349454e545f42414c414e43455f494e5f4143434f554e5400000000000000606482015290519081900360840190fd5b84600160a060020a031663a9059cbb85856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050506040513d6020811015611a1d57600080fd5b5050604080518481523360208201528151600160a060020a0380881693908916927fb841ece5c9472ec2e69da4ef0be8184c8d115d7fdbf8447d4db91e8b7e4d9cc4929081900390910190a35050505050565b60408051348082526020820183815236938301849052600093849384936004359360243593849386933393600160e060020a03198a35169391928a9291606082018484808284376040519201829003965090945050505050a4600160a060020a038916600090815260026020526040902054899060ff161515611b3d576040805160e560020a62461bcd02815260206004820152601760248201527f4163636f756e743a3a5f20494e56414c49445f55534552000000000000000000604482015290519081900360640190fd5b60055460a060020a900460ff161515611b9c576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b505050506040513d6020811015611c1657600080fd5b50511515611c5c576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b611c9c8a6040805190810160405280600b81526020017f52454d4f56455f555345520000000000000000000000000000000000000000008152508b61231c565b60008181526003602052604090205490965060ff1615611d2b57604080518181526013818301527f4163636f756e743a3a72656d6f76655573657200000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b611d658689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600180549196501415611df857604080518181526013818301527f4163636f756e743a3a72656d6f76655573657200000000000000000000000000606082015260806020808301829052908201527f4143435f53484f554c445f484156455f41544c454153545f4f4e455f5553455260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b600160a060020a03851660009081526002602052604090205460ff161515611e9d57604080518181526013818301527f4163636f756e743a3a72656d6f7665557365720000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b6000868152600360209081526040808320805460ff19908116600117909155600160a060020a038e168452600290925282208054909116905593505b60015460001901841015611fad5789600160a060020a0316600185815481101515611f0057fe5b600091825260209091200154600160a060020a03161415611fa257600180546000198101908110611f2d57fe5b60009182526020909120015460018054600160a060020a039092169186908110611f5357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600180546000190190611f9c90826125b7565b50611fad565b600190930192611ed9565b60408051600160a060020a0387811682529151918c16917fcc173a9909e9ded8a96a84eace3a366f698a6a1486a3baa74f66d91aead2d12d9181900360200190a250505050505050505050565b6060600180548060200260200160405190810160405280929190818152602001828054801561205257602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612034575b505050505090505b90565b60055460a060020a900460ff16156120e5576040805160e560020a62461bcd02815260206004820152602660248201527f4163636f756e743a3a5f204143434f554e545f414c52454144595f494e49544960448201527f414c495a45440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831681179093556000928352600260209081526040808520805460ff1916909617909555600580548784169416939093179283905584517f50879c1c000000000000000000000000000000000000000000000000000000008152945192909116936350879c1c93600480830194928390030190829087803b1580156121b857600080fd5b505af11580156121cc573d6000803e3d6000fd5b505050506040513d60208110156121e257600080fd5b505160048054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff1990921691909117905550506005805474ff0000000000000000000000000000000000000000191660a060020a179055565b604080516c01000000000000000000000000308102602080840191909152600160a060020a038089168302603485015287169091026048830152605c8201859052607c80830185905283518084039091018152609c909201928390528151600093918291908401908083835b602083106122c55780518252601f1990920191602091820191016122a6565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b60006123158261230985612438565b9063ffffffff6124e216565b9392505050565b6000308484846040516020018085600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140183805190602001908083835b602083106123a25780518252601f199092019160209182019101612383565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201908190528351939650945084935085019190508083835b602083106124045780518252601f1990920191602091820191016123e5565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120979650505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b602083106124b05780518252601f199092019160209182019101612491565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b600080600080845160411415156124fc57600093506125ae565b50505060208201516040830151606084015160001a601b60ff8216101561252157601b015b8060ff16601b1415801561253957508060ff16601c14155b1561254757600093506125ae565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af11580156125a1573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8154818355818111156125db576000838152602090206125db9181019083016125e0565b505050565b61205a91905b808211156125fa57600081556001016125e6565b509056005349474e45525f4e4f545f415554484f52495a45445f574954485f4143434f554163636f756e743a3a5f20494e56414c49445f41444d494e5f4143434f554e544163636f756e743a3a5f204143434f554e545f4e4f545f494e495449414c495a414354494f4e5f414c52454144595f504552464f524d45440000000000000000b070cb3e4fef70e12d8e599444f6395a8ff59f4db70ac633f9d5c5db734a4d37a165627a7a723058209d28c22889344416d749161bb7e76ef7107fcba51dec3d8b8c42b042a4a01f730029

Deployed ByteCode

0x6080604052600436106100c15763ffffffff60e060020a6000350416630b94a94581146101d7578063365b98b214610214578063392e53cd146102485780634209fff1146102715780634d41bc8e1461029257806350879c1c146102aa578063556849ea146102bf5780636a44f65f146102f2578063792280c31461032357806379502c55146103545780637de7edef1461036957806393ef43df1461038a578063b91ab1a6146103b4578063e2842d79146103e5578063f09a40161461044a575b361580156100cf5750600034115b151561014b576040805160e560020a62461bcd02815260206004820152602860248201527f4163636f756e743a3a66616c6c6261636b20494e56414c49445f45544845525f60448201527f5452414e53464552000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600454600160a060020a031633146101d55760048054604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169263d0e30db0923492808301926000929182900301818588803b1580156101bb57600080fd5b505af11580156101cf573d6000803e3d6000fd5b50505050505b005b3480156101e357600080fd5b506101d5600160a060020a036004803582169160248035909116916044359160643591608435918201910135610471565b34801561022057600080fd5b5061022c600435610b29565b60408051600160a060020a039092168252519081900360200190f35b34801561025457600080fd5b5061025d610b51565b604080519115158252519081900360200190f35b34801561027d57600080fd5b5061025d600160a060020a0360043516610b61565b34801561029e57600080fd5b5061025d600435610b76565b3480156102b657600080fd5b5061022c610b8b565b3480156102cb57600080fd5b506102e0600160a060020a0360043516610b9a565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506101d560048035600160a060020a0316906024803591604435918201910135610c30565b34801561032f57600080fd5b506101d560048035600160a060020a031690602480359160443591820191013561114a565b34801561036057600080fd5b5061022c6115ac565b34801561037557600080fd5b506101d5600160a060020a03600435166115bb565b34801561039657600080fd5b506101d5600160a060020a03600435811690602435166044356116ec565b3480156103c057600080fd5b506101d560048035600160a060020a0316906024803591604435918201910135611a70565b3480156103f157600080fd5b506103fa611ffa565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561043657818101518382015260200161041e565b505050509050019250505060405180910390f35b34801561045657600080fd5b506101d5600160a060020a036004358116906024351661205d565b60008086600160a060020a03811615156104d5576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a460055460a060020a900460ff161515610585576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b1580156105d557600080fd5b505af11580156105e9573d6000803e3d6000fd5b505050506040513d60208110156105ff57600080fd5b50511515610645576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b6106518b8b8b8b61223a565b60008181526003602052604090205490955060ff16156106e057604080518181526017818301527f4163636f756e743a3a7472616e73666572427955736572000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a1610b1c565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518a91600160a060020a038e16916370a08231916024808201926020929091908290030181600087803b15801561074457600080fd5b505af1158015610758573d6000803e3d6000fd5b505050506040513d602081101561076e57600080fd5b505110156107fd57604080518181526017818301527f4163636f756e743a3a7472616e736665724279557365720000000000000000006060820152608060208201819052601f908201527f494e53554646494349454e545f42414c414e43455f494e5f4143434f554e540060a0820152905160008051602061267f8339815191529181900360c00190a1610b1c565b6108378588888080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490945060ff1615156108df57604080518181526017818301527f4163636f756e743a3a7472616e7366657242795573657200000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a1610b1c565b6000858152600360205260409020805460ff19166001179055600454600160a060020a038c8116911614156109c65760048054604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529283018c905251600160a060020a0390911691632e1a7d4d91602480830192600092919082900301818387803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050604051600160a060020a038d1692508b156108fc0291508b906000818181858888f193505050501580156109c0573d6000803e3d6000fd5b50610ad1565b8a600160a060020a031663a9059cbb8b8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a2957600080fd5b505af1158015610a3d573d6000803e3d6000fd5b505050506040513d6020811015610a5357600080fd5b50511515610ad1576040805160e560020a62461bcd02815260206004820152602d60248201527f4163636f756e743a3a7472616e7366657242795573657220544f4b454e5f545260448201527f414e534645525f4641494c454400000000000000000000000000000000000000606482015290519081900360840190fd5b604080518a8152600160a060020a0386811660208301528251818e1693918f16927fd035e49162c5fa2d7dd7e4e4cf1b24c64f8169a3ea33156ea6e0e02349be61e592908290030190a35b5050505050505050505050565b6001805482908110610b3757fe5b600091825260209091200154600160a060020a0316905081565b60055460a060020a900460ff1681565b60026020526000908152604090205460ff1681565b60036020526000908152604090205460ff1681565b600454600160a060020a031681565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a082319160248082019260209290919082900301818787803b158015610bfe57600080fd5b505af1158015610c12573d6000803e3d6000fd5b505050506040513d6020811015610c2857600080fd5b505192915050565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a487600160a060020a0381161515610ce9576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600160a060020a038916600090815260026020526040902054899060ff1615610d5c576040805160e560020a62461bcd02815260206004820152601f60248201527f4163636f756e743a3a5f20555345525f444f45535f4e4f545f45584953545300604482015290519081900360640190fd5b60055460a060020a900460ff161515610dbb576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50511515610e7b576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b610ebb8a6040805190810160405280600881526020017f4144445f555345520000000000000000000000000000000000000000000000008152508b61231c565b60008181526003602052604090205490965060ff1615610f4a57604080518181526010818301527f4163636f756e743a3a6164645573657200000000000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b610f848689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490955060ff16151561102c57604080518181526010818301527f4163636f756e743a3a616464557365720000000000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b600160036000886000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555060018a90806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a03160217905550506001600260008c600160a060020a0316600160a060020a0316815260200190815260200160002060006101000a81548160ff02191690831515021790555089600160a060020a03167f341c3eb6378732c9923fd02ea04564f599626c0f9b3fc49526dfd712d7cf7a54866040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a25b50505050505050505050565b60408051348082526020820183815236938301849052600093849384936004359360243593849386933393600160e060020a03198a35169391928a9291606082018484808284376040519201829003965090945050505050a488600160a060020a0381161515611204576040805160e560020a62461bcd02815260206004820152601860248201527f5574696c733a3a5f20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b60055460a060020a900460ff161515611263576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050506040513d60208110156112dd57600080fd5b50511515611323576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b6113638a6040805190810160405280601d81526020017f4348414e47455f4143434f554e545f494d504c454d454e544154494f4e0000008152508b61231c565b60008181526003602052604090205490965060ff16156113f257604080518181526013818301527f4163636f756e743a3a6368616e6765496d706c00000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b61142c8689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600160a060020a03811660009081526002602052604090205490955060ff1615156114d457604080518181526013818301527f4163636f756e743a3a6368616e6765496d706c0000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b600086815260036020526040808220805460ff19166001179055815481517f7de7edef000000000000000000000000000000000000000000000000000000008152600160a060020a038e8116600483015292519290911696503092637de7edef9260248084019382900301818387803b15801561155057600080fd5b505af1158015611564573d6000803e3d6000fd5b5050604051600160a060020a0380881693508d1691507f46d1374f5d35916e487a873e8b564d81557708de676898818464dbe0271c66f190600090a350505050505050505050565b600554600160a060020a031681565b333014611638576040805160e560020a62461bcd02815260206004820152602c60248201527f4d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207460448201527f68697320636f6e74726163740000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03811615156116bd576040805160e560020a62461bcd028152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554604080517f6147f6d20000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691636147f6d2916024808201926020929091908290030181600087803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b505050506040513d602081101561177c57600080fd5b505115156117d4576040805160e560020a62461bcd02815260206004820152601e60248201527f4163636f756e743a3a5f20494e56414c49445f4143435f48414e444c45520000604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a460055460a060020a900460ff161515611884576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518491600160a060020a038816916370a08231916024808201926020929091908290030181600087803b1580156118e857600080fd5b505af11580156118fc573d6000803e3d6000fd5b505050506040513d602081101561191257600080fd5b50511015611990576040805160e560020a62461bcd02815260206004820152603960248201527f4163636f756e743a3a7472616e73666572427953797374656d20494e5355464660448201527f494349454e545f42414c414e43455f494e5f4143434f554e5400000000000000606482015290519081900360840190fd5b84600160a060020a031663a9059cbb85856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b505050506040513d6020811015611a1d57600080fd5b5050604080518481523360208201528151600160a060020a0380881693908916927fb841ece5c9472ec2e69da4ef0be8184c8d115d7fdbf8447d4db91e8b7e4d9cc4929081900390910190a35050505050565b60408051348082526020820183815236938301849052600093849384936004359360243593849386933393600160e060020a03198a35169391928a9291606082018484808284376040519201829003965090945050505050a4600160a060020a038916600090815260026020526040902054899060ff161515611b3d576040805160e560020a62461bcd02815260206004820152601760248201527f4163636f756e743a3a5f20494e56414c49445f55534552000000000000000000604482015290519081900360640190fd5b60055460a060020a900460ff161515611b9c576040805160e560020a62461bcd028152602060048201526022602482015260008051602061263f833981519152604482015260f260020a61115102606482015290519081900360840190fd5b6005546040805160e060020a639c14ee290281523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b505050506040513d6020811015611c1657600080fd5b50511515611c5c576040805160e560020a62461bcd028152602060048201819052602482015260008051602061261f833981519152604482015290519081900360640190fd5b611c9c8a6040805190810160405280600b81526020017f52454d4f56455f555345520000000000000000000000000000000000000000008152508b61231c565b60008181526003602052604090205490965060ff1615611d2b57604080518181526013818301527f4163636f756e743a3a72656d6f76655573657200000000000000000000000000606082015260806020820181905260189082015260008051602061265f83398151915260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b611d658689898080601f016020809104026020016040519081016040528093929190818152602001838380828437506122fa945050505050565b600180549196501415611df857604080518181526013818301527f4163636f756e743a3a72656d6f76655573657200000000000000000000000000606082015260806020808301829052908201527f4143435f53484f554c445f484156455f41544c454153545f4f4e455f5553455260a0820152905160008051602061267f8339815191529181900360c00190a161113e565b600160a060020a03851660009081526002602052604090205460ff161515611e9d57604080518181526013818301527f4163636f756e743a3a72656d6f7665557365720000000000000000000000000060608201526080602082018190526022908201526000805160206125ff83398151915260a082015260f260020a6113950260c0820152905160008051602061267f8339815191529181900360e00190a161113e565b6000868152600360209081526040808320805460ff19908116600117909155600160a060020a038e168452600290925282208054909116905593505b60015460001901841015611fad5789600160a060020a0316600185815481101515611f0057fe5b600091825260209091200154600160a060020a03161415611fa257600180546000198101908110611f2d57fe5b60009182526020909120015460018054600160a060020a039092169186908110611f5357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600180546000190190611f9c90826125b7565b50611fad565b600190930192611ed9565b60408051600160a060020a0387811682529151918c16917fcc173a9909e9ded8a96a84eace3a366f698a6a1486a3baa74f66d91aead2d12d9181900360200190a250505050505050505050565b6060600180548060200260200160405190810160405280929190818152602001828054801561205257602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612034575b505050505090505b90565b60055460a060020a900460ff16156120e5576040805160e560020a62461bcd02815260206004820152602660248201527f4163636f756e743a3a5f204143434f554e545f414c52454144595f494e49544960448201527f414c495a45440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831681179093556000928352600260209081526040808520805460ff1916909617909555600580548784169416939093179283905584517f50879c1c000000000000000000000000000000000000000000000000000000008152945192909116936350879c1c93600480830194928390030190829087803b1580156121b857600080fd5b505af11580156121cc573d6000803e3d6000fd5b505050506040513d60208110156121e257600080fd5b505160048054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff1990921691909117905550506005805474ff0000000000000000000000000000000000000000191660a060020a179055565b604080516c01000000000000000000000000308102602080840191909152600160a060020a038089168302603485015287169091026048830152605c8201859052607c80830185905283518084039091018152609c909201928390528151600093918291908401908083835b602083106122c55780518252601f1990920191602091820191016122a6565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b60006123158261230985612438565b9063ffffffff6124e216565b9392505050565b6000308484846040516020018085600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140183805190602001908083835b602083106123a25780518252601f199092019160209182019101612383565b51815160209384036101000a6000190180199092169116179052920193845250604080518085038152938201908190528351939650945084935085019190508083835b602083106124045780518252601f1990920191602091820191016123e5565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120979650505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b602083106124b05780518252601f199092019160209182019101612491565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b600080600080845160411415156124fc57600093506125ae565b50505060208201516040830151606084015160001a601b60ff8216101561252157601b015b8060ff16601b1415801561253957508060ff16601c14155b1561254757600093506125ae565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af11580156125a1573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8154818355818111156125db576000838152602090206125db9181019083016125e0565b505050565b61205a91905b808211156125fa57600081556001016125e6565b509056005349474e45525f4e4f545f415554484f52495a45445f574954485f4143434f554163636f756e743a3a5f20494e56414c49445f41444d494e5f4143434f554e544163636f756e743a3a5f204143434f554e545f4e4f545f494e495449414c495a414354494f4e5f414c52454144595f504552464f524d45440000000000000000b070cb3e4fef70e12d8e599444f6395a8ff59f4db70ac633f9d5c5db734a4d37a165627a7a723058209d28c22889344416d749161bb7e76ef7107fcba51dec3d8b8c42b042a4a01f730029