ETH Price: $3,914.16 (-0.50%)

Contract

0xDB5ac1a559b02E12F29fC0eC0e37Be8E046DEF49
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Release196486802024-04-13 19:17:59244 days ago1713035879IN
0xDB5ac1a5...E046DEF49
0 ETH0.0032168622.70240285
Release181445642023-09-15 22:27:23455 days ago1694816843IN
0xDB5ac1a5...E046DEF49
0 ETH0.0003581811.33666013
Release180479102023-09-02 9:22:35468 days ago1693646555IN
0xDB5ac1a5...E046DEF49
0 ETH0.001393849.83682189
Release159874452022-11-17 4:46:47757 days ago1668660407IN
0xDB5ac1a5...E046DEF49
0 ETH0.0018431113.00744479
Slash Small User...156591332022-10-02 8:01:47803 days ago1664697707IN
0xDB5ac1a5...E046DEF49
0 ETH0.000754824.80762958
Reserve Slash156591302022-10-02 8:01:11803 days ago1664697671IN
0xDB5ac1a5...E046DEF49
0 ETH0.000280474.22307679
Slash Small User...156590822022-10-02 7:51:35803 days ago1664697095IN
0xDB5ac1a5...E046DEF49
0 ETH0.000346544.33325133
Reserve Slash156590542022-10-02 7:45:47803 days ago1664696747IN
0xDB5ac1a5...E046DEF49
0 ETH0.000261943.94410696
Release152827032022-08-05 13:51:15861 days ago1659707475IN
0xDB5ac1a5...E046DEF49
0 ETH0.0019783613.9619589
Release152573872022-08-01 15:06:15865 days ago1659366375IN
0xDB5ac1a5...E046DEF49
0 ETH0.0009522430.13897048
Transfer152460562022-07-30 20:50:39867 days ago1659214239IN
0xDB5ac1a5...E046DEF49
0.0005 ETH0.000160667.65095061
Release140354062022-01-19 10:25:291059 days ago1642587929IN
0xDB5ac1a5...E046DEF49
0 ETH0.0130292191.95126769
Release130030592021-08-11 9:27:151220 days ago1628674035IN
0xDB5ac1a5...E046DEF49
0 ETH0.0076516354
Release130030462021-08-11 9:24:291220 days ago1628673869IN
0xDB5ac1a5...E046DEF49
0 ETH0.0076516354
Release130027422021-08-11 8:15:131220 days ago1628669713IN
0xDB5ac1a5...E046DEF49
0 ETH0.0017336554.87113226
Release128949572021-07-25 10:40:561237 days ago1627209656IN
0xDB5ac1a5...E046DEF49
0 ETH0.0009069710
Release127210972021-06-28 7:06:201264 days ago1624863980IN
0xDB5ac1a5...E046DEF49
0 ETH0.0004689620
Release127209482021-06-28 6:31:181264 days ago1624861878IN
0xDB5ac1a5...E046DEF49
0 ETH0.00028967
Release127204132021-06-28 4:35:391264 days ago1624854939IN
0xDB5ac1a5...E046DEF49
0 ETH0.0009069710
Release126274212021-06-13 17:12:521279 days ago1623604372IN
0xDB5ac1a5...E046DEF49
0 ETH0.0012695914
Release126271542021-06-13 16:17:031279 days ago1623601023IN
0xDB5ac1a5...E046DEF49
0 ETH0.0004031512.76
Release126263632021-06-13 13:17:521279 days ago1623590272IN
0xDB5ac1a5...E046DEF49
0 ETH0.0003159510
Release126262702021-06-13 12:58:301279 days ago1623589110IN
0xDB5ac1a5...E046DEF49
0 ETH0.0003145110
Release121857612021-04-06 10:55:451347 days ago1617706545IN
0xDB5ac1a5...E046DEF49
0 ETH0.01061086105.9
Release121857242021-04-06 10:48:171347 days ago1617706097IN
0xDB5ac1a5...E046DEF49
0 ETH0.01052068105
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UsernameRegistrar

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-10-24
*/

pragma solidity ^0.4.24;


/**
 * @title MerkleProof
 * @dev Merkle proof verification based on
 * https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol
 */
library MerkleProof {
    /**
    * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves
    * and each pair of pre-images are sorted.
    * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree
    * @param _root Merkle root
    * @param _leaf Leaf of Merkle tree
    */
    function verifyProof(
        bytes32[] _proof,
        bytes32 _root,
        bytes32 _leaf
    )
        internal
        pure
        returns (bool)
    {
        bytes32 computedHash = _leaf;

        for (uint256 i = 0; i < _proof.length; i++) {
            bytes32 proofElement = _proof[i];

            if (computedHash < proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == _root;
    }
}

contract Controlled {
    /// @notice The address of the controller is the only address that can call
    ///  a function with this modifier
    modifier onlyController { 
        require(msg.sender == controller); 
        _; 
    }

    address public controller;

    constructor() internal { 
        controller = msg.sender; 
    }

    /// @notice Changes the controller of the contract
    /// @param _newController The new controller of the contract
    function changeController(address _newController) public onlyController {
        controller = _newController;
    }
}


// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/issues/20

interface ERC20Token {

    /**
     * @notice send `_value` token to `_to` from `msg.sender`
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transfer(address _to, uint256 _value) external returns (bool success);

    /**
     * @notice `msg.sender` approves `_spender` to spend `_value` tokens
     * @param _spender The address of the account able to transfer the tokens
     * @param _value The amount of tokens to be approved for transfer
     * @return Whether the approval was successful or not
     */
    function approve(address _spender, uint256 _value) external returns (bool success);

    /**
     * @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);

    /**
     * @param _owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address _owner) external view returns (uint256 balance);

    /**
     * @param _owner The address of the account owning tokens
     * @param _spender The address of the account able to transfer the tokens
     * @return Amount of remaining tokens allowed to spent
     */
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    /**
     * @notice return total supply of tokens
     */
    function totalSupply() external view returns (uint256 supply);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract ApproveAndCallFallBack {
    function receiveApproval(address from, uint256 _amount, address _token, bytes _data) public;
}

interface ENS {

  // Logged when the owner of a node assigns a new owner to a subnode.
  event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);

  // Logged when the owner of a node transfers ownership to a new account.
  event Transfer(bytes32 indexed node, address owner);

  // Logged when the resolver for a node changes.
  event NewResolver(bytes32 indexed node, address resolver);

  // Logged when the TTL of a node changes
  event NewTTL(bytes32 indexed node, uint64 ttl);


  function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public;
  function setResolver(bytes32 node, address resolver) public;
  function setOwner(bytes32 node, address owner) public;
  function setTTL(bytes32 node, uint64 ttl) public;
  function owner(bytes32 node) public view returns (address);
  function resolver(bytes32 node) public view returns (address);
  function ttl(bytes32 node) public view returns (uint64);

}


/**
 * A simple resolver anyone can use; only allows the owner of a node to set its
 * address.
 */
contract PublicResolver {

    bytes4 constant INTERFACE_META_ID = 0x01ffc9a7;
    bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de;
    bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5;
    bytes4 constant NAME_INTERFACE_ID = 0x691f3431;
    bytes4 constant ABI_INTERFACE_ID = 0x2203ab56;
    bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233;
    bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c;
    bytes4 constant MULTIHASH_INTERFACE_ID = 0xe89401a1;

    event AddrChanged(bytes32 indexed node, address a);
    event ContentChanged(bytes32 indexed node, bytes32 hash);
    event NameChanged(bytes32 indexed node, string name);
    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
    event TextChanged(bytes32 indexed node, string indexedKey, string key);
    event MultihashChanged(bytes32 indexed node, bytes hash);

    struct PublicKey {
        bytes32 x;
        bytes32 y;
    }

    struct Record {
        address addr;
        bytes32 content;
        string name;
        PublicKey pubkey;
        mapping(string=>string) text;
        mapping(uint256=>bytes) abis;
        bytes multihash;
    }

    ENS ens;

    mapping (bytes32 => Record) records;

    modifier only_owner(bytes32 node) {
        require(ens.owner(node) == msg.sender);
        _;
    }

    /**
     * Constructor.
     * @param ensAddr The ENS registrar contract.
     */
    constructor(ENS ensAddr) public {
        ens = ensAddr;
    }

    /**
     * Sets the address associated with an ENS node.
     * May only be called by the owner of that node in the ENS registry.
     * @param node The node to update.
     * @param addr The address to set.
     */
    function setAddr(bytes32 node, address addr) public only_owner(node) {
        records[node].addr = addr;
        emit AddrChanged(node, addr);
    }

    /**
     * Sets the content hash associated with an ENS node.
     * May only be called by the owner of that node in the ENS registry.
     * Note that this resource type is not standardized, and will likely change
     * in future to a resource type based on multihash.
     * @param node The node to update.
     * @param hash The content hash to set
     */
    function setContent(bytes32 node, bytes32 hash) public only_owner(node) {
        records[node].content = hash;
        emit ContentChanged(node, hash);
    }

    /**
     * Sets the multihash associated with an ENS node.
     * May only be called by the owner of that node in the ENS registry.
     * @param node The node to update.
     * @param hash The multihash to set
     */
    function setMultihash(bytes32 node, bytes hash) public only_owner(node) {
        records[node].multihash = hash;
        emit MultihashChanged(node, hash);
    }
    
    /**
     * Sets the name associated with an ENS node, for reverse records.
     * May only be called by the owner of that node in the ENS registry.
     * @param node The node to update.
     * @param name The name to set.
     */
    function setName(bytes32 node, string name) public only_owner(node) {
        records[node].name = name;
        emit NameChanged(node, name);
    }

    /**
     * Sets the ABI associated with an ENS node.
     * Nodes may have one ABI of each content type. To remove an ABI, set it to
     * the empty string.
     * @param node The node to update.
     * @param contentType The content type of the ABI
     * @param data The ABI data.
     */
    function setABI(bytes32 node, uint256 contentType, bytes data) public only_owner(node) {
        // Content types must be powers of 2
        require(((contentType - 1) & contentType) == 0);
        
        records[node].abis[contentType] = data;
        emit ABIChanged(node, contentType);
    }
    
    /**
     * Sets the SECP256k1 public key associated with an ENS node.
     * @param node The ENS node to query
     * @param x the X coordinate of the curve point for the public key.
     * @param y the Y coordinate of the curve point for the public key.
     */
    function setPubkey(bytes32 node, bytes32 x, bytes32 y) public only_owner(node) {
        records[node].pubkey = PublicKey(x, y);
        emit PubkeyChanged(node, x, y);
    }

    /**
     * Sets the text data associated with an ENS node and key.
     * May only be called by the owner of that node in the ENS registry.
     * @param node The node to update.
     * @param key The key to set.
     * @param value The text data value to set.
     */
    function setText(bytes32 node, string key, string value) public only_owner(node) {
        records[node].text[key] = value;
        emit TextChanged(node, key, key);
    }

    /**
     * Returns the text data associated with an ENS node and key.
     * @param node The ENS node to query.
     * @param key The text data key to query.
     * @return The associated text data.
     */
    function text(bytes32 node, string key) public view returns (string) {
        return records[node].text[key];
    }

    /**
     * Returns the SECP256k1 public key associated with an ENS node.
     * Defined in EIP 619.
     * @param node The ENS node to query
     * @return x, y the X and Y coordinates of the curve point for the public key.
     */
    function pubkey(bytes32 node) public view returns (bytes32 x, bytes32 y) {
        return (records[node].pubkey.x, records[node].pubkey.y);
    }

    /**
     * Returns the ABI associated with an ENS node.
     * Defined in EIP205.
     * @param node The ENS node to query
     * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.
     * @return contentType The content type of the return value
     * @return data The ABI data
     */
    function ABI(bytes32 node, uint256 contentTypes) public view returns (uint256 contentType, bytes data) {
        Record storage record = records[node];
        for (contentType = 1; contentType <= contentTypes; contentType <<= 1) {
            if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) {
                data = record.abis[contentType];
                return;
            }
        }
        contentType = 0;
    }

    /**
     * Returns the name associated with an ENS node, for reverse records.
     * Defined in EIP181.
     * @param node The ENS node to query.
     * @return The associated name.
     */
    function name(bytes32 node) public view returns (string) {
        return records[node].name;
    }

    /**
     * Returns the content hash associated with an ENS node.
     * Note that this resource type is not standardized, and will likely change
     * in future to a resource type based on multihash.
     * @param node The ENS node to query.
     * @return The associated content hash.
     */
    function content(bytes32 node) public view returns (bytes32) {
        return records[node].content;
    }

    /**
     * Returns the multihash associated with an ENS node.
     * @param node The ENS node to query.
     * @return The associated multihash.
     */
    function multihash(bytes32 node) public view returns (bytes) {
        return records[node].multihash;
    }

    /**
     * Returns the address associated with an ENS node.
     * @param node The ENS node to query.
     * @return The associated address.
     */
    function addr(bytes32 node) public view returns (address) {
        return records[node].addr;
    }

    /**
     * Returns true if the resolver implements the interface specified by the provided hash.
     * @param interfaceID The ID of the interface to check for.
     * @return True if the contract implements the requested interface.
     */
    function supportsInterface(bytes4 interfaceID) public pure returns (bool) {
        return interfaceID == ADDR_INTERFACE_ID ||
        interfaceID == CONTENT_INTERFACE_ID ||
        interfaceID == NAME_INTERFACE_ID ||
        interfaceID == ABI_INTERFACE_ID ||
        interfaceID == PUBKEY_INTERFACE_ID ||
        interfaceID == TEXT_INTERFACE_ID ||
        interfaceID == MULTIHASH_INTERFACE_ID ||
        interfaceID == INTERFACE_META_ID;
    }
}


/** 
 * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) 
 * @notice Registers usernames as ENS subnodes of the domain `ensNode`
 */
contract UsernameRegistrar is Controlled, ApproveAndCallFallBack {
    
    ERC20Token public token;
    ENS public ensRegistry;
    PublicResolver public resolver;
    address public parentRegistry;

    uint256 public constant releaseDelay = 365 days;
    mapping (bytes32 => Account) public accounts;
    mapping (bytes32 => SlashReserve) reservedSlashers;

    //Slashing conditions
    uint256 public usernameMinLength;
    bytes32 public reservedUsernamesMerkleRoot;
    
    event RegistryState(RegistrarState state);
    event RegistryPrice(uint256 price);
    event RegistryMoved(address newRegistry);
    event UsernameOwner(bytes32 indexed nameHash, address owner);

    enum RegistrarState { Inactive, Active, Moved }
    bytes32 public ensNode;
    uint256 public price;
    RegistrarState public state;
    uint256 public reserveAmount;

    struct Account {
        uint256 balance;
        uint256 creationTime;
        address owner;
    }

    struct SlashReserve {
        address reserver;
        uint256 blockNumber;
    }

    /**
     * @notice Callable only by `parentRegistry()` to continue migration of ENSSubdomainRegistry.
     */
    modifier onlyParentRegistry {
        require(msg.sender == parentRegistry, "Migration only.");
        _;
    }

    /** 
     * @notice Initializes UsernameRegistrar contract. 
     * The only parameter from this list that can be changed later is `_resolver`.
     * Other updates require a new contract and migration of domain.
     * @param _token ERC20 token with optional `approveAndCall(address,uint256,bytes)` for locking fee.
     * @param _ensRegistry Ethereum Name Service root contract address.
     * @param _resolver Public Resolver for resolving usernames.
     * @param _ensNode ENS node (domain) being used for usernames subnodes (subdomain)
     * @param _usernameMinLength Minimum length of usernames 
     * @param _reservedUsernamesMerkleRoot Merkle root of reserved usernames
     * @param _parentRegistry Address of old registry (if any) for optional account migration.
     */
    constructor(
        ERC20Token _token,
        ENS _ensRegistry,
        PublicResolver _resolver,
        bytes32 _ensNode,
        uint256 _usernameMinLength,
        bytes32 _reservedUsernamesMerkleRoot,
        address _parentRegistry
    ) 
        public 
    {
        require(address(_token) != address(0), "No ERC20Token address defined.");
        require(address(_ensRegistry) != address(0), "No ENS address defined.");
        require(address(_resolver) != address(0), "No Resolver address defined.");
        require(_ensNode != bytes32(0), "No ENS node defined.");
        token = _token;
        ensRegistry = _ensRegistry;
        resolver = _resolver;
        ensNode = _ensNode;
        usernameMinLength = _usernameMinLength;
        reservedUsernamesMerkleRoot = _reservedUsernamesMerkleRoot;
        parentRegistry = _parentRegistry;
        setState(RegistrarState.Inactive);
    }

    /**
     * @notice Registers `_label` username to `ensNode` setting msg.sender as owner.
     * Terms of name registration:
     * - SNT is deposited, not spent; the amount is locked up for 1 year.
     * - After 1 year, the user can release the name and receive their deposit back (at any time).
     * - User deposits are completely protected. The contract controller cannot access them.
     * - User's address(es) will be publicly associated with the ENS name.
     * - User must authorise the contract to transfer `price` `token.name()`  on their behalf.
     * - Usernames registered with less then `usernameMinLength` characters can be slashed.
     * - Usernames contained in the merkle tree of root `reservedUsernamesMerkleRoot` can be slashed.
     * - Usernames starting with `0x` and bigger then 12 characters can be slashed.
     * - If terms of the contract change—e.g. Status makes contract upgrades—the user has the right to release the username and get their deposit back.
     * @param _label Choosen unowned username hash.
     * @param _account Optional address to set at public resolver.
     * @param _pubkeyA Optional pubkey part A to set at public resolver.
     * @param _pubkeyB Optional pubkey part B to set at public resolver.
     */
    function register(
        bytes32 _label,
        address _account,
        bytes32 _pubkeyA,
        bytes32 _pubkeyB
    ) 
        external 
        returns(bytes32 namehash) 
    {
        return registerUser(msg.sender, _label, _account, _pubkeyA, _pubkeyB);
    }
    
    /** 
     * @notice Release username and retrieve locked fee, needs to be called 
     * after `releasePeriod` from creation time by ENS registry owner of domain 
     * or anytime by account owner when domain migrated to a new registry.
     * @param _label Username hash.
     */
    function release(
        bytes32 _label
    )
        external 
    {
        bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label));
        Account memory account = accounts[_label];
        require(account.creationTime > 0, "Username not registered.");
        if (state == RegistrarState.Active) {
            require(msg.sender == ensRegistry.owner(namehash), "Not owner of ENS node.");
            require(block.timestamp > account.creationTime + releaseDelay, "Release period not reached.");
        } else {
            require(msg.sender == account.owner, "Not the former account owner.");
        }
        delete accounts[_label];
        if (account.balance > 0) {
            reserveAmount -= account.balance;
            require(token.transfer(msg.sender, account.balance), "Transfer failed");
        }
        if (state == RegistrarState.Active) {
            ensRegistry.setSubnodeOwner(ensNode, _label, address(this));
            ensRegistry.setResolver(namehash, address(0));
            ensRegistry.setOwner(namehash, address(0));
        } else {
            address newOwner = ensRegistry.owner(ensNode);
            //Low level call, case dropUsername not implemented or failing, proceed release. 
            //Invert (!) to supress warning, return of this call have no use.
            !newOwner.call.gas(80000)(
                abi.encodeWithSignature(
                    "dropUsername(bytes32)",
                    _label
                )
            );
        }
        emit UsernameOwner(namehash, address(0));   
    }

    /** 
     * @notice update account owner, should be called by new ens node owner 
     * to update this contract registry, otherwise former owner can release 
     * if domain is moved to a new registry. 
     * @param _label Username hash.
     **/
    function updateAccountOwner(
        bytes32 _label
    ) 
        external 
    {
        bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label));
        require(msg.sender == ensRegistry.owner(namehash), "Caller not owner of ENS node.");
        require(accounts[_label].creationTime > 0, "Username not registered.");
        require(ensRegistry.owner(ensNode) == address(this), "Registry not owner of registry.");
        accounts[_label].owner = msg.sender;
        emit UsernameOwner(namehash, msg.sender);
    }  

    /**
     * @notice secretly reserve the slashing reward to `msg.sender`
     * @param _secret keccak256(abi.encodePacked(namehash, creationTime, reserveSecret)) 
     */
    function reserveSlash(bytes32 _secret) external {
        require(reservedSlashers[_secret].blockNumber == 0, "Already Reserved");
        reservedSlashers[_secret] = SlashReserve(msg.sender, block.number);
    }

    /**
     * @notice Slash username smaller then `usernameMinLength`.
     * @param _username Raw value of offending username.
     */
    function slashSmallUsername(
        string _username,
        uint256 _reserveSecret
    ) 
        external 
    {
        bytes memory username = bytes(_username);
        require(username.length < usernameMinLength, "Not a small username.");
        slashUsername(username, _reserveSecret);
    }

    /**
     * @notice Slash username starting with "0x" and with length greater than 12.
     * @param _username Raw value of offending username.
     */
    function slashAddressLikeUsername(
        string _username,
        uint256 _reserveSecret
    ) 
        external 
    {
        bytes memory username = bytes(_username);
        require(username.length > 12, "Too small to look like an address.");
        require(username[0] == byte("0"), "First character need to be 0");
        require(username[1] == byte("x"), "Second character need to be x");
        for(uint i = 2; i < 7; i++){
            byte b = username[i];
            require((b >= 48 && b <= 57) || (b >= 97 && b <= 102), "Does not look like an address");
        }
        slashUsername(username, _reserveSecret);
    }  

    /**
     * @notice Slash username that is exactly a reserved name.
     * @param _username Raw value of offending username.
     * @param _proof Merkle proof that name is listed on merkle tree.
     */
    function slashReservedUsername(
        string _username,
        bytes32[] _proof,
        uint256 _reserveSecret
    ) 
        external 
    {   
        bytes memory username = bytes(_username);
        require(
            MerkleProof.verifyProof(
                _proof,
                reservedUsernamesMerkleRoot,
                keccak256(username)
            ),
            "Invalid Proof."
        );
        slashUsername(username, _reserveSecret);
    }

    /**
     * @notice Slash username that contains a non alphanumeric character.
     * @param _username Raw value of offending username.
     * @param _offendingPos Position of non alphanumeric character.
     */
    function slashInvalidUsername(
        string _username,
        uint256 _offendingPos,
        uint256 _reserveSecret
    ) 
        external
    { 
        bytes memory username = bytes(_username);
        require(username.length > _offendingPos, "Invalid position.");
        byte b = username[_offendingPos];
        
        require(!((b >= 48 && b <= 57) || (b >= 97 && b <= 122)), "Not invalid character.");
    
        slashUsername(username, _reserveSecret);
    }

    /**
     * @notice Clear resolver and ownership of unowned subdomians.
     * @param _labels Sequence to erase.
     */
    function eraseNode(
        bytes32[] _labels
    ) 
        external 
    {
        uint len = _labels.length;
        require(len != 0, "Nothing to erase");
        bytes32 label = _labels[len - 1];
        bytes32 subnode = keccak256(abi.encodePacked(ensNode, label));
        require(ensRegistry.owner(subnode) == address(0), "First slash/release top level subdomain");
        ensRegistry.setSubnodeOwner(ensNode, label, address(this));
        if(len > 1) {
            eraseNodeHierarchy(len - 2, _labels, subnode);
        }
        ensRegistry.setResolver(subnode, 0);
        ensRegistry.setOwner(subnode, 0);
    }

    /**
     * @notice Migrate account to new registry, opt-in to new contract.
     * @param _label Username hash.
     **/
    function moveAccount(
        bytes32 _label,
        UsernameRegistrar _newRegistry
    ) 
        external 
    {
        require(state == RegistrarState.Moved, "Wrong contract state");
        require(msg.sender == accounts[_label].owner, "Callable only by account owner.");
        require(ensRegistry.owner(ensNode) == address(_newRegistry), "Wrong update");
        Account memory account = accounts[_label];
        delete accounts[_label];

        token.approve(_newRegistry, account.balance);
        _newRegistry.migrateUsername(
            _label,
            account.balance,
            account.creationTime,
            account.owner
        );
    }

    /** 
     * @notice Activate registration.
     * @param _price The price of registration.
     */
    function activate(
        uint256 _price
    ) 
        external
        onlyController
    {
        require(state == RegistrarState.Inactive, "Registry state is not Inactive");
        require(ensRegistry.owner(ensNode) == address(this), "Registry does not own registry");
        price = _price;
        setState(RegistrarState.Active);
        emit RegistryPrice(_price);
    }

    /** 
     * @notice Updates Public Resolver for resolving users.
     * @param _resolver New PublicResolver.
     */
    function setResolver(
        address _resolver
    ) 
        external
        onlyController
    {
        resolver = PublicResolver(_resolver);
    }

    /**
     * @notice Updates registration price.
     * @param _price New registration price.
     */
    function updateRegistryPrice(
        uint256 _price
    ) 
        external
        onlyController
    {
        require(state == RegistrarState.Active, "Registry not owned");
        price = _price;
        emit RegistryPrice(_price);
    }
  
    /**
     * @notice Transfer ownership of ensNode to `_newRegistry`.
     * Usernames registered are not affected, but they would be able to instantly release.
     * @param _newRegistry New UsernameRegistrar for hodling `ensNode` node.
     */
    function moveRegistry(
        UsernameRegistrar _newRegistry
    ) 
        external
        onlyController
    {
        require(_newRegistry != this, "Cannot move to self.");
        require(ensRegistry.owner(ensNode) == address(this), "Registry not owned anymore.");
        setState(RegistrarState.Moved);
        ensRegistry.setOwner(ensNode, _newRegistry);
        _newRegistry.migrateRegistry(price);
        emit RegistryMoved(_newRegistry);
    }

    /** 
     * @notice Opt-out migration of username from `parentRegistry()`.
     * Clear ENS resolver and subnode owner.
     * @param _label Username hash.
     */
    function dropUsername(
        bytes32 _label
    ) 
        external 
        onlyParentRegistry
    {
        require(accounts[_label].creationTime == 0, "Already migrated");
        bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label));
        ensRegistry.setSubnodeOwner(ensNode, _label, address(this));
        ensRegistry.setResolver(namehash, address(0));
        ensRegistry.setOwner(namehash, address(0));
    }

    /**
     * @notice Withdraw not reserved tokens
     * @param _token Address of ERC20 withdrawing excess, or address(0) if want ETH.
     * @param _beneficiary Address to send the funds.
     **/
    function withdrawExcessBalance(
        address _token,
        address _beneficiary
    )
        external 
        onlyController 
    {
        require(_beneficiary != address(0), "Cannot burn token");
        if (_token == address(0)) {
            _beneficiary.transfer(address(this).balance);
        } else {
            ERC20Token excessToken = ERC20Token(_token);
            uint256 amount = excessToken.balanceOf(address(this));
            if(_token == address(token)){
                require(amount > reserveAmount, "Is not excess");
                amount -= reserveAmount;
            } else {
                require(amount > 0, "No balance");
            }
            excessToken.transfer(_beneficiary, amount);
        }
    }

    /**
     * @notice Withdraw ens nodes not belonging to this contract.
     * @param _domainHash Ens node namehash.
     * @param _beneficiary New owner of ens node.
     **/
    function withdrawWrongNode(
        bytes32 _domainHash,
        address _beneficiary
    ) 
        external
        onlyController
    {
        require(_beneficiary != address(0), "Cannot burn node");
        require(_domainHash != ensNode, "Cannot withdraw main node");   
        require(ensRegistry.owner(_domainHash) == address(this), "Not owner of this node");   
        ensRegistry.setOwner(_domainHash, _beneficiary);
    }

    /**
     * @notice Gets registration price.
     * @return Registration price.
     **/
    function getPrice() 
        external 
        view 
        returns(uint256 registryPrice) 
    {
        return price;
    }
    
    /**
     * @notice reads amount tokens locked in username 
     * @param _label Username hash.
     * @return Locked username balance.
     **/
    function getAccountBalance(bytes32 _label)
        external
        view
        returns(uint256 accountBalance) 
    {
        accountBalance = accounts[_label].balance;
    }

    /**
     * @notice reads username account owner at this contract, 
     * which can release or migrate in case of upgrade.
     * @param _label Username hash.
     * @return Username account owner.
     **/
    function getAccountOwner(bytes32 _label)
        external
        view
        returns(address owner) 
    {
        owner = accounts[_label].owner;
    }

    /**
     * @notice reads when the account was registered 
     * @param _label Username hash.
     * @return Registration time.
     **/
    function getCreationTime(bytes32 _label)
        external
        view
        returns(uint256 creationTime) 
    {
        creationTime = accounts[_label].creationTime;
    }

    /**
     * @notice calculate time where username can be released 
     * @param _label Username hash.
     * @return Exact time when username can be released.
     **/
    function getExpirationTime(bytes32 _label)
        external
        view
        returns(uint256 releaseTime)
    {
        uint256 creationTime = accounts[_label].creationTime;
        if (creationTime > 0){
            releaseTime = creationTime + releaseDelay;
        }
    }

    /**
     * @notice calculate reward part an account could payout on slash 
     * @param _label Username hash.
     * @return Part of reward
     **/
    function getSlashRewardPart(bytes32 _label)
        external
        view
        returns(uint256 partReward)
    {
        uint256 balance = accounts[_label].balance;
        if (balance > 0) {
            partReward = balance / 3;
        }
    }

    /**
     * @notice Support for "approveAndCall". Callable only by `token()`.  
     * @param _from Who approved.
     * @param _amount Amount being approved, need to be equal `getPrice()`.
     * @param _token Token being approved, need to be equal `token()`.
     * @param _data Abi encoded data with selector of `register(bytes32,address,bytes32,bytes32)`.
     */
    function receiveApproval(
        address _from,
        uint256 _amount,
        address _token,
        bytes _data
    ) 
        public
    {
        require(_amount == price, "Wrong value");
        require(_token == address(token), "Wrong token");
        require(_token == address(msg.sender), "Wrong call");
        require(_data.length <= 132, "Wrong data length");
        bytes4 sig;
        bytes32 label;
        address account;
        bytes32 pubkeyA;
        bytes32 pubkeyB;
        (sig, label, account, pubkeyA, pubkeyB) = abiDecodeRegister(_data);
        require(
            sig == bytes4(0xb82fedbb), //bytes4(keccak256("register(bytes32,address,bytes32,bytes32)"))
            "Wrong method selector"
        );
        registerUser(_from, label, account, pubkeyA, pubkeyB);
    }
   
    /**
     * @notice Continues migration of username to new registry.
     * @param _label Username hash.
     * @param _tokenBalance Amount being transfered from `parentRegistry()`.
     * @param _creationTime Time user registrated in `parentRegistry()` is preserved. 
     * @param _accountOwner Account owner which migrated the account.
     **/
    function migrateUsername(
        bytes32 _label,
        uint256 _tokenBalance,
        uint256 _creationTime,
        address _accountOwner
    )
        external
        onlyParentRegistry
    {
        if (_tokenBalance > 0) {
            require(
                token.transferFrom(
                    parentRegistry,
                    address(this),
                    _tokenBalance
                ), 
                "Error moving funds from old registar."
            );
            reserveAmount += _tokenBalance;
        }
        accounts[_label] = Account(_tokenBalance, _creationTime, _accountOwner);
    }

    /**
     * @dev callable only by parent registry to continue migration
     * of registry and activate registration.
     * @param _price The price of registration.
     **/
    function migrateRegistry(
        uint256 _price
    ) 
        external
        onlyParentRegistry
    {
        require(state == RegistrarState.Inactive, "Not Inactive");
        require(ensRegistry.owner(ensNode) == address(this), "ENS registry owner not transfered.");
        price = _price;
        setState(RegistrarState.Active);
        emit RegistryPrice(_price);
    }

    /**
     * @notice Registers `_label` username to `ensNode` setting msg.sender as owner.
     * @param _owner Address registering the user and paying registry price.
     * @param _label Choosen unowned username hash.
     * @param _account Optional address to set at public resolver.
     * @param _pubkeyA Optional pubkey part A to set at public resolver.
     * @param _pubkeyB Optional pubkey part B to set at public resolver.
     */
    function registerUser(
        address _owner,
        bytes32 _label,
        address _account,
        bytes32 _pubkeyA,
        bytes32 _pubkeyB
    ) 
        internal 
        returns(bytes32 namehash)
    {
        require(state == RegistrarState.Active, "Registry not active.");
        namehash = keccak256(abi.encodePacked(ensNode, _label));
        require(ensRegistry.owner(namehash) == address(0), "ENS node already owned.");
        require(accounts[_label].creationTime == 0, "Username already registered.");
        accounts[_label] = Account(price, block.timestamp, _owner);
        if(price > 0) {
            require(token.allowance(_owner, address(this)) >= price, "Unallowed to spend.");
            require(
                token.transferFrom(
                    _owner,
                    address(this),
                    price
                ),
                "Transfer failed"
            );
            reserveAmount += price;
        } 
    
        bool resolvePubkey = _pubkeyA != 0 || _pubkeyB != 0;
        bool resolveAccount = _account != address(0);
        if (resolvePubkey || resolveAccount) {
            //set to self the ownership to setup initial resolver
            ensRegistry.setSubnodeOwner(ensNode, _label, address(this));
            ensRegistry.setResolver(namehash, resolver); //default resolver
            if (resolveAccount) {
                resolver.setAddr(namehash, _account);
            }
            if (resolvePubkey) {
                resolver.setPubkey(namehash, _pubkeyA, _pubkeyB);
            }
            ensRegistry.setOwner(namehash, _owner);
        } else {
            //transfer ownership of subdone directly to registrant
            ensRegistry.setSubnodeOwner(ensNode, _label, _owner);
        }
        emit UsernameOwner(namehash, _owner);
    }
    
    /**
     * @dev Removes account hash of `_username` and send account.balance to msg.sender.
     * @param _username Username being slashed.
     */
    function slashUsername(
        bytes _username,
        uint256 _reserveSecret
    ) 
        internal 
    {
        bytes32 label = keccak256(_username);
        bytes32 namehash = keccak256(abi.encodePacked(ensNode, label));
        uint256 amountToTransfer = 0;
        uint256 creationTime = accounts[label].creationTime;
        address owner = ensRegistry.owner(namehash);
        if(creationTime == 0) {
            require(
                owner != address(0) ||
                ensRegistry.resolver(namehash) != address(0),
                "Nothing to slash."
            );
        } else {
            assert(creationTime != block.timestamp);
            amountToTransfer = accounts[label].balance;
            delete accounts[label];
        }

        ensRegistry.setSubnodeOwner(ensNode, label, address(this));
        ensRegistry.setResolver(namehash, address(0));
        ensRegistry.setOwner(namehash, address(0));
        
        if (amountToTransfer > 0) {
            reserveAmount -= amountToTransfer;
            uint256 partialDeposit = amountToTransfer / 3;
            amountToTransfer = partialDeposit * 2; // reserve 1/3 to network (controller)
            bytes32 secret = keccak256(abi.encodePacked(namehash, creationTime, _reserveSecret));
            SlashReserve memory reserve = reservedSlashers[secret];
            require(reserve.reserver != address(0), "Not reserved.");
            require(reserve.blockNumber < block.number, "Cannot reveal in same block");
            delete reservedSlashers[secret];

            require(token.transfer(reserve.reserver, amountToTransfer), "Error in transfer.");
        }
        emit UsernameOwner(namehash, address(0));
    }

    function setState(RegistrarState _state) private {
        state = _state;
        emit RegistryState(_state);
    }

    /**
     * @notice recursively erase all _labels in _subnode
     * @param _idx recursive position of _labels to erase
     * @param _labels list of subnode labes
     * @param _subnode subnode being erased
     */
    function eraseNodeHierarchy(
        uint _idx,
        bytes32[] _labels,
        bytes32 _subnode
    ) 
        private 
    {
        // Take ownership of the node
        ensRegistry.setSubnodeOwner(_subnode, _labels[_idx], address(this));
        bytes32 subnode = keccak256(abi.encodePacked(_subnode, _labels[_idx]));

        // Recurse if there are more labels
        if (_idx > 0) {
            eraseNodeHierarchy(_idx - 1, _labels, subnode);
        }

        // Erase the resolver and owner records
        ensRegistry.setResolver(subnode, 0);
        ensRegistry.setOwner(subnode, 0);
    }

    /**
     * @dev Decodes abi encoded data with selector for "register(bytes32,address,bytes32,bytes32)".
     * @param _data Abi encoded data.
     * @return Decoded registry call.
     */
    function abiDecodeRegister(
        bytes _data
    ) 
        private 
        pure 
        returns(
            bytes4 sig,
            bytes32 label,
            address account,
            bytes32 pubkeyA,
            bytes32 pubkeyB
        )
    {
        assembly {
            sig := mload(add(_data, add(0x20, 0)))
            label := mload(add(_data, 36))
            account := mload(add(_data, 68))
            pubkeyA := mload(add(_data, 100))
            pubkeyB := mload(add(_data, 132))
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_secret","type":"bytes32"}],"name":"reserveSlash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservedUsernamesMerkleRoot","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_beneficiary","type":"address"}],"name":"withdrawExcessBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"updateAccountOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newController","type":"address"}],"name":"changeController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_offendingPos","type":"uint256"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashInvalidUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_proof","type":"bytes32[]"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashReservedUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserveAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"usernameMinLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getCreationTime","outputs":[{"name":"creationTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseDelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ensRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_tokenBalance","type":"uint256"},{"name":"_creationTime","type":"uint256"},{"name":"_accountOwner","type":"address"}],"name":"migrateUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getSlashRewardPart","outputs":[{"name":"partReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"updateRegistryPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashAddressLikeUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_token","type":"address"},{"name":"_data","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashSmallUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"name":"registryPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"migrateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getExpirationTime","outputs":[{"name":"releaseTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getAccountOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_domainHash","type":"bytes32"},{"name":"_beneficiary","type":"address"}],"name":"withdrawWrongNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_account","type":"address"},{"name":"_pubkeyA","type":"bytes32"},{"name":"_pubkeyB","type":"bytes32"}],"name":"register","outputs":[{"name":"namehash","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"accounts","outputs":[{"name":"balance","type":"uint256"},{"name":"creationTime","type":"uint256"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_newRegistry","type":"address"}],"name":"moveAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"parentRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ensNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_labels","type":"bytes32[]"}],"name":"eraseNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRegistry","type":"address"}],"name":"moveRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getAccountBalance","outputs":[{"name":"accountBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"dropUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_ensRegistry","type":"address"},{"name":"_resolver","type":"address"},{"name":"_ensNode","type":"bytes32"},{"name":"_usernameMinLength","type":"uint256"},{"name":"_reservedUsernamesMerkleRoot","type":"bytes32"},{"name":"_parentRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"state","type":"uint8"}],"name":"RegistryState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"uint256"}],"name":"RegistryPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRegistry","type":"address"}],"name":"RegistryMoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nameHash","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"UsernameOwner","type":"event"}]

60806040523480156200001157600080fd5b5060405160e080620049ea83398101604090815281516020830151918301516060840151608085015160a086015160c09096015160008054600160a060020a031916331790559395929391929091600160a060020a0387161515620000d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f204552433230546f6b656e206164647265737320646566696e65642e0000604482015290519081900360640190fd5b600160a060020a03861615156200014f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f20454e53206164647265737320646566696e65642e000000000000000000604482015290519081900360640190fd5b600160a060020a0385161515620001c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e6f205265736f6c766572206164647265737320646566696e65642e00000000604482015290519081900360640190fd5b8315156200023657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f20454e53206e6f646520646566696e65642e000000000000000000000000604482015290519081900360640190fd5b60018054600160a060020a03808a16600160a060020a03199283161790925560028054898416908316179055600380548884169083161790556009869055600785905560088490556004805492841692909116919091179055620002a46000640100000000620002b1810204565b5050505050505062000319565b600b805482919060ff19166001836002811115620002cb57fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156200030357fe5b60ff16815260200191505060405180910390a150565b6146c180620003296000396000f3006080604052600436106101d45763ffffffff60e060020a60003504166304f3bcec81146101d957806305c244811461020a57806307f908cb14610224578063307c7a0d1461024b57806332e1ed24146102725780633cebb8231461028a57806340784ebd146102ab57806340b1ad52146102d25780634b09b72a146103015780634e543b261461031657806359ad02091461033757806367d42a8b1461034c5780636f79301d146103645780637195bf231461037c5780637d73b2311461039157806380cd0015146103a65780638382b460146103d0578063860e9b0f146103e85780638cf7b7a4146104005780638f4ffcb11461042457806396bba9a81461049457806398d5fdca146104b857806398f038ff146104cd578063a035b1fe146104e5578063a1454830146104fa578063aacffccf14610512578063afe12e771461052a578063b260c42a1461054e578063b82fedbb14610566578063bc529c4314610590578063c19d93fb146105cf578063c23e61b914610608578063c9b84d4d1461062c578063ddbcf3a114610641578063de10f04b14610656578063e882c3ce14610676578063ebf701e014610697578063f77c4791146106af578063f9e54282146106c4578063fc0c546a146106dc575b600080fd5b3480156101e557600080fd5b506101ee6106f1565b60408051600160a060020a039092168252519081900360200190f35b34801561021657600080fd5b50610222600435610700565b005b34801561023057600080fd5b506102396107ae565b60408051918252519081900360200190f35b34801561025757600080fd5b50610222600160a060020a03600435811690602435166107b4565b34801561027e57600080fd5b50610222600435610a74565b34801561029657600080fd5b50610222600160a060020a0360043516610d60565b3480156102b757600080fd5b50610222602460048035828101929101359035604435610d99565b3480156102de57600080fd5b506102226024600480358281019290820135918135918201910135604435610f78565b34801561030d57600080fd5b506102396110a7565b34801561032257600080fd5b50610222600160a060020a03600435166110ad565b34801561034357600080fd5b506102396110e6565b34801561035857600080fd5b506102226004356110ec565b34801561037057600080fd5b506102396004356117ef565b34801561038857600080fd5b50610239611804565b34801561039d57600080fd5b506101ee61180c565b3480156103b257600080fd5b50610222600435602435604435600160a060020a036064351661181b565b3480156103dc57600080fd5b50610239600435611a09565b3480156103f457600080fd5b50610222600435611a2d565b34801561040c57600080fd5b50610222602460048035828101929101359035611ae7565b34801561043057600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261022294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750611e489650505050505050565b3480156104a057600080fd5b50610222602460048035828101929101359035612091565b3480156104c457600080fd5b5061023961212e565b3480156104d957600080fd5b50610222600435612134565b3480156104f157600080fd5b50610239612346565b34801561050657600080fd5b5061023960043561234c565b34801561051e57600080fd5b506101ee600435612372565b34801561053657600080fd5b50610222600435600160a060020a0360243516612390565b34801561055a57600080fd5b506102226004356125a7565b34801561057257600080fd5b50610239600435600160a060020a0360243516604435606435612703565b34801561059c57600080fd5b506105a860043561271b565b604080519384526020840192909252600160a060020a031682820152519081900360600190f35b3480156105db57600080fd5b506105e4612745565b604051808260028111156105f457fe5b60ff16815260200191505060405180910390f35b34801561061457600080fd5b50610222600435600160a060020a036024351661274e565b34801561063857600080fd5b506101ee612a9c565b34801561064d57600080fd5b50610239612aab565b34801561066257600080fd5b506102226004803560248101910135612ab1565b34801561068257600080fd5b50610222600160a060020a0360043516612e47565b3480156106a357600080fd5b506102396004356130bc565b3480156106bb57600080fd5b506101ee6130ce565b3480156106d057600080fd5b506102226004356130dd565b3480156106e857600080fd5b506101ee61335f565b600354600160a060020a031681565b60008181526006602052604090206001015415610767576040805160e560020a62461bcd02815260206004820152601060248201527f416c726561647920526573657276656400000000000000000000000000000000604482015290519081900360640190fd5b6040805180820182523381524360208083019182526000948552600690529190922091518254600160a060020a031916600160a060020a0390911617825551600190910155565b60085481565b600080548190600160a060020a031633146107ce57600080fd5b600160a060020a038316151561082e576040805160e560020a62461bcd02815260206004820152601160248201527f43616e6e6f74206275726e20746f6b656e000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416151561087a57604051600160a060020a03841690303180156108fc02916000818181858888f19350505050158015610874573d6000803e3d6000fd5b50610a6e565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b1580156108de57600080fd5b505af11580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b5051600154909150600160a060020a038581169116141561098657600c54811161097c576040805160e560020a62461bcd02815260206004820152600d60248201527f4973206e6f742065786365737300000000000000000000000000000000000000604482015290519081900360640190fd5b600c5490036109de565b600081116109de576040805160e560020a62461bcd02815260206004820152600a60248201527f4e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031663a9059cbb84836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b50505b50505050565b6009546040805160208082019390935280820184905281518082038301815260609091019182905280516000939192918291908401908083835b60208310610acd5780518252601f199092019160209182019101610aae565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be3028452600484018290529451909750600160a060020a0390941695506302571be3945060248083019491935090918290030181600087803b158015610b4557600080fd5b505af1158015610b59573d6000803e3d6000fd5b505050506040513d6020811015610b6f57600080fd5b5051600160a060020a03163314610bd0576040805160e560020a62461bcd02815260206004820152601d60248201527f43616c6c6572206e6f74206f776e6572206f6620454e53206e6f64652e000000604482015290519081900360640190fd5b60008281526005602052604081206001015411610c37576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505050506040513d6020811015610cb457600080fd5b5051600160a060020a031614610d14576040805160e560020a62461bcd02815260206004820152601f60248201527f5265676973747279206e6f74206f776e6572206f662072656769737472792e00604482015290519081900360640190fd5b6000828152600560209081526040918290206002018054600160a060020a0319163390811790915582519081529151839260008051602061467683398151915292908290030190a25050565b600054600160a060020a03163314610d7757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6060600085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509150838251111515610e2c576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420706f736974696f6e2e000000000000000000000000000000604482015290519081900360640190fd5b8184815181101515610e3a57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610eaf57507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80610f1957507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610f1957507f7a00000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b15610f6e576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f7420696e76616c6964206368617261637465722e00000000000000000000604482015290519081900360640190fd5b610a6b828461336e565b606085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509050611047848480806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050600854836040518082805190602001908083835b602083106110155780518252601f199092019160209182019101610ff6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020613a4b565b151561109d576040805160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642050726f6f662e000000000000000000000000000000000000604482015290519081900360640190fd5b610a6b818361336e565b600c5481565b600054600160a060020a031633146110c457600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b60006110f6614633565b6009546040805160208082019390935280820186905281518082038301815260609091019182905280516000939192918291908401908083835b6020831061114f5780518252601f199092019160209182019101611130565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008b81526005835285812060608501875280548552600181015493850184905260020154600160a060020a031695840195909552985090965091909111925061120d915050576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561122057fe5b1415611368576002546040805160e060020a6302571be3028152600481018690529051600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b5051600160a060020a03163314611302576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f6620454e53206e6f64652e00000000000000000000604482015290519081900360640190fd5b60208201516301e13380014211611363576040805160e560020a62461bcd02815260206004820152601b60248201527f52656c6561736520706572696f64206e6f7420726561636865642e0000000000604482015290519081900360640190fd5b6113cc565b6040820151600160a060020a031633146113cc576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6f742074686520666f726d6572206163636f756e74206f776e65722e000000604482015290519081900360640190fd5b6000848152600560205260408120818155600181018290556002018054600160a060020a0319169055825111156114f6578151600c80548290039055600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b505050506040513d602081101561149e57600080fd5b505115156114f6576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561150957fe5b1415611664576002546009546040805160e060020a6306ab592302815260048101929092526024820187905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018890526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018890526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506117c4565b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505160408051602480820188905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff9e542820000000000000000000000000000000000000000000000000000000017815291518151939450600160a060020a038516936201388093829180838360005b83811015611780578181015183820152602001611768565b50505050905090810190601f1680156117ad5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008787f1505050505b604080516000815290518491600080516020614676833981519152919081900360200190a250505050565b60009081526005602052604090206001015490565b6301e1338081565b600254600160a060020a031681565b600454600160a060020a0316331461187d576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b60008311156119b05760015460048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935230602484015260448301879052519216916323b872dd916064808201926020929091908290030181600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b505115156119a7576040805160e560020a62461bcd02815260206004820152602560248201527f4572726f72206d6f76696e672066756e64732066726f6d206f6c64207265676960448201527f737461722e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8054840190555b604080516060810182529384526020808501938452600160a060020a039283168583019081526000968752600590915294209251835590516001830155915160029091018054600160a060020a03191691909216179055565b60008181526005602052604081205481811115611a27576003810491505b50919050565b600054600160a060020a03163314611a4457600080fd5b6001600b5460ff166002811115611a5757fe5b14611aac576040805160e560020a62461bcd02815260206004820152601260248201527f5265676973747279206e6f74206f776e65640000000000000000000000000000604482015290519081900360640190fd5b600a8190556040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b606060008085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509250600c8351111515611ba2576040805160e560020a62461bcd02815260206004820152602260248201527f546f6f20736d616c6c20746f206c6f6f6b206c696b6520616e2061646472657360448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82517f30000000000000000000000000000000000000000000000000000000000000009084906000908110611bd357fe5b60209101015160f860020a9081900402600160f860020a03191614611c42576040805160e560020a62461bcd02815260206004820152601c60248201527f466972737420636861726163746572206e65656420746f206265203000000000604482015290519081900360640190fd5b82517f78000000000000000000000000000000000000000000000000000000000000009084906001908110611c7357fe5b60209101015160f860020a9081900402600160f860020a03191614611ce2576040805160e560020a62461bcd02815260206004820152601d60248201527f5365636f6e6420636861726163746572206e65656420746f2062652078000000604482015290519081900360640190fd5b600291505b6007821015611e3e578282815181101515611cfe57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611d7357507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80611ddd57507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611ddd57507f6600000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b1515611e33576040805160e560020a62461bcd02815260206004820152601d60248201527f446f6573206e6f74206c6f6f6b206c696b6520616e2061646472657373000000604482015290519081900360640190fd5b600190910190611ce7565b610a6b838561336e565b6000806000806000600a5488141515611eab576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03888116911614611f10576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e6720746f6b656e000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0387163314611f70576040805160e560020a62461bcd02815260206004820152600a60248201527f57726f6e672063616c6c00000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160841015611fca576040805160e560020a62461bcd02815260206004820152601160248201527f57726f6e672064617461206c656e677468000000000000000000000000000000604482015290519081900360640190fd5b611fd386613b9a565b9398509196509450925090507fffffffff0000000000000000000000000000000000000000000000000000000085167fb82fedbb0000000000000000000000000000000000000000000000000000000014612078576040805160e560020a62461bcd02815260206004820152601560248201527f57726f6e67206d6574686f642073656c6563746f720000000000000000000000604482015290519081900360640190fd5b6120858985858585613bbe565b50505050505050505050565b606083838080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090506007548151101515612124576040805160e560020a62461bcd02815260206004820152601560248201527f4e6f74206120736d616c6c20757365726e616d652e0000000000000000000000604482015290519081900360640190fd5b610a6e818361336e565b600a5490565b600454600160a060020a03163314612196576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b6000600b5460ff1660028111156121a957fe5b146121fe576040805160e560020a62461bcd02815260206004820152600c60248201527f4e6f7420496e6163746976650000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152602260248201527f454e53207265676973747279206f776e6572206e6f74207472616e736665726560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600a81905561231060016143aa565b6040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b600a5481565b60008181526005602052604081206001015481811115611a27576301e133800192915050565b600090815260056020526040902060020154600160a060020a031690565b600054600160a060020a031633146123a757600080fd5b600160a060020a0381161515612407576040805160e560020a62461bcd02815260206004820152601060248201527f43616e6e6f74206275726e206e6f646500000000000000000000000000000000604482015290519081900360640190fd5b600954821415612461576040805160e560020a62461bcd02815260206004820152601960248201527f43616e6e6f74207769746864726177206d61696e206e6f646500000000000000604482015290519081900360640190fd5b6002546040805160e060020a6302571be30281526004810185905290513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b1580156124b157600080fd5b505af11580156124c5573d6000803e3d6000fd5b505050506040513d60208110156124db57600080fd5b5051600160a060020a03161461253b576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f662074686973206e6f646500000000000000000000604482015290519081900360640190fd5b6002546040805160e060020a635b0fc9c302815260048101859052600160a060020a03848116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b15801561259357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b600054600160a060020a031633146125be57600080fd5b6000600b5460ff1660028111156125d157fe5b14612626576040805160e560020a62461bcd02815260206004820152601e60248201527f5265676973747279207374617465206973206e6f7420496e6163746976650000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d60208110156126a357600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152601e60248201527f526567697374727920646f6573206e6f74206f776e2072656769737472790000604482015290519081900360640190fd5b60006127123386868686613bbe565b95945050505050565b600560205260009081526040902080546001820154600290920154909190600160a060020a031683565b600b5460ff1681565b612756614633565b6002600b5460ff16600281111561276957fe5b146127be576040805160e560020a62461bcd02815260206004820152601460248201527f57726f6e6720636f6e7472616374207374617465000000000000000000000000604482015290519081900360640190fd5b600083815260056020526040902060020154600160a060020a0316331461282f576040805160e560020a62461bcd02815260206004820152601f60248201527f43616c6c61626c65206f6e6c79206279206163636f756e74206f776e65722e00604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a038086169316916302571be39160248083019260209291908290030181600087803b15801561288457600080fd5b505af1158015612898573d6000803e3d6000fd5b505050506040513d60208110156128ae57600080fd5b5051600160a060020a03161461290e576040805160e560020a62461bcd02815260206004820152600c60248201527f57726f6e67207570646174650000000000000000000000000000000000000000604482015290519081900360640190fd5b5060008281526005602081815260408084208151606081018352815481526001808301805483870152600284018054600160a060020a03808216868901528c8b529888529489905590889055600160a060020a03199093169092559054815183517f095ea7b3000000000000000000000000000000000000000000000000000000008152888716600482015260248101919091529251919594169363095ea7b393604480850194919392918390030190829087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b505050506040513d60208110156129f957600080fd5b50508051602082015160408084015181517f80cd00150000000000000000000000000000000000000000000000000000000081526004810188905260248101949094526044840192909252600160a060020a03918216606484015251908416916380cd001591608480830192600092919082900301818387803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b50505050505050565b600454600160a060020a031681565b60095481565b80600080821515612b0c576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f7468696e6720746f20657261736500000000000000000000000000000000604482015290519081900360640190fd5b84846000198501818110612b1c57fe5b6009546040805160208181019390935292820294909401358285018190528451808403860181526060909301948590528251909650919392508291908401908083835b60208310612b7e5780518252601f199092019160209182019101612b5f565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190975060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015612bf957600080fd5b505af1158015612c0d573d6000803e3d6000fd5b505050506040513d6020811015612c2357600080fd5b5051600160a060020a031614612ca9576040805160e560020a62461bcd02815260206004820152602760248201527f466972737420736c6173682f72656c6561736520746f70206c6576656c20737560448201527f62646f6d61696e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6002546009546040805160e060020a6306ab592302815260048101929092526024820185905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506001831115612d6657612d6660028403868680806020026020016040519081016040528093929190818152602001838360200280828437508894506144109350505050565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050505050505050565b600054600160a060020a03163314612e5e57600080fd5b600160a060020a038116301415612ebf576040805160e560020a62461bcd02815260206004820152601460248201527f43616e6e6f74206d6f766520746f2073656c662e000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015612f1257600080fd5b505af1158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051600160a060020a031614612f9c576040805160e560020a62461bcd02815260206004820152601b60248201527f5265676973747279206e6f74206f776e656420616e796d6f72652e0000000000604482015290519081900360640190fd5b612fa660026143aa565b6002546009546040805160e060020a635b0fc9c30281526004810192909252600160a060020a0384811660248401529051921691635b0fc9c39160448082019260009290919082900301818387803b15801561300157600080fd5b505af1158015613015573d6000803e3d6000fd5b5050505080600160a060020a03166398f038ff600a546040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561306457600080fd5b505af1158015613078573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fce0afb4c27dbd57a3646e2d639557521bfb05a42dc0ec50f9c1fe13d92e3e6d69350908190036020019150a150565b60009081526005602052604090205490565b600054600160a060020a031681565b600454600090600160a060020a03163314613142576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b600082815260056020526040902060010154156131a9576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206d6967726174656400000000000000000000000000000000604482015290519081900360640190fd5b60095460408051602080820193909352808201859052815180820383018152606090910191829052805190928291908401908083835b602083106131fe5780518252601f1990920191602091820191016131df565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812060025460095460e060020a6306ab59230284526004840152602483018990523060448401529351909650600160a060020a0390931694506306ab59239350606480820193600093509182900301818387803b15801561328757600080fd5b505af115801561329b573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018690526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156132f357600080fd5b505af1158015613307573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561259357600080fd5b600154600160a060020a031681565b600080600080600080600061338161465e565b896040518082805190602001908083835b602083106133b15780518252601f199092019160209182019101613392565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600954838301528285018190528451808403860181526060909301948590528251909e509195509293508392850191508083835b6020831061342b5780518252601f19909201916020918201910161340c565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008f8152600583528581206001015460025460e060020a6302571be3028652600486018490529651929f50909d509b50600160a060020a0390941695506302571be39450602480830194919350909182900301818c87803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d60208110156134e157600080fd5b505193508415156135f757600160a060020a03841615158061359c5750600254604080517f0178b8bf000000000000000000000000000000000000000000000000000000008152600481018a90529051600092600160a060020a031691630178b8bf91602480830192602092919082900301818787803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b5051600160a060020a031614155b15156135f2576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7468696e6720746f20736c6173682e000000000000000000000000000000604482015290519081900360640190fd5b613630565b4285141561360157fe5b6000888152600560205260408120805482825560018201929092556002018054600160a060020a031916905595505b6002546009546040805160e060020a6306ab59230281526004810192909252602482018b905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561369057600080fd5b505af11580156136a4573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018c90526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018c90526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050506000861115613a1a57600c805487900390556040805160208082018a905281830188905260608083018d905283518084039091018152608090920192839052815160026003909a04998a0299965091929182918401908083835b602083106137f95780518252601f1990920191602091820191016137da565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000818152600683528590208386019095528454600160a060020a0316808452600190950154918301919091529650945050151591506138ac9050576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742072657365727665642e00000000000000000000000000000000000000604482015290519081900360640190fd5b60208101514311613907576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f742072657665616c20696e2073616d6520626c6f636b0000000000604482015290519081900360640190fd5b60008281526006602090815260408083208054600160a060020a0319168155600190810184905554845182517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039182166004820152602481018c9052925191169363a9059cbb93604480850194919392918390030190829087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d60208110156139c257600080fd5b50511515613a1a576040805160e560020a62461bcd02815260206004820152601260248201527f4572726f7220696e207472616e736665722e0000000000000000000000000000604482015290519081900360640190fd5b604080516000815290518891600080516020614676833981519152919081900360200190a250505050505050505050565b60008181805b8651821015613b8d578682815181101515613a6857fe5b60209081029091010151905080831015613b0157604080516020808201869052818301849052825180830384018152606090920192839052815191929182918401908083835b60208310613acd5780518252601f199092019160209182019101613aae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209250613b82565b604080516020808201849052818301869052825180830384018152606090920192839052815191929182918401908083835b60208310613b525780518252601f199092019160209182019101613b33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092505b600190910190613a51565b5050929092149392505050565b60208101516024820151604483015160648401516084909401519294919390929091565b600080806001600b5460ff166002811115613bd557fe5b14613c2a576040805160e560020a62461bcd02815260206004820152601460248201527f5265676973747279206e6f74206163746976652e000000000000000000000000604482015290519081900360640190fd5b600954604080516020808201939093528082018a9052815180820383018152606090910191829052805190928291908401908083835b60208310613c7f5780518252601f199092019160209182019101613c60565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190995060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506040513d6020811015613d2457600080fd5b5051600160a060020a031614613d84576040805160e560020a62461bcd02815260206004820152601760248201527f454e53206e6f646520616c7265616479206f776e65642e000000000000000000604482015290519081900360640190fd5b60008781526005602052604090206001015415613deb576040805160e560020a62461bcd02815260206004820152601c60248201527f557365726e616d6520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b60408051606081018252600a80548252426020808401918252600160a060020a038d811685870190815260008e815260059093529582209451855591516001850155935160029093018054600160a060020a031916939091169290921790915554111561404d57600a54600154604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b50511015613f45576040805160e560020a62461bcd02815260206004820152601360248201527f556e616c6c6f77656420746f207370656e642e00000000000000000000000000604482015290519081900360640190fd5b600154600a54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301526044820193909352905191909216916323b872dd9160648083019260209291908290030181600087803b158015613fbe57600080fd5b505af1158015613fd2573d6000803e3d6000fd5b505050506040513d6020811015613fe857600080fd5b50511515614040576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b600a54600c805490910190555b8415158061405a57508315155b915050600160a060020a038516151581806140725750805b156142f7576002546009546040805160e060020a6306ab59230281526004810192909252602482018a905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b1580156140d757600080fd5b505af11580156140eb573d6000803e3d6000fd5b50506002546003546040805160e160020a630c4b7b8502815260048101899052600160a060020a0392831660248201529051919092169350631896f70a9250604480830192600092919082900301818387803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b5050505080156141ef57600354604080517fd5fa2b0000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a0389811660248301529151919092169163d5fa2b0091604480830192600092919082900301818387803b1580156141d657600080fd5b505af11580156141ea573d6000803e3d6000fd5b505050505b811561428257600354604080517f29cd62ea0000000000000000000000000000000000000000000000000000000081526004810186905260248101889052604481018790529051600160a060020a03909216916329cd62ea9160648082019260009290919082900301818387803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b6002546040805160e060020a635b0fc9c302815260048101869052600160a060020a038b8116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b1580156142da57600080fd5b505af11580156142ee573d6000803e3d6000fd5b50505050614372565b6002546009546040805160e060020a6306ab59230281526004810192909252602482018a9052600160a060020a038b8116604484015290519216916306ab59239160648082019260009290919082900301818387803b15801561435957600080fd5b505af115801561436d573d6000803e3d6000fd5b505050505b60408051600160a060020a038a16815290518491600080516020614676833981519152919081900360200190a2505095945050505050565b600b805482919060ff191660018360028111156143c357fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156143fa57fe5b60ff16815260200191505060405180910390a150565b6002548251600091600160a060020a0316906306ab592390849086908890811061443657fe5b602090810290910101516040805160e060020a63ffffffff86160281526004810193909352602483019190915230604483015251606480830192600092919082900301818387803b15801561448a57600080fd5b505af115801561449e573d6000803e3d6000fd5b505050508183858151811015156144b157fe5b6020908102909101810151604080518084019490945283810191909152805180840382018152606090930190819052825190918291908401908083835b6020831061450d5780518252601f1990920191602091820191016144ee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600084111561455357614553600185038483614410565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561461557600080fd5b505af1158015614629573d6000803e3d6000fd5b5050505050505050565b60606040519081016040528060008152602001600081526020016000600160a060020a031681525090565b6040805180820190915260008082526020820152905600d2da4206c3fa95b8fc1ee48627023d322b59cc7218e14cb95cf0c0fe562f2e4da165627a7a723058209db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b0029000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc45f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff0000000000000000000000000000000000000000000000000000000000000003b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d45763ffffffff60e060020a60003504166304f3bcec81146101d957806305c244811461020a57806307f908cb14610224578063307c7a0d1461024b57806332e1ed24146102725780633cebb8231461028a57806340784ebd146102ab57806340b1ad52146102d25780634b09b72a146103015780634e543b261461031657806359ad02091461033757806367d42a8b1461034c5780636f79301d146103645780637195bf231461037c5780637d73b2311461039157806380cd0015146103a65780638382b460146103d0578063860e9b0f146103e85780638cf7b7a4146104005780638f4ffcb11461042457806396bba9a81461049457806398d5fdca146104b857806398f038ff146104cd578063a035b1fe146104e5578063a1454830146104fa578063aacffccf14610512578063afe12e771461052a578063b260c42a1461054e578063b82fedbb14610566578063bc529c4314610590578063c19d93fb146105cf578063c23e61b914610608578063c9b84d4d1461062c578063ddbcf3a114610641578063de10f04b14610656578063e882c3ce14610676578063ebf701e014610697578063f77c4791146106af578063f9e54282146106c4578063fc0c546a146106dc575b600080fd5b3480156101e557600080fd5b506101ee6106f1565b60408051600160a060020a039092168252519081900360200190f35b34801561021657600080fd5b50610222600435610700565b005b34801561023057600080fd5b506102396107ae565b60408051918252519081900360200190f35b34801561025757600080fd5b50610222600160a060020a03600435811690602435166107b4565b34801561027e57600080fd5b50610222600435610a74565b34801561029657600080fd5b50610222600160a060020a0360043516610d60565b3480156102b757600080fd5b50610222602460048035828101929101359035604435610d99565b3480156102de57600080fd5b506102226024600480358281019290820135918135918201910135604435610f78565b34801561030d57600080fd5b506102396110a7565b34801561032257600080fd5b50610222600160a060020a03600435166110ad565b34801561034357600080fd5b506102396110e6565b34801561035857600080fd5b506102226004356110ec565b34801561037057600080fd5b506102396004356117ef565b34801561038857600080fd5b50610239611804565b34801561039d57600080fd5b506101ee61180c565b3480156103b257600080fd5b50610222600435602435604435600160a060020a036064351661181b565b3480156103dc57600080fd5b50610239600435611a09565b3480156103f457600080fd5b50610222600435611a2d565b34801561040c57600080fd5b50610222602460048035828101929101359035611ae7565b34801561043057600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261022294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750611e489650505050505050565b3480156104a057600080fd5b50610222602460048035828101929101359035612091565b3480156104c457600080fd5b5061023961212e565b3480156104d957600080fd5b50610222600435612134565b3480156104f157600080fd5b50610239612346565b34801561050657600080fd5b5061023960043561234c565b34801561051e57600080fd5b506101ee600435612372565b34801561053657600080fd5b50610222600435600160a060020a0360243516612390565b34801561055a57600080fd5b506102226004356125a7565b34801561057257600080fd5b50610239600435600160a060020a0360243516604435606435612703565b34801561059c57600080fd5b506105a860043561271b565b604080519384526020840192909252600160a060020a031682820152519081900360600190f35b3480156105db57600080fd5b506105e4612745565b604051808260028111156105f457fe5b60ff16815260200191505060405180910390f35b34801561061457600080fd5b50610222600435600160a060020a036024351661274e565b34801561063857600080fd5b506101ee612a9c565b34801561064d57600080fd5b50610239612aab565b34801561066257600080fd5b506102226004803560248101910135612ab1565b34801561068257600080fd5b50610222600160a060020a0360043516612e47565b3480156106a357600080fd5b506102396004356130bc565b3480156106bb57600080fd5b506101ee6130ce565b3480156106d057600080fd5b506102226004356130dd565b3480156106e857600080fd5b506101ee61335f565b600354600160a060020a031681565b60008181526006602052604090206001015415610767576040805160e560020a62461bcd02815260206004820152601060248201527f416c726561647920526573657276656400000000000000000000000000000000604482015290519081900360640190fd5b6040805180820182523381524360208083019182526000948552600690529190922091518254600160a060020a031916600160a060020a0390911617825551600190910155565b60085481565b600080548190600160a060020a031633146107ce57600080fd5b600160a060020a038316151561082e576040805160e560020a62461bcd02815260206004820152601160248201527f43616e6e6f74206275726e20746f6b656e000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416151561087a57604051600160a060020a03841690303180156108fc02916000818181858888f19350505050158015610874573d6000803e3d6000fd5b50610a6e565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b1580156108de57600080fd5b505af11580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b5051600154909150600160a060020a038581169116141561098657600c54811161097c576040805160e560020a62461bcd02815260206004820152600d60248201527f4973206e6f742065786365737300000000000000000000000000000000000000604482015290519081900360640190fd5b600c5490036109de565b600081116109de576040805160e560020a62461bcd02815260206004820152600a60248201527f4e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031663a9059cbb84836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b50505b50505050565b6009546040805160208082019390935280820184905281518082038301815260609091019182905280516000939192918291908401908083835b60208310610acd5780518252601f199092019160209182019101610aae565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be3028452600484018290529451909750600160a060020a0390941695506302571be3945060248083019491935090918290030181600087803b158015610b4557600080fd5b505af1158015610b59573d6000803e3d6000fd5b505050506040513d6020811015610b6f57600080fd5b5051600160a060020a03163314610bd0576040805160e560020a62461bcd02815260206004820152601d60248201527f43616c6c6572206e6f74206f776e6572206f6620454e53206e6f64652e000000604482015290519081900360640190fd5b60008281526005602052604081206001015411610c37576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505050506040513d6020811015610cb457600080fd5b5051600160a060020a031614610d14576040805160e560020a62461bcd02815260206004820152601f60248201527f5265676973747279206e6f74206f776e6572206f662072656769737472792e00604482015290519081900360640190fd5b6000828152600560209081526040918290206002018054600160a060020a0319163390811790915582519081529151839260008051602061467683398151915292908290030190a25050565b600054600160a060020a03163314610d7757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6060600085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509150838251111515610e2c576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420706f736974696f6e2e000000000000000000000000000000604482015290519081900360640190fd5b8184815181101515610e3a57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610eaf57507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80610f1957507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610f1957507f7a00000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b15610f6e576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f7420696e76616c6964206368617261637465722e00000000000000000000604482015290519081900360640190fd5b610a6b828461336e565b606085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509050611047848480806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050600854836040518082805190602001908083835b602083106110155780518252601f199092019160209182019101610ff6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020613a4b565b151561109d576040805160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642050726f6f662e000000000000000000000000000000000000604482015290519081900360640190fd5b610a6b818361336e565b600c5481565b600054600160a060020a031633146110c457600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b60006110f6614633565b6009546040805160208082019390935280820186905281518082038301815260609091019182905280516000939192918291908401908083835b6020831061114f5780518252601f199092019160209182019101611130565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008b81526005835285812060608501875280548552600181015493850184905260020154600160a060020a031695840195909552985090965091909111925061120d915050576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561122057fe5b1415611368576002546040805160e060020a6302571be3028152600481018690529051600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b5051600160a060020a03163314611302576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f6620454e53206e6f64652e00000000000000000000604482015290519081900360640190fd5b60208201516301e13380014211611363576040805160e560020a62461bcd02815260206004820152601b60248201527f52656c6561736520706572696f64206e6f7420726561636865642e0000000000604482015290519081900360640190fd5b6113cc565b6040820151600160a060020a031633146113cc576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6f742074686520666f726d6572206163636f756e74206f776e65722e000000604482015290519081900360640190fd5b6000848152600560205260408120818155600181018290556002018054600160a060020a0319169055825111156114f6578151600c80548290039055600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b505050506040513d602081101561149e57600080fd5b505115156114f6576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561150957fe5b1415611664576002546009546040805160e060020a6306ab592302815260048101929092526024820187905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018890526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018890526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506117c4565b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505160408051602480820188905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff9e542820000000000000000000000000000000000000000000000000000000017815291518151939450600160a060020a038516936201388093829180838360005b83811015611780578181015183820152602001611768565b50505050905090810190601f1680156117ad5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008787f1505050505b604080516000815290518491600080516020614676833981519152919081900360200190a250505050565b60009081526005602052604090206001015490565b6301e1338081565b600254600160a060020a031681565b600454600160a060020a0316331461187d576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b60008311156119b05760015460048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935230602484015260448301879052519216916323b872dd916064808201926020929091908290030181600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b505115156119a7576040805160e560020a62461bcd02815260206004820152602560248201527f4572726f72206d6f76696e672066756e64732066726f6d206f6c64207265676960448201527f737461722e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8054840190555b604080516060810182529384526020808501938452600160a060020a039283168583019081526000968752600590915294209251835590516001830155915160029091018054600160a060020a03191691909216179055565b60008181526005602052604081205481811115611a27576003810491505b50919050565b600054600160a060020a03163314611a4457600080fd5b6001600b5460ff166002811115611a5757fe5b14611aac576040805160e560020a62461bcd02815260206004820152601260248201527f5265676973747279206e6f74206f776e65640000000000000000000000000000604482015290519081900360640190fd5b600a8190556040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b606060008085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509250600c8351111515611ba2576040805160e560020a62461bcd02815260206004820152602260248201527f546f6f20736d616c6c20746f206c6f6f6b206c696b6520616e2061646472657360448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82517f30000000000000000000000000000000000000000000000000000000000000009084906000908110611bd357fe5b60209101015160f860020a9081900402600160f860020a03191614611c42576040805160e560020a62461bcd02815260206004820152601c60248201527f466972737420636861726163746572206e65656420746f206265203000000000604482015290519081900360640190fd5b82517f78000000000000000000000000000000000000000000000000000000000000009084906001908110611c7357fe5b60209101015160f860020a9081900402600160f860020a03191614611ce2576040805160e560020a62461bcd02815260206004820152601d60248201527f5365636f6e6420636861726163746572206e65656420746f2062652078000000604482015290519081900360640190fd5b600291505b6007821015611e3e578282815181101515611cfe57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611d7357507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80611ddd57507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611ddd57507f6600000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b1515611e33576040805160e560020a62461bcd02815260206004820152601d60248201527f446f6573206e6f74206c6f6f6b206c696b6520616e2061646472657373000000604482015290519081900360640190fd5b600190910190611ce7565b610a6b838561336e565b6000806000806000600a5488141515611eab576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03888116911614611f10576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e6720746f6b656e000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0387163314611f70576040805160e560020a62461bcd02815260206004820152600a60248201527f57726f6e672063616c6c00000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160841015611fca576040805160e560020a62461bcd02815260206004820152601160248201527f57726f6e672064617461206c656e677468000000000000000000000000000000604482015290519081900360640190fd5b611fd386613b9a565b9398509196509450925090507fffffffff0000000000000000000000000000000000000000000000000000000085167fb82fedbb0000000000000000000000000000000000000000000000000000000014612078576040805160e560020a62461bcd02815260206004820152601560248201527f57726f6e67206d6574686f642073656c6563746f720000000000000000000000604482015290519081900360640190fd5b6120858985858585613bbe565b50505050505050505050565b606083838080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090506007548151101515612124576040805160e560020a62461bcd02815260206004820152601560248201527f4e6f74206120736d616c6c20757365726e616d652e0000000000000000000000604482015290519081900360640190fd5b610a6e818361336e565b600a5490565b600454600160a060020a03163314612196576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b6000600b5460ff1660028111156121a957fe5b146121fe576040805160e560020a62461bcd02815260206004820152600c60248201527f4e6f7420496e6163746976650000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152602260248201527f454e53207265676973747279206f776e6572206e6f74207472616e736665726560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600a81905561231060016143aa565b6040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b600a5481565b60008181526005602052604081206001015481811115611a27576301e133800192915050565b600090815260056020526040902060020154600160a060020a031690565b600054600160a060020a031633146123a757600080fd5b600160a060020a0381161515612407576040805160e560020a62461bcd02815260206004820152601060248201527f43616e6e6f74206275726e206e6f646500000000000000000000000000000000604482015290519081900360640190fd5b600954821415612461576040805160e560020a62461bcd02815260206004820152601960248201527f43616e6e6f74207769746864726177206d61696e206e6f646500000000000000604482015290519081900360640190fd5b6002546040805160e060020a6302571be30281526004810185905290513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b1580156124b157600080fd5b505af11580156124c5573d6000803e3d6000fd5b505050506040513d60208110156124db57600080fd5b5051600160a060020a03161461253b576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f662074686973206e6f646500000000000000000000604482015290519081900360640190fd5b6002546040805160e060020a635b0fc9c302815260048101859052600160a060020a03848116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b15801561259357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b600054600160a060020a031633146125be57600080fd5b6000600b5460ff1660028111156125d157fe5b14612626576040805160e560020a62461bcd02815260206004820152601e60248201527f5265676973747279207374617465206973206e6f7420496e6163746976650000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d60208110156126a357600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152601e60248201527f526567697374727920646f6573206e6f74206f776e2072656769737472790000604482015290519081900360640190fd5b60006127123386868686613bbe565b95945050505050565b600560205260009081526040902080546001820154600290920154909190600160a060020a031683565b600b5460ff1681565b612756614633565b6002600b5460ff16600281111561276957fe5b146127be576040805160e560020a62461bcd02815260206004820152601460248201527f57726f6e6720636f6e7472616374207374617465000000000000000000000000604482015290519081900360640190fd5b600083815260056020526040902060020154600160a060020a0316331461282f576040805160e560020a62461bcd02815260206004820152601f60248201527f43616c6c61626c65206f6e6c79206279206163636f756e74206f776e65722e00604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a038086169316916302571be39160248083019260209291908290030181600087803b15801561288457600080fd5b505af1158015612898573d6000803e3d6000fd5b505050506040513d60208110156128ae57600080fd5b5051600160a060020a03161461290e576040805160e560020a62461bcd02815260206004820152600c60248201527f57726f6e67207570646174650000000000000000000000000000000000000000604482015290519081900360640190fd5b5060008281526005602081815260408084208151606081018352815481526001808301805483870152600284018054600160a060020a03808216868901528c8b529888529489905590889055600160a060020a03199093169092559054815183517f095ea7b3000000000000000000000000000000000000000000000000000000008152888716600482015260248101919091529251919594169363095ea7b393604480850194919392918390030190829087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b505050506040513d60208110156129f957600080fd5b50508051602082015160408084015181517f80cd00150000000000000000000000000000000000000000000000000000000081526004810188905260248101949094526044840192909252600160a060020a03918216606484015251908416916380cd001591608480830192600092919082900301818387803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b50505050505050565b600454600160a060020a031681565b60095481565b80600080821515612b0c576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f7468696e6720746f20657261736500000000000000000000000000000000604482015290519081900360640190fd5b84846000198501818110612b1c57fe5b6009546040805160208181019390935292820294909401358285018190528451808403860181526060909301948590528251909650919392508291908401908083835b60208310612b7e5780518252601f199092019160209182019101612b5f565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190975060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015612bf957600080fd5b505af1158015612c0d573d6000803e3d6000fd5b505050506040513d6020811015612c2357600080fd5b5051600160a060020a031614612ca9576040805160e560020a62461bcd02815260206004820152602760248201527f466972737420736c6173682f72656c6561736520746f70206c6576656c20737560448201527f62646f6d61696e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6002546009546040805160e060020a6306ab592302815260048101929092526024820185905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506001831115612d6657612d6660028403868680806020026020016040519081016040528093929190818152602001838360200280828437508894506144109350505050565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050505050505050565b600054600160a060020a03163314612e5e57600080fd5b600160a060020a038116301415612ebf576040805160e560020a62461bcd02815260206004820152601460248201527f43616e6e6f74206d6f766520746f2073656c662e000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015612f1257600080fd5b505af1158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051600160a060020a031614612f9c576040805160e560020a62461bcd02815260206004820152601b60248201527f5265676973747279206e6f74206f776e656420616e796d6f72652e0000000000604482015290519081900360640190fd5b612fa660026143aa565b6002546009546040805160e060020a635b0fc9c30281526004810192909252600160a060020a0384811660248401529051921691635b0fc9c39160448082019260009290919082900301818387803b15801561300157600080fd5b505af1158015613015573d6000803e3d6000fd5b5050505080600160a060020a03166398f038ff600a546040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561306457600080fd5b505af1158015613078573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fce0afb4c27dbd57a3646e2d639557521bfb05a42dc0ec50f9c1fe13d92e3e6d69350908190036020019150a150565b60009081526005602052604090205490565b600054600160a060020a031681565b600454600090600160a060020a03163314613142576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b600082815260056020526040902060010154156131a9576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206d6967726174656400000000000000000000000000000000604482015290519081900360640190fd5b60095460408051602080820193909352808201859052815180820383018152606090910191829052805190928291908401908083835b602083106131fe5780518252601f1990920191602091820191016131df565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812060025460095460e060020a6306ab59230284526004840152602483018990523060448401529351909650600160a060020a0390931694506306ab59239350606480820193600093509182900301818387803b15801561328757600080fd5b505af115801561329b573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018690526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156132f357600080fd5b505af1158015613307573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561259357600080fd5b600154600160a060020a031681565b600080600080600080600061338161465e565b896040518082805190602001908083835b602083106133b15780518252601f199092019160209182019101613392565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600954838301528285018190528451808403860181526060909301948590528251909e509195509293508392850191508083835b6020831061342b5780518252601f19909201916020918201910161340c565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008f8152600583528581206001015460025460e060020a6302571be3028652600486018490529651929f50909d509b50600160a060020a0390941695506302571be39450602480830194919350909182900301818c87803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d60208110156134e157600080fd5b505193508415156135f757600160a060020a03841615158061359c5750600254604080517f0178b8bf000000000000000000000000000000000000000000000000000000008152600481018a90529051600092600160a060020a031691630178b8bf91602480830192602092919082900301818787803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b5051600160a060020a031614155b15156135f2576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7468696e6720746f20736c6173682e000000000000000000000000000000604482015290519081900360640190fd5b613630565b4285141561360157fe5b6000888152600560205260408120805482825560018201929092556002018054600160a060020a031916905595505b6002546009546040805160e060020a6306ab59230281526004810192909252602482018b905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561369057600080fd5b505af11580156136a4573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018c90526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018c90526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050506000861115613a1a57600c805487900390556040805160208082018a905281830188905260608083018d905283518084039091018152608090920192839052815160026003909a04998a0299965091929182918401908083835b602083106137f95780518252601f1990920191602091820191016137da565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000818152600683528590208386019095528454600160a060020a0316808452600190950154918301919091529650945050151591506138ac9050576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742072657365727665642e00000000000000000000000000000000000000604482015290519081900360640190fd5b60208101514311613907576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f742072657665616c20696e2073616d6520626c6f636b0000000000604482015290519081900360640190fd5b60008281526006602090815260408083208054600160a060020a0319168155600190810184905554845182517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039182166004820152602481018c9052925191169363a9059cbb93604480850194919392918390030190829087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d60208110156139c257600080fd5b50511515613a1a576040805160e560020a62461bcd02815260206004820152601260248201527f4572726f7220696e207472616e736665722e0000000000000000000000000000604482015290519081900360640190fd5b604080516000815290518891600080516020614676833981519152919081900360200190a250505050505050505050565b60008181805b8651821015613b8d578682815181101515613a6857fe5b60209081029091010151905080831015613b0157604080516020808201869052818301849052825180830384018152606090920192839052815191929182918401908083835b60208310613acd5780518252601f199092019160209182019101613aae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209250613b82565b604080516020808201849052818301869052825180830384018152606090920192839052815191929182918401908083835b60208310613b525780518252601f199092019160209182019101613b33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092505b600190910190613a51565b5050929092149392505050565b60208101516024820151604483015160648401516084909401519294919390929091565b600080806001600b5460ff166002811115613bd557fe5b14613c2a576040805160e560020a62461bcd02815260206004820152601460248201527f5265676973747279206e6f74206163746976652e000000000000000000000000604482015290519081900360640190fd5b600954604080516020808201939093528082018a9052815180820383018152606090910191829052805190928291908401908083835b60208310613c7f5780518252601f199092019160209182019101613c60565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190995060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506040513d6020811015613d2457600080fd5b5051600160a060020a031614613d84576040805160e560020a62461bcd02815260206004820152601760248201527f454e53206e6f646520616c7265616479206f776e65642e000000000000000000604482015290519081900360640190fd5b60008781526005602052604090206001015415613deb576040805160e560020a62461bcd02815260206004820152601c60248201527f557365726e616d6520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b60408051606081018252600a80548252426020808401918252600160a060020a038d811685870190815260008e815260059093529582209451855591516001850155935160029093018054600160a060020a031916939091169290921790915554111561404d57600a54600154604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b50511015613f45576040805160e560020a62461bcd02815260206004820152601360248201527f556e616c6c6f77656420746f207370656e642e00000000000000000000000000604482015290519081900360640190fd5b600154600a54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301526044820193909352905191909216916323b872dd9160648083019260209291908290030181600087803b158015613fbe57600080fd5b505af1158015613fd2573d6000803e3d6000fd5b505050506040513d6020811015613fe857600080fd5b50511515614040576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b600a54600c805490910190555b8415158061405a57508315155b915050600160a060020a038516151581806140725750805b156142f7576002546009546040805160e060020a6306ab59230281526004810192909252602482018a905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b1580156140d757600080fd5b505af11580156140eb573d6000803e3d6000fd5b50506002546003546040805160e160020a630c4b7b8502815260048101899052600160a060020a0392831660248201529051919092169350631896f70a9250604480830192600092919082900301818387803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b5050505080156141ef57600354604080517fd5fa2b0000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a0389811660248301529151919092169163d5fa2b0091604480830192600092919082900301818387803b1580156141d657600080fd5b505af11580156141ea573d6000803e3d6000fd5b505050505b811561428257600354604080517f29cd62ea0000000000000000000000000000000000000000000000000000000081526004810186905260248101889052604481018790529051600160a060020a03909216916329cd62ea9160648082019260009290919082900301818387803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b6002546040805160e060020a635b0fc9c302815260048101869052600160a060020a038b8116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b1580156142da57600080fd5b505af11580156142ee573d6000803e3d6000fd5b50505050614372565b6002546009546040805160e060020a6306ab59230281526004810192909252602482018a9052600160a060020a038b8116604484015290519216916306ab59239160648082019260009290919082900301818387803b15801561435957600080fd5b505af115801561436d573d6000803e3d6000fd5b505050505b60408051600160a060020a038a16815290518491600080516020614676833981519152919081900360200190a2505095945050505050565b600b805482919060ff191660018360028111156143c357fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156143fa57fe5b60ff16815260200191505060405180910390a150565b6002548251600091600160a060020a0316906306ab592390849086908890811061443657fe5b602090810290910101516040805160e060020a63ffffffff86160281526004810193909352602483019190915230604483015251606480830192600092919082900301818387803b15801561448a57600080fd5b505af115801561449e573d6000803e3d6000fd5b505050508183858151811015156144b157fe5b6020908102909101810151604080518084019490945283810191909152805180840382018152606090930190819052825190918291908401908083835b6020831061450d5780518252601f1990920191602091820191016144ee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600084111561455357614553600185038483614410565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561461557600080fd5b505af1158015614629573d6000803e3d6000fd5b5050505050505050565b60606040519081016040528060008152602001600081526020016000600160a060020a031681525090565b6040805180820190915260008082526020820152905600d2da4206c3fa95b8fc1ee48627023d322b59cc7218e14cb95cf0c0fe562f2e4da165627a7a723058209db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b0029

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

000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc45f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff0000000000000000000000000000000000000000000000000000000000000003b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _token (address): 0x744d70FDBE2Ba4CF95131626614a1763DF805B9E
Arg [1] : _ensRegistry (address): 0x314159265dD8dbb310642f98f50C066173C1259b
Arg [2] : _resolver (address): 0x5FfC014343cd971B7eb70732021E26C35B744cc4
Arg [3] : _ensNode (bytes32): 0x5f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff
Arg [4] : _usernameMinLength (uint256): 3
Arg [5] : _reservedUsernamesMerkleRoot (bytes32): 0xb46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e
Arg [6] : _parentRegistry (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e
Arg [1] : 000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b
Arg [2] : 0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc4
Arg [3] : 5f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://9db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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