ETH Price: $2,273.94 (-3.80%)

Signata Right (SIGNATARIGHT)
 

Overview

TokenID

19

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SignataRight

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-14
*/

// File: contracts/types/extensions/Address.sol



pragma solidity ^0.8.10;

library Address {

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        
        assembly { 
            size := extcodesize(account)
        }
        
        return size > 0;
    }
}
// File: contracts/SignataIdentity.sol



pragma solidity ^0.8.11;

contract SignataIdentity {
    uint256 public constant MAX_UINT256 = type(uint256).max;
    
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)")
    bytes32 public constant EIP712DOMAINTYPE_DIGEST = 0xd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472;
    
    // keccak256("Signata")
    bytes32 public constant NAME_DIGEST = 0xfc8e166e81add347414f67a8064c94523802ae76625708af4cddc107b656844f;
    
    // keccak256("1")
    bytes32 public constant VERSION_DIGEST = 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;
    
    bytes32 public constant SALT = 0x233cdb81615d25013bb0519fbe69c16ddc77f9fa6a9395bd2aecfdfc1c0896e3;
    
    // keccak256("create(uint8 identityV, bytes32 identityR, bytes32 identityS, address delegateAddress, address securityKey)")
    bytes32 public constant TXTYPE_CREATE_DIGEST = 0x087280f638c5afab2bc9df90375624dfabc18c6dcec33665afdc2db6ad4048b1;
    
    // keccak256("destroy(address identity, uint8 delegateV, bytes32 delegateR, bytes32 delegateS, uint8 securityV, bytes32 securityR, bytes32 securityS)");
    bytes32 public constant TXTYPE_DESTROY_DIGEST = 0x9b364f015edab2a56fcadebbd609a6626a0612d05dd5d0b2203e1b1317d70ef7;
    
    // keccak256("lock(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS)")
    bytes32 public constant TXTYPE_LOCK_DIGEST = 0x703ed461c8d1c12e6e8b4708e8034e12d743b6221f0dbc5d301224713022c204;

    // keccak256("unlock(address identity, uint8 securityV, bytes32 securityR, bytes32 securityS)")
    bytes32 public constant TXTYPE_UNLOCK_DIGEST = 0x8364584c57b345e5810179c75cd470a8b1bd71cc8ee2c05074a1ffe55b48b865;

    // keccak256("rollover(address identity, uint8 delegateV, bytes32 delegateR, bytes32 delegateS, uint8 securityV, bytes32 securityR, bytes32 securityS, address newDelegateAddress, address newSecurityAddress)")
    bytes32 public constant TXTYPE_ROLLOVER_DIGEST = 0x7c62ea77dc835faa5b9bff6fd0f00c7b793acdd94960f48e7c9f47e28462085f;
    
    bytes32 public immutable _domainSeparator;
    
    // storage
    mapping(address => address) public _delegateKeyToIdentity;
    mapping(address => uint256) public _identityLockCount;
    mapping(address => uint256) public _identityRolloverCount;
    mapping(address => address) public _identityToSecurityKey;
    mapping(address => address) public _identityToDelegateKey;
    mapping(address => bool) public _identityDestroyed;
    mapping(address => bool) public _identityExists;
    mapping(address => bool) public _identityLocked;
    
    constructor(uint256 chainId) {
        _domainSeparator = keccak256(
            abi.encode(
                EIP712DOMAINTYPE_DIGEST,
                NAME_DIGEST,
                VERSION_DIGEST,
                chainId,
                this,
                SALT
            )
        );
    }
    
    event Create(address indexed identity, address indexed delegateKey, address indexed securityKey);
    event Destroy(address indexed identity);
    event Lock(address indexed identity);
    event Rollover(address indexed identity, address indexed delegateKey, address indexed securityKey);
    event Unlock(address indexed identity);
    
    function create(
        uint8 identityV, 
        bytes32 identityR, 
        bytes32 identityS,
        address identityAddress,
        address delegateAddress, 
        address securityAddress
    )
        external
    {
        require(
            _delegateKeyToIdentity[delegateAddress] == address(0),
            "SignataIdentity: Delegate key must not already be in use."
        );
        
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                _domainSeparator,
                keccak256(
                    abi.encode(
                        TXTYPE_CREATE_DIGEST,
                        delegateAddress,
                        securityAddress
                    )
                )
            )
        );
        
        address identity = ecrecover(digest, identityV, identityR, identityS);

        require(identity == identityAddress, "SignataIdentity: Invalid signature for identity");
        
        require(
            identity != delegateAddress && identity != securityAddress && delegateAddress != securityAddress,
            "SignataIdentity: Keys must be unique."
        );
        
        require(
            !_identityExists[identity],
            "SignataIdentity: The identity must not already exist."
        );
        
        _delegateKeyToIdentity[delegateAddress] = identity;
        _identityToDelegateKey[identity] = delegateAddress;
        _identityExists[identity] = true;
        _identityToSecurityKey[identity] = securityAddress;
        
        emit Create(identity, delegateAddress, securityAddress);
    }

    function destroy(
        address identity,
        uint8 delegateV,
        bytes32 delegateR, 
        bytes32 delegateS,
        uint8 securityV,
        bytes32 securityR, 
        bytes32 securityS
    )
        external
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has already been destroyed."
        );
        
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                _domainSeparator,
                keccak256(
                    abi.encode(
                        TXTYPE_DESTROY_DIGEST
                    )
                )
            )
        );
        
        address delegateAddress = ecrecover(digest, delegateV, delegateR, delegateS);
        
        require(
            _identityToDelegateKey[identity] == delegateAddress,
            "SignataIdentity: Invalid delegate key signature provided."
        );
        
        address securityAddress = ecrecover(digest, securityV, securityR, securityS);
        
        require(
            _identityToSecurityKey[identity] == securityAddress,
            "SignataIdentity: Invalid security key signature provided."
        );
        
        _identityDestroyed[identity] = true;
        
        delete _delegateKeyToIdentity[delegateAddress];
        delete _identityLockCount[identity];
        delete _identityRolloverCount[identity];
        delete _identityToSecurityKey[identity];
        delete _identityToDelegateKey[identity];
        delete _identityLocked[identity];
        
        emit Destroy(identity);
    }

    function lock(
        address identity,
        uint8 sigV,
        bytes32 sigR,
        bytes32 sigS
    )
        external
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        require(
            !_identityLocked[identity],
            "SignataIdentity: The identity has already been locked."
        );
                
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                _domainSeparator,
                keccak256(
                    abi.encode(
                        TXTYPE_LOCK_DIGEST,
                        _identityLockCount[identity]
                    )
                )
            )
        );
        
        address recoveredAddress = ecrecover(digest, sigV, sigR, sigS);
        
        require(
            _identityToDelegateKey[identity] == recoveredAddress || _identityToSecurityKey[identity] == recoveredAddress,
            "SignataIdentity: Invalid key signature provided."
        );

        _identityLocked[identity] = true;
        _identityLockCount[identity] += 1;
        
        emit Lock(identity);
    }

    function unlock(
        address identity,
        uint8 securityV,
        bytes32 securityR,
        bytes32 securityS
    ) 
        external 
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        require(
            _identityLocked[identity],
            "SignataIdentity: The identity is already unlocked."
        );
        
        require(
            _identityLockCount[identity] != MAX_UINT256,
            "SignataIdentity: The identity is permanently locked."
        );
        
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                _domainSeparator,
                keccak256(
                    abi.encode(
                        TXTYPE_UNLOCK_DIGEST,
                        _identityLockCount[identity]
                    )
                )
            )
        );
        
        address securityAddress = ecrecover(digest, securityV, securityR, securityS);
        
        require(
            _identityToSecurityKey[identity] == securityAddress,
            "SignataIdentity: Invalid security key signature provided."
        );
        
        _identityLocked[identity] = false;
        
        emit Unlock(identity);
    }
    
    function rollover(
        address identity,
        uint8 delegateV,
        bytes32 delegateR,
        bytes32 delegateS,
        uint8 securityV,
        bytes32 securityR,
        bytes32 securityS,
        address newDelegateAddress,
        address newSecurityAddress
    ) 
        external 
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        require(
            identity != newDelegateAddress && identity != newSecurityAddress && newDelegateAddress != newSecurityAddress,
            "SignataIdentity: The keys must be unique."
        );
        
        require(
            _delegateKeyToIdentity[newDelegateAddress] == address(0),
            "SignataIdentity: The new delegate key must not already be in use."
        );
        
        require(
            _identityRolloverCount[identity] != MAX_UINT256,
            "SignataIdentity: The identity has already reached the maximum number of rollovers allowed."
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                _domainSeparator,
                keccak256(
                    abi.encode(
                        TXTYPE_ROLLOVER_DIGEST,
                        newDelegateAddress,
                        newSecurityAddress,
                        _identityRolloverCount[identity]
                    )
                )
            )
        );
        
        address delegateAddress = ecrecover(digest, delegateV, delegateR, delegateS);
        
        require(
            _identityToDelegateKey[identity] == delegateAddress,
            "SignataIdentity: Invalid delegate key signature provided."
        );
        
        address securityAddress = ecrecover(digest, securityV, securityR, securityS);
        
        require(
            _identityToSecurityKey[identity] == securityAddress,
            "SignataIdentity: Invalid delegate key signature provided."
        );
        
        delete _delegateKeyToIdentity[delegateAddress];
        
        _delegateKeyToIdentity[newDelegateAddress] = identity;
        _identityToDelegateKey[identity] = newDelegateAddress;
        _identityToSecurityKey[identity] = newSecurityAddress;
        _identityRolloverCount[identity] += 1;
        
        emit Rollover(identity, newDelegateAddress, newSecurityAddress);
    }
    
    function getDelegate(address identity)
        external
        view
        returns (address)
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        return _identityToDelegateKey[identity];
    }
    
    function getIdentity(address delegateKey) 
        external
        view 
        returns (address) 
    {
        address identity = _delegateKeyToIdentity[delegateKey];
        
        require(
            identity != address(0),
            "SignataIdentity: The delegate key provided is not linked to an existing identity."
        );
        
        return identity;
    }

    function getLockCount(address identity)
        external
        view
        returns (uint256) 
    {
         require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        return _identityLockCount[identity];
    }    
    
    function getRolloverCount(address identity)
        external
        view
        returns (uint256) 
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        return _identityRolloverCount[identity];
    }
    
    function isLocked(address identity)
        external
        view
        returns (bool) 
    {
        require(
            _identityExists[identity],
            "SignataIdentity: The identity must exist."
        );
        
        require(
            !_identityDestroyed[identity],
            "SignataIdentity: The identity has been destroyed."
        );
        
        return _identityLocked[identity];
    }
}
// File: contracts/tokens/IERC721Receiver.sol



pragma solidity ^0.8.10;

interface IERC721Receiver {

    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File: contracts/tokens/IERC165.sol



pragma solidity ^0.8.10;

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: contracts/tokens/IERC721.sol



pragma solidity ^0.8.10;


interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
// File: contracts/tokens/IERC721Metadata.sol



pragma solidity ^0.8.10;


interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/tokens/IERC721Enumerable.sol



pragma solidity ^0.8.10;


interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: contracts/tokens/IERC721Schema.sol



pragma solidity ^0.8.10;



interface IERC721Schema is IERC721Enumerable, IERC721Metadata {
    
    function schemaOf(uint256 tokenId) external view returns (uint256 schemaId);

    function minterOf(uint256 schemaId) external view returns (address owner);
    
    function holdsTokenOfSchema(address holder, uint256 schemaId) external view returns (bool hasRight);
    
    function totalSchemas() external view returns (uint256 total);
    
    function totalMintedFor(uint256 schemaId) external view returns (uint256 total);

    function tokenOfSchemaByIndex(uint256 schema, uint256 index) external view returns (uint256 tokenId);
}
// File: contracts/SignataRight.sol


pragma solidity ^0.8.11;









contract SignataRight is IERC721Schema {
    using Address for address;
    
    event MintSchema(uint256 indexed schemaId, uint256 indexed mintingRightId, bytes32 indexed uriHash);
    
    event MintRight(uint256 indexed schemaId, uint256 indexed rightId, bool indexed unbound);
    
    event Revoke(uint256 indexed rightId);
    
    uint256 private constant MAX_UINT256 = type(uint256).max;
    
    bytes4 private constant INTERFACE_ID_ERC165 = type(IERC165).interfaceId;
    bytes4 private constant INTERFACE_ID_ERC721 = type(IERC721).interfaceId;
    bytes4 private constant INTERFACE_ID_ERC721_ENUMERABLE = type(IERC721Enumerable).interfaceId;
    bytes4 private constant INTERFACE_ID_ERC721_METADATA = type(IERC721Metadata).interfaceId;
    bytes4 private constant INTERFACE_ID_ERC721_SCHEMA = type(IERC721Schema).interfaceId;

    string private _name;
    string private _symbol;
    SignataIdentity private _signataIdentity;
    
    // Schema Storage
    mapping(uint256 => uint256) private _schemaToRightBalance;
    mapping(uint256 => mapping(uint256 => uint256)) private _schemaToRights;
    mapping(uint256 => bool) _schemaRevocable;
    mapping(uint256 => bool) _schemaTransferable;
    mapping(uint256 => string) private _schemaToURI;
    mapping(bytes32 => uint256) private _uriHashToSchema;
    mapping(uint256 => uint256) private _schemaToMintingRight;
    mapping(address => mapping(uint256 => uint256)) _ownerToSchemaBalance;
    uint256 private _schemasTotal;
    
    // Rights Storage
    mapping(uint256 => address) private _rightToOwner;
    mapping(address => uint256) private _ownerToRightBalance;
    mapping(uint256 => address) private _rightToApprovedAddress;
    mapping(uint256 => bool) private _rightToRevocationStatus;
    mapping(uint256 => uint256) private _rightToSchema;
    mapping(address => mapping (address => bool)) private _ownerToOperatorStatuses;
    mapping(address => mapping(uint256 => uint256)) private _ownerToRights;
    mapping(uint256 => uint256) _rightToOwnerRightsIndex;
    uint256 private _rightsTotal;
    
    constructor(
        string memory name_, 
        string memory symbol_,
        address signataIdentity_,
        string memory mintingSchemaURI_
    ) {
        address thisContract = address(this);
        bytes32 uriHash = keccak256(bytes(mintingSchemaURI_));

        _name = name_;
        _symbol = symbol_;

        _signataIdentity = SignataIdentity(signataIdentity_);

        _schemaToRightBalance[1] = 1;
        _schemaToRights[1][0] = 1;
        _schemaRevocable[1] = false;
        _schemaTransferable[1] = true;
        _schemaToURI[1] = mintingSchemaURI_;
        _uriHashToSchema[uriHash] = 1;
        _schemaToMintingRight[1] = 1;
        _ownerToSchemaBalance[thisContract][1] = 1;
        _schemasTotal = 1;

        _rightToOwner[1] = thisContract;
        _ownerToRightBalance[thisContract] = 1;
        _rightToSchema[1] = 1;
        _ownerToRights[thisContract][0] = 1;
        _rightToOwnerRightsIndex[1] = 0;
        _rightsTotal = 1;
        
        emit MintSchema(1, 1, uriHash);
        
        emit MintRight(1, 1, false);
        
        emit Transfer(address(0), thisContract, 1);
    }

    function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
        return interfaceId == INTERFACE_ID_ERC165
            || interfaceId == INTERFACE_ID_ERC721
            || interfaceId == INTERFACE_ID_ERC721_ENUMERABLE
            || interfaceId == INTERFACE_ID_ERC721_METADATA
            || interfaceId == INTERFACE_ID_ERC721_SCHEMA;
    }
    
    function mintSchema(
        address minter,
        bool schemaTransferable, 
        bool schemaRevocable, 
        string calldata schemaURI
    ) external returns (uint256) {
        require(
            _schemasTotal != MAX_UINT256,
            "SignataRight: Maximum amount of schemas already minted."
        );
        
        require(
            _rightsTotal != MAX_UINT256,
            "SignataRight: Maximum amount of rights already minted."
        );
        
        bytes32 uriHash = keccak256(bytes(schemaURI));
        
        require(
            _uriHashToSchema[uriHash] == 0,
            "SignataRight: The URI provided for the schema is not unique."
        );
        
        address recipient;
        
        if (minter.isContract()) {
            recipient = minter;
        } else {
            recipient = _signataIdentity.getIdentity(minter);
            
            require(
                !_signataIdentity.isLocked(recipient),
                "SignataRight: The sender's account is locked."
            );
        }
        
        _rightsTotal += 1;
        _rightToOwner[_rightsTotal] = recipient;
        _rightToSchema[_rightsTotal] = 1;
        
        uint256 schemaToRightsLength = _schemaToRightBalance[1];

        _schemaToRights[1][schemaToRightsLength] = _rightsTotal;
        _schemaToRightBalance[1] += 1;
        _ownerToSchemaBalance[recipient][1] += 1;

        uint256 ownerToRightsLength = _ownerToRightBalance[recipient];
        
        _ownerToRights[recipient][ownerToRightsLength] = _rightsTotal;
        _rightToOwnerRightsIndex[_rightsTotal] = ownerToRightsLength;
        _ownerToRightBalance[recipient] += 1;
        
        _schemasTotal += 1;
        _schemaToMintingRight[_schemasTotal] = _rightsTotal;
        _schemaToURI[_schemasTotal] = schemaURI;
        _uriHashToSchema[uriHash] = _schemasTotal;
        _schemaTransferable[_schemasTotal] = schemaTransferable;
        _schemaRevocable[_schemasTotal] = schemaRevocable;
        
        require(
            _isSafeToTransfer(address(0), recipient, _rightsTotal, ""),
            "SignataRight: must only transfer to ERC721Receiver implementers when recipient is a smart contract."
        );
        
        emit MintRight(1, _rightsTotal, false);
        
        emit Transfer(address(0), minter, _rightsTotal);
        
        emit MintSchema(_schemasTotal, _rightsTotal, uriHash);
        
        return _schemasTotal;
    }
    
    function mintRight(uint256 schemaId, address to, bool unbound) external {
        require(
            _rightsTotal != MAX_UINT256,
            "SignataRight: Maximum amount of tokens already minted."
        );
        
        require(
            _schemaToMintingRight[schemaId] != 0,
            "SignataRight: Schema ID must correspond to an existing schema."
        );

        address minter;
        
        if (msg.sender.isContract()) {
            minter = msg.sender;
        } else {
            minter = _signataIdentity.getIdentity(msg.sender);
            
            require(
                !_signataIdentity.isLocked(minter),
                "SignataRight: The sender's account is locked."
            );
        }
        
        require(
            minter == _rightToOwner[_schemaToMintingRight[schemaId]],
            "SignataRight: The sender is not the minter for the schema specified."
        );
        
        address recipient;
        
        if (to.isContract()) {
            recipient = to;
        } else if (unbound == true) {
            recipient = to;
        } else {
            recipient = _signataIdentity.getIdentity(to);
        }
        
        _rightsTotal += 1;
        _rightToOwner[_rightsTotal] = recipient;
        _rightToSchema[_rightsTotal] = schemaId;
        
        uint256 schemaToRightsLength = _schemaToRightBalance[schemaId];

        _schemaToRights[schemaId][schemaToRightsLength] = _rightsTotal;
        _schemaToRightBalance[schemaId] += 1;
        _ownerToSchemaBalance[recipient][schemaId] += 1;

        uint256 ownerToRightsLength = _ownerToRightBalance[recipient];
        
        _ownerToRights[recipient][ownerToRightsLength] = _rightsTotal;
        _rightToOwnerRightsIndex[_rightsTotal] = ownerToRightsLength;
        _ownerToRightBalance[recipient] += 1;
        
        require(
            _isSafeToTransfer(address(0), recipient, _rightsTotal, ""),
            "SignataRight: must only transfer to ERC721Receiver implementers when recipient is a smart contract."
        );
        
        emit MintRight(schemaId, _rightsTotal, unbound);
        
        emit Transfer(address(0), to, _rightsTotal);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner.isContract()) {
            return _ownerToRightBalance[owner];
        }
        
        return _ownerToRightBalance[_signataIdentity.getIdentity(owner)];
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        address owner = _rightToOwner[tokenId];
        
        require(
            owner != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );
        
        if (owner.isContract()) {
            return owner;
        }
        
        return _signataIdentity.getDelegate(owner);
    }

    function name() public view override returns (string memory) {
        return _name;
    }

    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) external view override returns (string memory) {
        require(
            _rightToOwner[tokenId] != address(0), 
            "SignataRight: Token ID must correspond to an existing right."
        );

        return _schemaToURI[_rightToSchema[tokenId]];
    }

    function approve(address to, uint256 tokenId) external override {
        address owner = _rightToOwner[tokenId];
        
        require(
            owner != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );
        
        require(
            to != owner, 
            "SignataRight: Approval is not required for the owner of the right."
        );
        
        address controller;
        
        if (owner.isContract()) {
            controller = owner;
        } else {
            controller = _signataIdentity.getDelegate(owner);
            
            require(
                to != controller, 
                "SignataRight: Approval is not required for the owner of the right."
            );
            
            require(
                !_signataIdentity.isLocked(owner),
                "SignataRight: The owner's account is locked."
            );
        }
            
        require(
            msg.sender == controller || isApprovedForAll(owner, msg.sender),
            "SignataRight: The sender is not authorised to provide approvals."
        );
        
        _rightToApprovedAddress[tokenId] = to;
    
        emit Approval(controller, to, tokenId);
    }
    
    function revoke(uint256 tokenId) external {
        require(
            _rightToOwner[tokenId] != address(0),
            "SignataRight: Right ID must correspond to an existing right."
        );
        
        uint256 schemaId = _rightToSchema[tokenId];
        
        require(
            _schemaRevocable[schemaId],
            "SignataRight: The right specified is not revocable."
        );
        
        address minter = _rightToOwner[_schemaToMintingRight[schemaId]];
        
        address controller;
        
        if (minter.isContract()) {
            controller = minter;
        } else {
            controller = _signataIdentity.getDelegate(minter);
            
            require(
                !_signataIdentity.isLocked(minter),
                "SignataRight: The minter's account is locked."
            );
        }
            
        require(
            msg.sender == controller,
            "SignataRight: The sender is not authorised to revoke the right."
        );
        
        _rightToRevocationStatus[tokenId] = true;

        _ownerToSchemaBalance[_rightToOwner[tokenId]][schemaId] -= 1;
    
        emit Revoke(tokenId);        
    }
    
    function isRevoked(uint256 tokenId) external view returns (bool) {
        require(
            _rightToOwner[tokenId] != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );
        
        return _rightToRevocationStatus[tokenId];
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(
            _rightToOwner[tokenId] != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );

        return _rightToApprovedAddress[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        address owner;
        
        require(
            operator != msg.sender, 
            "SignataRight: Self-approval is not required."
        );
        
        if (msg.sender.isContract()) {
            owner = msg.sender;
        } else {
            owner = _signataIdentity.getIdentity(msg.sender);
            
            require(
                operator != owner, 
                "SignataRight: Self-approval is not required."
            );
            
            require(
                !_signataIdentity.isLocked(owner),
                "SignataRight: The owner's account is locked."
            );
        }

        _ownerToOperatorStatuses[owner][operator] = approved;
        
        emit ApprovalForAll(owner, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        address owner_ = (owner.isContract())
            ? owner
            :_signataIdentity.getIdentity(msg.sender);
            
        return _ownerToOperatorStatuses[owner_][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public override {
        require(
            _rightToOwner[tokenId] != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );
        
        uint256 schemaId = _rightToSchema[tokenId];
        
        require(
            _schemaTransferable[schemaId],
            "SignataRight: This right is non-transferable."
        );
        
        require(
            !_rightToRevocationStatus[tokenId],
            "SignataRight: This right has been revoked."
        );
        
        require(
            to != address(0), 
            "SignataRight: Transfers to the zero address are not allowed."
        );
        
        address owner;
        
        if (from.isContract()) {
            owner = from;
        } else {
            owner = _signataIdentity.getIdentity(from);
            
            require(
                !_signataIdentity.isLocked(owner),
                "SignataRight: The owner's account is locked."
            );
        }
        
        require(
            _rightToOwner[tokenId] == owner,
            "SignataRight: The account specified does not hold the right corresponding to the Token ID provided."
        );
        

        require(
            msg.sender == owner || msg.sender == _rightToApprovedAddress[tokenId] || _ownerToOperatorStatuses[owner][msg.sender],
            "SignataRight: The sender is not authorised to transfer this right."
        );
        
        address recipient;

        if (to.isContract()) {
            recipient = to;
        } else {
            recipient = _signataIdentity.getIdentity(to);
            
            require(
                !_signataIdentity.isLocked(recipient),
                "SignataRight: The recipient's account is locked."
            );
        }
        
        uint256 lastRightIndex = _ownerToRightBalance[owner] - 1;
        uint256 rightIndex = _rightToOwnerRightsIndex[tokenId];

        if (rightIndex != lastRightIndex) {
            uint256 lastTokenId = _ownerToRights[owner][lastRightIndex];

            _ownerToRights[owner][rightIndex] = lastTokenId;
            _rightToOwnerRightsIndex[lastTokenId] = rightIndex;
        }

        delete _ownerToRights[owner][lastRightIndex];
        delete _rightToOwnerRightsIndex[tokenId];
        
        _ownerToSchemaBalance[owner][schemaId] -= 1;
        
        uint256 length = _ownerToRightBalance[recipient];
        
        _ownerToRights[recipient][length] = tokenId;
        _rightToOwnerRightsIndex[tokenId] = length;
        
        _rightToApprovedAddress[tokenId] = address(0);
        
        emit Approval(from, address(0), tokenId);

        _ownerToRightBalance[owner] -= 1;
        _ownerToRightBalance[recipient] += 1;
        _rightToOwner[tokenId] = recipient;
        
        _ownerToSchemaBalance[recipient][schemaId] += 1;

        emit Transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) external override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
        transferFrom(from, to, tokenId);
        
        require(
            _isSafeToTransfer(from, to, tokenId, _data),
            "SignataRight: must only transfer to ERC721Receiver implementers when recipient is a smart contract."
        );
    }
    
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        address holder;
        
        if (owner.isContract()) {
            holder = owner;
        } else {
            holder = _signataIdentity.getIdentity(owner);
        }
        
        require(
            index < _ownerToRightBalance[holder], 
            "SignataRight: The index provided is out of bounds for the owner specified."
        );
        
        return _ownerToRights[holder][index];
    }

    function totalSupply() public view override returns (uint256) {
        return _rightsTotal;
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(
            index < _rightsTotal, 
            "SignataRight: The index provided is out of bounds."
        );
        
        return index + 1;
    }
    
    function schemaOf(uint256 tokenId) external view override returns (uint256) {
        require(
            _rightToOwner[tokenId] != address(0),
            "SignataRight: Token ID must correspond to an existing right."
        );

        return _rightToSchema[tokenId];    
    }

    function minterOf(uint256 schemaId) external view override returns (address) {
        uint256 mintingToken = _schemaToMintingRight[schemaId];
        
        require(
            mintingToken != 0,
            "SignataRight: Schema ID must correspond to an existing schema."
        );
        
        address owner = _rightToOwner[mintingToken];

        if (owner.isContract()) {
            return owner;
        }
        
        return _signataIdentity.getDelegate(owner);        
    }
    
    function holdsTokenOfSchema(address holder, uint256 schemaId) external view override returns (bool) {
        require(
            _schemaToMintingRight[schemaId] != 0,
            "SignataRight: Schema ID must correspond to an existing schema."
        );
        
        address owner;

        if (owner.isContract()) {
            owner = holder;
        } else {
            owner = _signataIdentity.getIdentity(holder);
        }
        
        return _ownerToSchemaBalance[owner][schemaId] > 0;
    }
    
    function totalSchemas() external view override returns (uint256) {
        return _schemasTotal;
    }
    
    function totalMintedFor(uint256 schemaId) external view override returns (uint256) {
        require(
            _schemaToMintingRight[schemaId] != 0,
            "SignataRight: Schema ID must correspond to an existing schema."
        );
        
        return _schemaToRightBalance[schemaId];
    }

    function tokenOfSchemaByIndex(uint256 schemaId, uint256 index) external view override returns (uint256) {
        require(
            _schemaToMintingRight[schemaId] != 0,
            "SignataRight: Schema ID must correspond to an existing schema."
        );
        
        require(
            index < _schemaToRightBalance[schemaId], 
            "SignataRight: The index provided is out of bounds for the owner specified."
        );
        
        return _schemaToRights[schemaId][index];       
    }
        
    function _isSafeToTransfer(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("SignataRight: must only transfer to ERC721Receiver implementers when recipient is a smart contract.");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"signataIdentity_","type":"address"},{"internalType":"string","name":"mintingSchemaURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"schemaId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"rightId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unbound","type":"bool"}],"name":"MintRight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"schemaId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"mintingRightId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"uriHash","type":"bytes32"}],"name":"MintSchema","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rightId","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"schemaId","type":"uint256"}],"name":"holdsTokenOfSchema","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isRevoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"schemaId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"unbound","type":"bool"}],"name":"mintRight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"schemaTransferable","type":"bool"},{"internalType":"bool","name":"schemaRevocable","type":"bool"},{"internalType":"string","name":"schemaURI","type":"string"}],"name":"mintSchema","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"schemaId","type":"uint256"}],"name":"minterOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"schemaOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"schemaId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfSchemaByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"schemaId","type":"uint256"}],"name":"totalMintedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSchemas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620036e9380380620036e98339810160408190526200003491620003b5565b80516020820120309060006200004b8782620004f7565b5060016200005a8682620004f7565b50600280546001600160a01b0319166001600160a01b03861617905560017fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8190557fa854ba23287a95c22b66b66e4f07bb2441b3fd4ecec9d0720a55aaffc00a6db481905560008190527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b805460ff199081169091557f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a318054909116909117905560076020527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8286200014e8482620004f7565b5060008181526008602090815260408083206001908190557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a368190556001600160a01b038616808552600a84528285208286528452828520829055600b8290557fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c80546001600160a01b031916821790558452600d83528184208190557f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b5f81905560128352818420848052835281842081905580845260139092527f4155c2f711f2cdd34f8262ab8fb9b7020a700fe7b6948222152f7670d1fdf34d839055601482905551839282917fd32db21119d6bb7b885911e2ee1bab864d0c59dbaa980004bcba4cd5edd864ce9190a460405160009060019081907ff2cac345b81a4b8f2cd1bba64a5ec23eb639ea55383727cd3111e88693c12156908490a46040516001906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050505050620005c3565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200031857600080fd5b81516001600160401b0380821115620003355762000335620002f0565b604051601f8301601f19908116603f01168101908282118183101715620003605762000360620002f0565b816040528381526020925086838588010111156200037d57600080fd5b600091505b83821015620003a1578582018301518183018401529082019062000382565b600093810190920192909252949350505050565b60008060008060808587031215620003cc57600080fd5b84516001600160401b0380821115620003e457600080fd5b620003f28883890162000306565b955060208701519150808211156200040957600080fd5b620004178883890162000306565b604088015190955091506001600160a01b03821682146200043757600080fd5b6060870151919350808211156200044d57600080fd5b506200045c8782880162000306565b91505092959194509250565b600181811c908216806200047d57607f821691505b6020821081036200049e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004f257600081815260208120601f850160051c81016020861015620004cd5750805b601f850160051c820191505b81811015620004ee57828155600101620004d9565b5050505b505050565b81516001600160401b03811115620005135762000513620002f0565b6200052b8162000524845462000468565b84620004a4565b602080601f8311600181146200056357600084156200054a5750858301515b600019600386901b1c1916600185901b178555620004ee565b600085815260208120601f198616915b82811015620005945788860151825594840194600190910190840162000573565b5085821015620005b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61311680620005d36000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806362f96998116100de5780639e942ace11610097578063b88d4fde11610071578063b88d4fde1461035e578063b8c7724a14610371578063c87b56dd14610379578063e985e9c51461038c57600080fd5b80639e942ace14610325578063a22cb46514610338578063b4b44b411461034b57600080fd5b806362f96998146102be5780636352211e146102d15780636b4c399a146102e457806370a08231146102f757806395d89b411461030a57806398b977901461031257600080fd5b806320c5429b1161014b57806342842e0e1161012557806342842e0e146102725780634f6ccce71461028557806352090170146102985780635ccc561e146102ab57600080fd5b806320c5429b1461023957806323b872dd1461024c5780632f745c591461025f57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb5780630ecd76331461021057806318160ddd14610231575b600080fd5b6101a66101a13660046127ec565b61039f565b60405190151581526020015b60405180910390f35b6101c3610427565b6040516101b2919061284f565b6101e36101de366004612862565b6104b9565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004612890565b610512565b005b61022361021e3660046128bc565b610798565b6040519081526020016101b2565b601454610223565b61020e610247366004612862565b610810565b61020e61025a3660046128de565b610b8c565b61022361026d366004612890565b611373565b61020e6102803660046128de565b611460565b610223610293366004612862565b611480565b61020e6102a636600461292d565b6114f9565b6101a66102b9366004612862565b6119ad565b6102236102cc366004612862565b6119f7565b6101e36102df366004612862565b611a37565b6102236102f2366004612862565b611af7565b61022361030536600461296f565b611b3e565b6101c3611bff565b6101a6610320366004612890565b611c0e565b6101e3610333366004612862565b611ce9565b61020e61034636600461298c565b611db3565b6102236103593660046129c5565b611f82565b61020e61036c366004612a83565b612500565b600b54610223565b6101c3610387366004612862565b612539565b6101a661039a366004612b63565b61261b565b60006001600160e01b031982166301ffc9a760e01b14806103d057506001600160e01b031982166380ac58cd60e01b145b806103eb57506001600160e01b0319821663780e9d6360e01b145b8061040657506001600160e01b03198216635b5e139f60e01b145b8061042157506001600160e01b0319821663b992092560e01b145b92915050565b60606000805461043690612b91565b80601f016020809104026020016040519081016040528092919081815260200182805461046290612b91565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000818152600c60205260408120546001600160a01b03166104f65760405162461bcd60e51b81526004016104ed90612bcb565b60405180910390fd5b506000908152600e60205260409020546001600160a01b031690565b6000818152600c60205260409020546001600160a01b0316806105475760405162461bcd60e51b81526004016104ed90612bcb565b806001600160a01b0316836001600160a01b0316036105785760405162461bcd60e51b81526004016104ed90612c28565b60006001600160a01b0382163b156105915750806106bd565b600254604051631513615960e21b81526001600160a01b0384811660048301529091169063544d856490602401602060405180830381865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190612c90565b9050806001600160a01b0316846001600160a01b0316036106325760405162461bcd60e51b81526004016104ed90612c28565b600254604051631293efbb60e21b81526001600160a01b03848116600483015290911690634a4fbeec90602401602060405180830381865afa15801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a09190612cad565b156106bd5760405162461bcd60e51b81526004016104ed90612cca565b336001600160a01b03821614806106d957506106d9823361261b565b61073b576040805162461bcd60e51b81526020600482015260248101919091526000805160206130c183398151915260448201527f617574686f726973656420746f2070726f7669646520617070726f76616c732e60648201526084016104ed565b6000838152600e602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60008281526009602052604081205481036107c55760405162461bcd60e51b81526004016104ed90612d16565b60008381526003602052604090205482106107f25760405162461bcd60e51b81526004016104ed90612d73565b50600091825260046020908152604080842092845291905290205490565b6000818152600c60205260409020546001600160a01b031661089a5760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a205269676874204944206d75737420636f727260448201527f6573706f6e6420746f20616e206578697374696e672072696768742e0000000060648201526084016104ed565b60008181526010602090815260408083205480845260059092529091205460ff166109235760405162461bcd60e51b815260206004820152603360248201527f5369676e61746152696768743a20546865207269676874207370656369666965604482015272321034b9903737ba103932bb37b1b0b136329760691b60648201526084016104ed565b6000818152600960209081526040808320548352600c9091528120546001600160a01b031690813b15610957575080610a98565b600254604051631513615960e21b81526001600160a01b0384811660048301529091169063544d856490602401602060405180830381865afa1580156109a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c59190612c90565b600254604051631293efbb60e21b81526001600160a01b038581166004830152929350911690634a4fbeec90602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190612cad565b15610a985760405162461bcd60e51b815260206004820152602d60248201527f5369676e61746152696768743a20546865206d696e7465722773206163636f7560448201526c373a1034b9903637b1b5b2b21760991b60648201526084016104ed565b336001600160a01b03821614610b045760405162461bcd60e51b815260206004820152603f60248201526000805160206130c183398151915260448201527f617574686f726973656420746f207265766f6b65207468652072696768742e0060648201526084016104ed565b6000848152600f60209081526040808320805460ff19166001908117909155600c8352818420546001600160a01b03168452600a83528184208785529092528220805491929091610b56908490612df9565b909155505060405184907fdb43aa42235c8d63908794a952603e8d43a549383d13123c3d893a3fc2e6249590600090a250505050565b6000818152600c60205260409020546001600160a01b0316610bc05760405162461bcd60e51b81526004016104ed90612bcb565b60008181526010602090815260408083205480845260069092529091205460ff16610c435760405162461bcd60e51b815260206004820152602d60248201527f5369676e61746152696768743a2054686973207269676874206973206e6f6e2d60448201526c3a3930b739b332b930b136329760991b60648201526084016104ed565b6000828152600f602052604090205460ff1615610cb55760405162461bcd60e51b815260206004820152602a60248201527f5369676e61746152696768743a2054686973207269676874206861732062656560448201526937103932bb37b5b2b21760b11b60648201526084016104ed565b6001600160a01b038316610d315760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a205472616e736665727320746f20746865207a60448201527f65726f206164647265737320617265206e6f7420616c6c6f7765642e0000000060648201526084016104ed565b60006001600160a01b0385163b15610d4a575083610e45565b600254604051632fea7b8160e01b81526001600160a01b03878116600483015290911690632fea7b8190602401602060405180830381865afa158015610d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db89190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e289190612cad565b15610e455760405162461bcd60e51b81526004016104ed90612cca565b6000838152600c60205260409020546001600160a01b03828116911614610f065760405162461bcd60e51b815260206004820152606360248201527f5369676e61746152696768743a20546865206163636f756e742073706563696660448201527f69656420646f6573206e6f7420686f6c642074686520726967687420636f727260648201527f6573706f6e64696e6720746f2074686520546f6b656e2049442070726f76696460848201526232b21760e91b60a482015260c4016104ed565b336001600160a01b0382161480610f3357506000838152600e60205260409020546001600160a01b031633145b80610f6157506001600160a01b038116600090815260116020908152604080832033845290915290205460ff165b610fcc5760405162461bcd60e51b815260206004820152604260248201526000805160206130c183398151915260448201527f617574686f726973656420746f207472616e73666572207468697320726967686064820152613a1760f11b608482015260a4016104ed565b60006001600160a01b0385163b15610fe5575083611129565b600254604051632fea7b8160e01b81526001600160a01b03878116600483015290911690632fea7b8190602401602060405180830381865afa15801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190612cad565b156111295760405162461bcd60e51b815260206004820152603060248201527f5369676e61746152696768743a2054686520726563697069656e74277320616360448201526f31b7bab73a1034b9903637b1b5b2b21760811b60648201526084016104ed565b6001600160a01b0382166000908152600d602052604081205461114e90600190612df9565b6000868152601360205260409020549091508082146111a1576001600160a01b03841660009081526012602090815260408083208584528252808320548484528184208190558352601390915290208190555b6001600160a01b0384166000818152601260209081526040808320868452825280832083905589835260138252808320839055928252600a815282822088835290529081208054600192906111f7908490612df9565b90915550506001600160a01b038084166000908152600d60209081526040808320546012835281842081855283528184208b90558a845260138352818420819055600e90925280832080546001600160a01b0319169055519092899291908c16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a46001600160a01b0385166000908152600d602052604081208054600192906112a6908490612df9565b90915550506001600160a01b0384166000908152600d602052604081208054600192906112d4908490612e0c565b90915550506000878152600c6020908152604080832080546001600160a01b0319166001600160a01b0389169081179091558352600a82528083208984529091528120805460019290611328908490612e0c565b909155505060405187906001600160a01b03808b1691908c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050505050565b6000806001600160a01b0384163b1561138d5750826113fe565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa1580156113d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fb9190612c90565b90505b6001600160a01b0381166000908152600d602052604090205483106114355760405162461bcd60e51b81526004016104ed90612d73565b6001600160a01b03166000908152601260209081526040808320858452909152902054905092915050565b61147b83838360405180602001604052806000815250612500565b505050565b600060145482106114ee5760405162461bcd60e51b815260206004820152603260248201527f5369676e61746152696768743a2054686520696e6465782070726f76696465646044820152711034b99037baba1037b3103137bab732399760711b60648201526084016104ed565b610421826001612e0c565b6000196014540361156b5760405162461bcd60e51b815260206004820152603660248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f66206044820152753a37b5b2b7399030b63932b0b23c9036b4b73a32b21760511b60648201526084016104ed565b60008381526009602052604081205490036115985760405162461bcd60e51b81526004016104ed90612d16565b6000333b156115a85750336116a1565b600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa1580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116149190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa158015611660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116849190612cad565b156116a15760405162461bcd60e51b81526004016104ed90612e1f565b6000848152600960209081526040808320548352600c9091529020546001600160a01b038281169116146117395760405162461bcd60e51b8152602060048201526044602482018190526000805160206130c1833981519152908201527f746865206d696e74657220666f722074686520736368656d612073706563696660648201526334b2b21760e11b608482015260a4016104ed565b60006001600160a01b0384163b156117525750826117d4565b8215156001036117635750826117d4565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa1580156117ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d19190612c90565b90505b6001601460008282546117e79190612e0c565b9091555050601480546000908152600c6020908152604080832080546001600160a01b0319166001600160a01b038716179055835483526010825280832089905588835260038083528184208054955460048552838620878752855292852092909255898452909152805460019290611861908490612e0c565b90915550506001600160a01b0382166000908152600a60209081526040808320898452909152812080546001929061189a908490612e0c565b90915550506001600160a01b0382166000818152600d6020818152604080842080546014546012855283872082885285528387208190558652601384529185208290559484529190528254909260019290916118f7908490612e0c565b9250508190555061191c600084601454604051806020016040528060008152506126d2565b6119385760405162461bcd60e51b81526004016104ed90612e6c565b841515601454887ff2cac345b81a4b8f2cd1bba64a5ec23eb639ea55383727cd3111e88693c1215660405160405180910390a46014546040516001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450505050505050565b6000818152600c60205260408120546001600160a01b03166119e15760405162461bcd60e51b81526004016104ed90612bcb565b506000908152600f602052604090205460ff1690565b6000818152600960205260408120548103611a245760405162461bcd60e51b81526004016104ed90612d16565b5060009081526003602052604090205490565b6000818152600c60205260408120546001600160a01b031680611a6c5760405162461bcd60e51b81526004016104ed90612bcb565b6001600160a01b0381163b15611a825792915050565b600254604051631513615960e21b81526001600160a01b0383811660048301529091169063544d856490602401602060405180830381865afa158015611acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af09190612c90565b9392505050565b6000818152600c60205260408120546001600160a01b0316611b2b5760405162461bcd60e51b81526004016104ed90612bcb565b5060009081526010602052604090205490565b60006001600160a01b0382163b15611b6c57506001600160a01b03166000908152600d602052604090205490565b600254604051632fea7b8160e01b81526001600160a01b038481166004830152600d92600092911690632fea7b8190602401602060405180830381865afa158015611bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdf9190612c90565b6001600160a01b0316815260208101919091526040016000205492915050565b60606001805461043690612b91565b6000818152600960205260408120548103611c3b5760405162461bcd60e51b81526004016104ed90612d16565b6000803b15611c4b575082611cbc565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa158015611c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb99190612c90565b90505b6001600160a01b03166000908152600a602090815260408083208584529091529020541515905092915050565b600081815260096020526040812054808203611d175760405162461bcd60e51b81526004016104ed90612d16565b6000818152600c60205260409020546001600160a01b0316803b15611d3d579392505050565b600254604051631513615960e21b81526001600160a01b0383811660048301529091169063544d856490602401602060405180830381865afa158015611d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dab9190612c90565b949350505050565b6000336001600160a01b03841603611ddd5760405162461bcd60e51b81526004016104ed90612efb565b333b15611deb575033611f15565b600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa158015611e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e579190612c90565b9050806001600160a01b0316836001600160a01b031603611e8a5760405162461bcd60e51b81526004016104ed90612efb565b600254604051631293efbb60e21b81526001600160a01b03838116600483015290911690634a4fbeec90602401602060405180830381865afa158015611ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef89190612cad565b15611f155760405162461bcd60e51b81526004016104ed90612cca565b6001600160a01b03818116600081815260116020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000600019600b5403611ffd5760405162461bcd60e51b815260206004820152603760248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f662060448201527f736368656d617320616c7265616479206d696e7465642e00000000000000000060648201526084016104ed565b6000196014540361206f5760405162461bcd60e51b815260206004820152603660248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f66206044820152753934b3b43a399030b63932b0b23c9036b4b73a32b21760511b60648201526084016104ed565b60008383604051612081929190612f47565b6040518091039020905060086000828152602001908152602001600020546000146121145760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a20546865205552492070726f7669646564206660448201527f6f722074686520736368656d61206973206e6f7420756e697175652e0000000060648201526084016104ed565b60006001600160a01b0388163b1561212d575086612228565b600254604051632fea7b8160e01b81526001600160a01b038a8116600483015290911690632fea7b8190602401602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa1580156121e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220b9190612cad565b156122285760405162461bcd60e51b81526004016104ed90612e1f565b60016014600082825461223b9190612e0c565b9091555050601480546000908152600c6020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352601082528083206001908190557fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c805495548686527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0585529285209290925580845260039092528054919290916122ea908490612e0c565b90915550506001600160a01b0382166000908152600a60209081526040808320600180855292528220805491929091612324908490612e0c565b90915550506001600160a01b0382166000818152600d602081815260408084208054601454601285528387208288528552838720819055865260138452918520829055948452919052825490926001929091612381908490612e0c565b925050819055506001600b600082825461239b9190612e0c565b9091555050601454600b8054600090815260096020908152604080832094909455915481526007909152206123d1878983612fa5565b50600b8054600086815260086020908152604080832084905592825260068152828220805460ff199081168f151517909155935482526005815282822080549094168c151517909355601454825193840190925280835261243592909186916126d2565b6124515760405162461bcd60e51b81526004016104ed90612e6c565b601454604051600091906001907ff2cac345b81a4b8f2cd1bba64a5ec23eb639ea55383727cd3111e88693c12156908490a46014546040516001600160a01b038c16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483601454600b547fd32db21119d6bb7b885911e2ee1bab864d0c59dbaa980004bcba4cd5edd864ce60405160405180910390a45050600b5498975050505050505050565b61250b848484610b8c565b612517848484846126d2565b6125335760405162461bcd60e51b81526004016104ed90612e6c565b50505050565b6000818152600c60205260409020546060906001600160a01b03166125705760405162461bcd60e51b81526004016104ed90612bcb565b600082815260106020908152604080832054835260079091529020805461259690612b91565b80601f01602080910402602001604051908101604052809291908181526020018280546125c290612b91565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b50505050509050919050565b6000806001600160a01b0384163b61269e57600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa158015612675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126999190612c90565b6126a0565b835b6001600160a01b0390811660009081526011602090815260408083209387168352929052205460ff1691505092915050565b60006001600160a01b0384163b156127c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612716903390899088908890600401613066565b6020604051808303816000875af1925050508015612751575060408051601f3d908101601f1916820190925261274e918101906130a3565b60015b6127ae573d80801561277f576040519150601f19603f3d011682016040523d82523d6000602084013e612784565b606091505b5080516000036127a65760405162461bcd60e51b81526004016104ed90612e6c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dab565b506001949350505050565b6001600160e01b0319811681146127e957600080fd5b50565b6000602082840312156127fe57600080fd5b8135611af0816127d3565b6000815180845260005b8181101561282f57602081850181015186830182015201612813565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611af06020830184612809565b60006020828403121561287457600080fd5b5035919050565b6001600160a01b03811681146127e957600080fd5b600080604083850312156128a357600080fd5b82356128ae8161287b565b946020939093013593505050565b600080604083850312156128cf57600080fd5b50508035926020909101359150565b6000806000606084860312156128f357600080fd5b83356128fe8161287b565b9250602084013561290e8161287b565b929592945050506040919091013590565b80151581146127e957600080fd5b60008060006060848603121561294257600080fd5b8335925060208401356129548161287b565b915060408401356129648161291f565b809150509250925092565b60006020828403121561298157600080fd5b8135611af08161287b565b6000806040838503121561299f57600080fd5b82356129aa8161287b565b915060208301356129ba8161291f565b809150509250929050565b6000806000806000608086880312156129dd57600080fd5b85356129e88161287b565b945060208601356129f88161291f565b93506040860135612a088161291f565b9250606086013567ffffffffffffffff80821115612a2557600080fd5b818801915088601f830112612a3957600080fd5b813581811115612a4857600080fd5b896020828501011115612a5a57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a9957600080fd5b8435612aa48161287b565b93506020850135612ab48161287b565b925060408501359150606085013567ffffffffffffffff80821115612ad857600080fd5b818701915087601f830112612aec57600080fd5b813581811115612afe57612afe612a6d565b604051601f8201601f19908116603f01168101908382118183101715612b2657612b26612a6d565b816040528281528a6020848701011115612b3f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612b7657600080fd5b8235612b818161287b565b915060208301356129ba8161287b565b600181811c90821680612ba557607f821691505b602082108103612bc557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252603c908201527f5369676e61746152696768743a20546f6b656e204944206d75737420636f727260408201527f6573706f6e6420746f20616e206578697374696e672072696768742e00000000606082015260800190565b60208082526042908201527f5369676e61746152696768743a20417070726f76616c206973206e6f7420726560408201527f71756972656420666f7220746865206f776e6572206f662074686520726967686060820152613a1760f11b608082015260a00190565b600060208284031215612ca257600080fd5b8151611af08161287b565b600060208284031215612cbf57600080fd5b8151611af08161291f565b6020808252602c908201527f5369676e61746152696768743a20546865206f776e65722773206163636f756e60408201526b3a1034b9903637b1b5b2b21760a11b606082015260800190565b6020808252603e908201527f5369676e61746152696768743a20536368656d61204944206d75737420636f7260408201527f726573706f6e6420746f20616e206578697374696e6720736368656d612e0000606082015260800190565b6020808252604a908201527f5369676e61746152696768743a2054686520696e6465782070726f766964656460408201527f206973206f7574206f6620626f756e647320666f7220746865206f776e65722060608201526939b832b1b4b334b2b21760b11b608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561042157610421612de3565b8082018082111561042157610421612de3565b6020808252602d908201527f5369676e61746152696768743a205468652073656e6465722773206163636f7560408201526c373a1034b9903637b1b5b2b21760991b606082015260800190565b60208082526063908201527f5369676e61746152696768743a206d757374206f6e6c79207472616e7366657260408201527f20746f20455243373231526563656976657220696d706c656d656e746572732060608201527f7768656e20726563697069656e74206973206120736d61727420636f6e74726160808201526231ba1760e91b60a082015260c00190565b6020808252602c908201527f5369676e61746152696768743a2053656c662d617070726f76616c206973206e60408201526b37ba103932b8bab4b932b21760a11b606082015260800190565b8183823760009101908152919050565b601f82111561147b57600081815260208120601f850160051c81016020861015612f7e5750805b601f850160051c820191505b81811015612f9d57828155600101612f8a565b505050505050565b67ffffffffffffffff831115612fbd57612fbd612a6d565b612fd183612fcb8354612b91565b83612f57565b6000601f8411600181146130055760008515612fed5750838201355b600019600387901b1c1916600186901b17835561305f565b600083815260209020601f19861690835b828110156130365786850135825560209485019460019092019101613016565b50868210156130535760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061309990830184612809565b9695505050505050565b6000602082840312156130b557600080fd5b8151611af0816127d356fe5369676e61746152696768743a205468652073656e646572206973206e6f7420a2646970667358221220ed128e60413b656ff45393f6489543db35378425d081e8a8b93c12e03ec9c34d64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008101429f99afd10c494f5427e697716c4fd74acc0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000d5369676e61746120526967687400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5349474e415441524947485400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806362f96998116100de5780639e942ace11610097578063b88d4fde11610071578063b88d4fde1461035e578063b8c7724a14610371578063c87b56dd14610379578063e985e9c51461038c57600080fd5b80639e942ace14610325578063a22cb46514610338578063b4b44b411461034b57600080fd5b806362f96998146102be5780636352211e146102d15780636b4c399a146102e457806370a08231146102f757806395d89b411461030a57806398b977901461031257600080fd5b806320c5429b1161014b57806342842e0e1161012557806342842e0e146102725780634f6ccce71461028557806352090170146102985780635ccc561e146102ab57600080fd5b806320c5429b1461023957806323b872dd1461024c5780632f745c591461025f57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb5780630ecd76331461021057806318160ddd14610231575b600080fd5b6101a66101a13660046127ec565b61039f565b60405190151581526020015b60405180910390f35b6101c3610427565b6040516101b2919061284f565b6101e36101de366004612862565b6104b9565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004612890565b610512565b005b61022361021e3660046128bc565b610798565b6040519081526020016101b2565b601454610223565b61020e610247366004612862565b610810565b61020e61025a3660046128de565b610b8c565b61022361026d366004612890565b611373565b61020e6102803660046128de565b611460565b610223610293366004612862565b611480565b61020e6102a636600461292d565b6114f9565b6101a66102b9366004612862565b6119ad565b6102236102cc366004612862565b6119f7565b6101e36102df366004612862565b611a37565b6102236102f2366004612862565b611af7565b61022361030536600461296f565b611b3e565b6101c3611bff565b6101a6610320366004612890565b611c0e565b6101e3610333366004612862565b611ce9565b61020e61034636600461298c565b611db3565b6102236103593660046129c5565b611f82565b61020e61036c366004612a83565b612500565b600b54610223565b6101c3610387366004612862565b612539565b6101a661039a366004612b63565b61261b565b60006001600160e01b031982166301ffc9a760e01b14806103d057506001600160e01b031982166380ac58cd60e01b145b806103eb57506001600160e01b0319821663780e9d6360e01b145b8061040657506001600160e01b03198216635b5e139f60e01b145b8061042157506001600160e01b0319821663b992092560e01b145b92915050565b60606000805461043690612b91565b80601f016020809104026020016040519081016040528092919081815260200182805461046290612b91565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000818152600c60205260408120546001600160a01b03166104f65760405162461bcd60e51b81526004016104ed90612bcb565b60405180910390fd5b506000908152600e60205260409020546001600160a01b031690565b6000818152600c60205260409020546001600160a01b0316806105475760405162461bcd60e51b81526004016104ed90612bcb565b806001600160a01b0316836001600160a01b0316036105785760405162461bcd60e51b81526004016104ed90612c28565b60006001600160a01b0382163b156105915750806106bd565b600254604051631513615960e21b81526001600160a01b0384811660048301529091169063544d856490602401602060405180830381865afa1580156105db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ff9190612c90565b9050806001600160a01b0316846001600160a01b0316036106325760405162461bcd60e51b81526004016104ed90612c28565b600254604051631293efbb60e21b81526001600160a01b03848116600483015290911690634a4fbeec90602401602060405180830381865afa15801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a09190612cad565b156106bd5760405162461bcd60e51b81526004016104ed90612cca565b336001600160a01b03821614806106d957506106d9823361261b565b61073b576040805162461bcd60e51b81526020600482015260248101919091526000805160206130c183398151915260448201527f617574686f726973656420746f2070726f7669646520617070726f76616c732e60648201526084016104ed565b6000838152600e602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b60008281526009602052604081205481036107c55760405162461bcd60e51b81526004016104ed90612d16565b60008381526003602052604090205482106107f25760405162461bcd60e51b81526004016104ed90612d73565b50600091825260046020908152604080842092845291905290205490565b6000818152600c60205260409020546001600160a01b031661089a5760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a205269676874204944206d75737420636f727260448201527f6573706f6e6420746f20616e206578697374696e672072696768742e0000000060648201526084016104ed565b60008181526010602090815260408083205480845260059092529091205460ff166109235760405162461bcd60e51b815260206004820152603360248201527f5369676e61746152696768743a20546865207269676874207370656369666965604482015272321034b9903737ba103932bb37b1b0b136329760691b60648201526084016104ed565b6000818152600960209081526040808320548352600c9091528120546001600160a01b031690813b15610957575080610a98565b600254604051631513615960e21b81526001600160a01b0384811660048301529091169063544d856490602401602060405180830381865afa1580156109a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c59190612c90565b600254604051631293efbb60e21b81526001600160a01b038581166004830152929350911690634a4fbeec90602401602060405180830381865afa158015610a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a359190612cad565b15610a985760405162461bcd60e51b815260206004820152602d60248201527f5369676e61746152696768743a20546865206d696e7465722773206163636f7560448201526c373a1034b9903637b1b5b2b21760991b60648201526084016104ed565b336001600160a01b03821614610b045760405162461bcd60e51b815260206004820152603f60248201526000805160206130c183398151915260448201527f617574686f726973656420746f207265766f6b65207468652072696768742e0060648201526084016104ed565b6000848152600f60209081526040808320805460ff19166001908117909155600c8352818420546001600160a01b03168452600a83528184208785529092528220805491929091610b56908490612df9565b909155505060405184907fdb43aa42235c8d63908794a952603e8d43a549383d13123c3d893a3fc2e6249590600090a250505050565b6000818152600c60205260409020546001600160a01b0316610bc05760405162461bcd60e51b81526004016104ed90612bcb565b60008181526010602090815260408083205480845260069092529091205460ff16610c435760405162461bcd60e51b815260206004820152602d60248201527f5369676e61746152696768743a2054686973207269676874206973206e6f6e2d60448201526c3a3930b739b332b930b136329760991b60648201526084016104ed565b6000828152600f602052604090205460ff1615610cb55760405162461bcd60e51b815260206004820152602a60248201527f5369676e61746152696768743a2054686973207269676874206861732062656560448201526937103932bb37b5b2b21760b11b60648201526084016104ed565b6001600160a01b038316610d315760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a205472616e736665727320746f20746865207a60448201527f65726f206164647265737320617265206e6f7420616c6c6f7765642e0000000060648201526084016104ed565b60006001600160a01b0385163b15610d4a575083610e45565b600254604051632fea7b8160e01b81526001600160a01b03878116600483015290911690632fea7b8190602401602060405180830381865afa158015610d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db89190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e289190612cad565b15610e455760405162461bcd60e51b81526004016104ed90612cca565b6000838152600c60205260409020546001600160a01b03828116911614610f065760405162461bcd60e51b815260206004820152606360248201527f5369676e61746152696768743a20546865206163636f756e742073706563696660448201527f69656420646f6573206e6f7420686f6c642074686520726967687420636f727260648201527f6573706f6e64696e6720746f2074686520546f6b656e2049442070726f76696460848201526232b21760e91b60a482015260c4016104ed565b336001600160a01b0382161480610f3357506000838152600e60205260409020546001600160a01b031633145b80610f6157506001600160a01b038116600090815260116020908152604080832033845290915290205460ff165b610fcc5760405162461bcd60e51b815260206004820152604260248201526000805160206130c183398151915260448201527f617574686f726973656420746f207472616e73666572207468697320726967686064820152613a1760f11b608482015260a4016104ed565b60006001600160a01b0385163b15610fe5575083611129565b600254604051632fea7b8160e01b81526001600160a01b03878116600483015290911690632fea7b8190602401602060405180830381865afa15801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190612cad565b156111295760405162461bcd60e51b815260206004820152603060248201527f5369676e61746152696768743a2054686520726563697069656e74277320616360448201526f31b7bab73a1034b9903637b1b5b2b21760811b60648201526084016104ed565b6001600160a01b0382166000908152600d602052604081205461114e90600190612df9565b6000868152601360205260409020549091508082146111a1576001600160a01b03841660009081526012602090815260408083208584528252808320548484528184208190558352601390915290208190555b6001600160a01b0384166000818152601260209081526040808320868452825280832083905589835260138252808320839055928252600a815282822088835290529081208054600192906111f7908490612df9565b90915550506001600160a01b038084166000908152600d60209081526040808320546012835281842081855283528184208b90558a845260138352818420819055600e90925280832080546001600160a01b0319169055519092899291908c16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a46001600160a01b0385166000908152600d602052604081208054600192906112a6908490612df9565b90915550506001600160a01b0384166000908152600d602052604081208054600192906112d4908490612e0c565b90915550506000878152600c6020908152604080832080546001600160a01b0319166001600160a01b0389169081179091558352600a82528083208984529091528120805460019290611328908490612e0c565b909155505060405187906001600160a01b03808b1691908c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050505050565b6000806001600160a01b0384163b1561138d5750826113fe565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa1580156113d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fb9190612c90565b90505b6001600160a01b0381166000908152600d602052604090205483106114355760405162461bcd60e51b81526004016104ed90612d73565b6001600160a01b03166000908152601260209081526040808320858452909152902054905092915050565b61147b83838360405180602001604052806000815250612500565b505050565b600060145482106114ee5760405162461bcd60e51b815260206004820152603260248201527f5369676e61746152696768743a2054686520696e6465782070726f76696465646044820152711034b99037baba1037b3103137bab732399760711b60648201526084016104ed565b610421826001612e0c565b6000196014540361156b5760405162461bcd60e51b815260206004820152603660248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f66206044820152753a37b5b2b7399030b63932b0b23c9036b4b73a32b21760511b60648201526084016104ed565b60008381526009602052604081205490036115985760405162461bcd60e51b81526004016104ed90612d16565b6000333b156115a85750336116a1565b600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa1580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116149190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa158015611660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116849190612cad565b156116a15760405162461bcd60e51b81526004016104ed90612e1f565b6000848152600960209081526040808320548352600c9091529020546001600160a01b038281169116146117395760405162461bcd60e51b8152602060048201526044602482018190526000805160206130c1833981519152908201527f746865206d696e74657220666f722074686520736368656d612073706563696660648201526334b2b21760e11b608482015260a4016104ed565b60006001600160a01b0384163b156117525750826117d4565b8215156001036117635750826117d4565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa1580156117ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d19190612c90565b90505b6001601460008282546117e79190612e0c565b9091555050601480546000908152600c6020908152604080832080546001600160a01b0319166001600160a01b038716179055835483526010825280832089905588835260038083528184208054955460048552838620878752855292852092909255898452909152805460019290611861908490612e0c565b90915550506001600160a01b0382166000908152600a60209081526040808320898452909152812080546001929061189a908490612e0c565b90915550506001600160a01b0382166000818152600d6020818152604080842080546014546012855283872082885285528387208190558652601384529185208290559484529190528254909260019290916118f7908490612e0c565b9250508190555061191c600084601454604051806020016040528060008152506126d2565b6119385760405162461bcd60e51b81526004016104ed90612e6c565b841515601454887ff2cac345b81a4b8f2cd1bba64a5ec23eb639ea55383727cd3111e88693c1215660405160405180910390a46014546040516001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450505050505050565b6000818152600c60205260408120546001600160a01b03166119e15760405162461bcd60e51b81526004016104ed90612bcb565b506000908152600f602052604090205460ff1690565b6000818152600960205260408120548103611a245760405162461bcd60e51b81526004016104ed90612d16565b5060009081526003602052604090205490565b6000818152600c60205260408120546001600160a01b031680611a6c5760405162461bcd60e51b81526004016104ed90612bcb565b6001600160a01b0381163b15611a825792915050565b600254604051631513615960e21b81526001600160a01b0383811660048301529091169063544d856490602401602060405180830381865afa158015611acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af09190612c90565b9392505050565b6000818152600c60205260408120546001600160a01b0316611b2b5760405162461bcd60e51b81526004016104ed90612bcb565b5060009081526010602052604090205490565b60006001600160a01b0382163b15611b6c57506001600160a01b03166000908152600d602052604090205490565b600254604051632fea7b8160e01b81526001600160a01b038481166004830152600d92600092911690632fea7b8190602401602060405180830381865afa158015611bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdf9190612c90565b6001600160a01b0316815260208101919091526040016000205492915050565b60606001805461043690612b91565b6000818152600960205260408120548103611c3b5760405162461bcd60e51b81526004016104ed90612d16565b6000803b15611c4b575082611cbc565b600254604051632fea7b8160e01b81526001600160a01b03868116600483015290911690632fea7b8190602401602060405180830381865afa158015611c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb99190612c90565b90505b6001600160a01b03166000908152600a602090815260408083208584529091529020541515905092915050565b600081815260096020526040812054808203611d175760405162461bcd60e51b81526004016104ed90612d16565b6000818152600c60205260409020546001600160a01b0316803b15611d3d579392505050565b600254604051631513615960e21b81526001600160a01b0383811660048301529091169063544d856490602401602060405180830381865afa158015611d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dab9190612c90565b949350505050565b6000336001600160a01b03841603611ddd5760405162461bcd60e51b81526004016104ed90612efb565b333b15611deb575033611f15565b600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa158015611e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e579190612c90565b9050806001600160a01b0316836001600160a01b031603611e8a5760405162461bcd60e51b81526004016104ed90612efb565b600254604051631293efbb60e21b81526001600160a01b03838116600483015290911690634a4fbeec90602401602060405180830381865afa158015611ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef89190612cad565b15611f155760405162461bcd60e51b81526004016104ed90612cca565b6001600160a01b03818116600081815260116020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000600019600b5403611ffd5760405162461bcd60e51b815260206004820152603760248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f662060448201527f736368656d617320616c7265616479206d696e7465642e00000000000000000060648201526084016104ed565b6000196014540361206f5760405162461bcd60e51b815260206004820152603660248201527f5369676e61746152696768743a204d6178696d756d20616d6f756e74206f66206044820152753934b3b43a399030b63932b0b23c9036b4b73a32b21760511b60648201526084016104ed565b60008383604051612081929190612f47565b6040518091039020905060086000828152602001908152602001600020546000146121145760405162461bcd60e51b815260206004820152603c60248201527f5369676e61746152696768743a20546865205552492070726f7669646564206660448201527f6f722074686520736368656d61206973206e6f7420756e697175652e0000000060648201526084016104ed565b60006001600160a01b0388163b1561212d575086612228565b600254604051632fea7b8160e01b81526001600160a01b038a8116600483015290911690632fea7b8190602401602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190612c90565b600254604051631293efbb60e21b81526001600160a01b038084166004830152929350911690634a4fbeec90602401602060405180830381865afa1580156121e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220b9190612cad565b156122285760405162461bcd60e51b81526004016104ed90612e1f565b60016014600082825461223b9190612e0c565b9091555050601480546000908152600c6020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352601082528083206001908190557fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c805495548686527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0585529285209290925580845260039092528054919290916122ea908490612e0c565b90915550506001600160a01b0382166000908152600a60209081526040808320600180855292528220805491929091612324908490612e0c565b90915550506001600160a01b0382166000818152600d602081815260408084208054601454601285528387208288528552838720819055865260138452918520829055948452919052825490926001929091612381908490612e0c565b925050819055506001600b600082825461239b9190612e0c565b9091555050601454600b8054600090815260096020908152604080832094909455915481526007909152206123d1878983612fa5565b50600b8054600086815260086020908152604080832084905592825260068152828220805460ff199081168f151517909155935482526005815282822080549094168c151517909355601454825193840190925280835261243592909186916126d2565b6124515760405162461bcd60e51b81526004016104ed90612e6c565b601454604051600091906001907ff2cac345b81a4b8f2cd1bba64a5ec23eb639ea55383727cd3111e88693c12156908490a46014546040516001600160a01b038c16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483601454600b547fd32db21119d6bb7b885911e2ee1bab864d0c59dbaa980004bcba4cd5edd864ce60405160405180910390a45050600b5498975050505050505050565b61250b848484610b8c565b612517848484846126d2565b6125335760405162461bcd60e51b81526004016104ed90612e6c565b50505050565b6000818152600c60205260409020546060906001600160a01b03166125705760405162461bcd60e51b81526004016104ed90612bcb565b600082815260106020908152604080832054835260079091529020805461259690612b91565b80601f01602080910402602001604051908101604052809291908181526020018280546125c290612b91565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b50505050509050919050565b6000806001600160a01b0384163b61269e57600254604051632fea7b8160e01b81523360048201526001600160a01b0390911690632fea7b8190602401602060405180830381865afa158015612675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126999190612c90565b6126a0565b835b6001600160a01b0390811660009081526011602090815260408083209387168352929052205460ff1691505092915050565b60006001600160a01b0384163b156127c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612716903390899088908890600401613066565b6020604051808303816000875af1925050508015612751575060408051601f3d908101601f1916820190925261274e918101906130a3565b60015b6127ae573d80801561277f576040519150601f19603f3d011682016040523d82523d6000602084013e612784565b606091505b5080516000036127a65760405162461bcd60e51b81526004016104ed90612e6c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dab565b506001949350505050565b6001600160e01b0319811681146127e957600080fd5b50565b6000602082840312156127fe57600080fd5b8135611af0816127d3565b6000815180845260005b8181101561282f57602081850181015186830182015201612813565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611af06020830184612809565b60006020828403121561287457600080fd5b5035919050565b6001600160a01b03811681146127e957600080fd5b600080604083850312156128a357600080fd5b82356128ae8161287b565b946020939093013593505050565b600080604083850312156128cf57600080fd5b50508035926020909101359150565b6000806000606084860312156128f357600080fd5b83356128fe8161287b565b9250602084013561290e8161287b565b929592945050506040919091013590565b80151581146127e957600080fd5b60008060006060848603121561294257600080fd5b8335925060208401356129548161287b565b915060408401356129648161291f565b809150509250925092565b60006020828403121561298157600080fd5b8135611af08161287b565b6000806040838503121561299f57600080fd5b82356129aa8161287b565b915060208301356129ba8161291f565b809150509250929050565b6000806000806000608086880312156129dd57600080fd5b85356129e88161287b565b945060208601356129f88161291f565b93506040860135612a088161291f565b9250606086013567ffffffffffffffff80821115612a2557600080fd5b818801915088601f830112612a3957600080fd5b813581811115612a4857600080fd5b896020828501011115612a5a57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a9957600080fd5b8435612aa48161287b565b93506020850135612ab48161287b565b925060408501359150606085013567ffffffffffffffff80821115612ad857600080fd5b818701915087601f830112612aec57600080fd5b813581811115612afe57612afe612a6d565b604051601f8201601f19908116603f01168101908382118183101715612b2657612b26612a6d565b816040528281528a6020848701011115612b3f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612b7657600080fd5b8235612b818161287b565b915060208301356129ba8161287b565b600181811c90821680612ba557607f821691505b602082108103612bc557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252603c908201527f5369676e61746152696768743a20546f6b656e204944206d75737420636f727260408201527f6573706f6e6420746f20616e206578697374696e672072696768742e00000000606082015260800190565b60208082526042908201527f5369676e61746152696768743a20417070726f76616c206973206e6f7420726560408201527f71756972656420666f7220746865206f776e6572206f662074686520726967686060820152613a1760f11b608082015260a00190565b600060208284031215612ca257600080fd5b8151611af08161287b565b600060208284031215612cbf57600080fd5b8151611af08161291f565b6020808252602c908201527f5369676e61746152696768743a20546865206f776e65722773206163636f756e60408201526b3a1034b9903637b1b5b2b21760a11b606082015260800190565b6020808252603e908201527f5369676e61746152696768743a20536368656d61204944206d75737420636f7260408201527f726573706f6e6420746f20616e206578697374696e6720736368656d612e0000606082015260800190565b6020808252604a908201527f5369676e61746152696768743a2054686520696e6465782070726f766964656460408201527f206973206f7574206f6620626f756e647320666f7220746865206f776e65722060608201526939b832b1b4b334b2b21760b11b608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561042157610421612de3565b8082018082111561042157610421612de3565b6020808252602d908201527f5369676e61746152696768743a205468652073656e6465722773206163636f7560408201526c373a1034b9903637b1b5b2b21760991b606082015260800190565b60208082526063908201527f5369676e61746152696768743a206d757374206f6e6c79207472616e7366657260408201527f20746f20455243373231526563656976657220696d706c656d656e746572732060608201527f7768656e20726563697069656e74206973206120736d61727420636f6e74726160808201526231ba1760e91b60a082015260c00190565b6020808252602c908201527f5369676e61746152696768743a2053656c662d617070726f76616c206973206e60408201526b37ba103932b8bab4b932b21760a11b606082015260800190565b8183823760009101908152919050565b601f82111561147b57600081815260208120601f850160051c81016020861015612f7e5750805b601f850160051c820191505b81811015612f9d57828155600101612f8a565b505050505050565b67ffffffffffffffff831115612fbd57612fbd612a6d565b612fd183612fcb8354612b91565b83612f57565b6000601f8411600181146130055760008515612fed5750838201355b600019600387901b1c1916600186901b17835561305f565b600083815260209020601f19861690835b828110156130365786850135825560209485019460019092019101613016565b50868210156130535760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061309990830184612809565b9695505050505050565b6000602082840312156130b557600080fd5b8151611af0816127d356fe5369676e61746152696768743a205468652073656e646572206973206e6f7420a2646970667358221220ed128e60413b656ff45393f6489543db35378425d081e8a8b93c12e03ec9c34d64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008101429f99afd10c494f5427e697716c4fd74acc0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000d5369676e61746120526967687400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5349474e415441524947485400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Signata Right
Arg [1] : symbol_ (string): SIGNATARIGHT
Arg [2] : signataIdentity_ (address): 0x8101429f99aFD10C494F5427E697716c4fD74AcC
Arg [3] : mintingSchemaURI_ (string):

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000008101429f99afd10c494f5427e697716c4fd74acc
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 5369676e61746120526967687400000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 5349474e41544152494748540000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

18031:21691:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21317:374;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21317:374:0;;;;;;;;27220:92;;;:::i;:::-;;;;;;;:::i;30571:294::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1594:32:1;;;1576:51;;1564:2;1549:18;30571:294:0;1430:203:1;27737:1286:0;;;;;;:::i;:::-;;:::i;:::-;;38373:523;;;;;;:::i;:::-;;:::i;:::-;;;2493:25:1;;;2481:2;2466:18;38373:523:0;2347:177:1;36212:100:0;36292:12;;36212:100;;29035:1225;;;;;;:::i;:::-;;:::i;32064:3067::-;;;;;;:::i;:::-;;:::i;35672:532::-;;;;;;:::i;:::-;;:::i;35139:145::-;;;;;;:::i;:::-;;:::i;36320:253::-;;;;;;:::i;:::-;;:::i;24249:2260::-;;;;;;:::i;:::-;;:::i;30272:291::-;;;;;;:::i;:::-;;:::i;38056:309::-;;;;;;:::i;:::-;;:::i;26786:426::-;;;;;;:::i;:::-;;:::i;36585:288::-;;;;;;:::i;:::-;;:::i;26517:261::-;;;;;;:::i;:::-;;:::i;27320:96::-;;;:::i;37403:525::-;;;;;;:::i;:::-;;:::i;36881:510::-;;;;;;:::i;:::-;;:::i;30873:874::-;;;;;;:::i;:::-;;:::i;21703:2534::-;;;;;;:::i;:::-;;:::i;35292:368::-;;;;;;:::i;:::-;;:::i;37940:104::-;38023:13;;37940:104;;27424:305;;;;;;:::i;:::-;;:::i;31755:301::-;;;;;;:::i;:::-;;:::i;21317:374::-;21394:4;-1:-1:-1;;;;;;21418:34:0;;-1:-1:-1;;;21418:34:0;;:85;;-1:-1:-1;;;;;;;21469:34:0;;-1:-1:-1;;;21469:34:0;21418:85;:147;;;-1:-1:-1;;;;;;;21520:45:0;;-1:-1:-1;;;21520:45:0;21418:147;:207;;;-1:-1:-1;;;;;;;21582:43:0;;-1:-1:-1;;;21582:43:0;21418:207;:265;;;-1:-1:-1;;;;;;;21642:41:0;;-1:-1:-1;;;21642:41:0;21418:265;21411:272;21317:374;-1:-1:-1;;21317:374:0:o;27220:92::-;27266:13;27299:5;27292:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27220:92;:::o;30571:294::-;30639:7;30681:22;;;:13;:22;;;;;;-1:-1:-1;;;;;30681:22:0;30659:146;;;;-1:-1:-1;;;30659:146:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;30825:32:0;;;;:23;:32;;;;;;-1:-1:-1;;;;;30825:32:0;;30571:294::o;27737:1286::-;27812:13;27828:22;;;:13;:22;;;;;;-1:-1:-1;;;;;27828:22:0;;27871:129;;;;-1:-1:-1;;;27871:129:0;;;;;;;:::i;:::-;28049:5;-1:-1:-1;;;;;28043:11:0;:2;-1:-1:-1;;;;;28043:11:0;;28021:128;;;;-1:-1:-1;;;28021:128:0;;;;;;;:::i;:::-;28170:18;-1:-1:-1;;;;;28213:16:0;;251:20;309:8;28209:492;;-1:-1:-1;28261:5:0;28209:492;;;28312:16;;:35;;-1:-1:-1;;;28312:35:0;;-1:-1:-1;;;;;1594:32:1;;;28312:35:0;;;1576:51:1;28312:16:0;;;;:28;;1549:18:1;;28312:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28299:48;;28408:10;-1:-1:-1;;;;;28402:16:0;:2;-1:-1:-1;;;;;28402:16:0;;28376:145;;;;-1:-1:-1;;;28376:145:0;;;;;;;:::i;:::-;28577:16;;:32;;-1:-1:-1;;;28577:32:0;;-1:-1:-1;;;;;1594:32:1;;;28577::0;;;1576:51:1;28577:16:0;;;;:25;;1549:18:1;;28577:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28576:33;28550:139;;;;-1:-1:-1;;;28550:139:0;;;;;;;:::i;:::-;28747:10;-1:-1:-1;;;;;28747:24:0;;;;:63;;;28775:35;28792:5;28799:10;28775:16;:35::i;:::-;28725:177;;;;;-1:-1:-1;;;28725:177:0;;9416:2:1;28725:177:0;;;9398:21:1;9435:18;;;9428:30;;;;-1:-1:-1;;;;;;;;;;;9474:18:1;;;9467:62;9565:34;9545:18;;;9538:62;9617:19;;28725:177:0;9214:428:1;28725:177:0;28923:32;;;;:23;:32;;;;;;:37;;-1:-1:-1;;;;;;28923:37:0;-1:-1:-1;;;;;28923:37:0;;;;;;;;;28982:33;;28923:32;;28982:33;;;;;;;27801:1222;;27737:1286;;:::o;38373:523::-;38468:7;38510:31;;;:21;:31;;;;;;:36;;38488:148;;;;-1:-1:-1;;;38488:148:0;;;;;;;:::i;:::-;38687:31;;;;:21;:31;;;;;;38679:39;;38657:164;;;;-1:-1:-1;;;38657:164:0;;;;;;;:::i;:::-;-1:-1:-1;38849:25:0;;;;:15;:25;;;;;;;;:32;;;;;;;;;;38373:523::o;29035:1225::-;29144:1;29110:22;;;:13;:22;;;;;;-1:-1:-1;;;;;29110:22:0;29088:146;;;;-1:-1:-1;;;29088:146:0;;10763:2:1;29088:146:0;;;10745:21:1;10802:2;10782:18;;;10775:30;10841:34;10821:18;;;10814:62;10912:30;10892:18;;;10885:58;10960:19;;29088:146:0;10561:424:1;29088:146:0;29255:16;29274:23;;;:14;:23;;;;;;;;;29340:26;;;:16;:26;;;;;;;;;29318:127;;;;-1:-1:-1;;;29318:127:0;;11192:2:1;29318:127:0;;;11174:21:1;11231:2;11211:18;;;11204:30;11270:34;11250:18;;;11243:62;-1:-1:-1;;;11321:18:1;;;11314:49;11380:19;;29318:127:0;10990:415:1;29318:127:0;29466:14;29497:31;;;:21;:31;;;;;;;;;29483:46;;:13;:46;;;;;;-1:-1:-1;;;;;29483:46:0;;251:20;;309:8;29589:323;;-1:-1:-1;29642:6:0;29589:323;;;29694:16;;:36;;-1:-1:-1;;;29694:36:0;;-1:-1:-1;;;;;1594:32:1;;;29694:36:0;;;1576:51:1;29694:16:0;;;;:28;;1549:18:1;;29694:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29786:16;;:33;;-1:-1:-1;;;29786:33:0;;-1:-1:-1;;;;;1594:32:1;;;29786:33:0;;;1576:51:1;29681:49:0;;-1:-1:-1;29786:16:0;;;:25;;1549:18:1;;29786:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29785:34;29759:141;;;;-1:-1:-1;;;29759:141:0;;11612:2:1;29759:141:0;;;11594:21:1;11651:2;11631:18;;;11624:30;11690:34;11670:18;;;11663:62;-1:-1:-1;;;11741:18:1;;;11734:43;11794:19;;29759:141:0;11410:409:1;29759:141:0;29958:10;-1:-1:-1;;;;;29958:24:0;;;29936:137;;;;-1:-1:-1;;;29936:137:0;;12026:2:1;29936:137:0;;;12008:21:1;12065:2;12045:18;;;12038:30;-1:-1:-1;;;;;;;;;;;12084:18:1;;;12077:62;12175:33;12155:18;;;12148:61;12226:19;;29936:137:0;11824:427:1;29936:137:0;30094:33;;;;:24;:33;;;;;;;;:40;;-1:-1:-1;;30094:40:0;30130:4;30094:40;;;;;;30169:13;:22;;;;;;-1:-1:-1;;;;;30169:22:0;30147:45;;:21;:45;;;;;:55;;;;;;;;:60;;30130:4;;30147:55;;:60;;30130:4;;30147:60;:::i;:::-;;;;-1:-1:-1;;30229:15:0;;30236:7;;30229:15;;;;;29077:1183;;;29035:1225;:::o;32064:3067::-;32212:1;32178:22;;;:13;:22;;;;;;-1:-1:-1;;;;;32178:22:0;32156:146;;;;-1:-1:-1;;;32156:146:0;;;;;;;:::i;:::-;32323:16;32342:23;;;:14;:23;;;;;;;;;32408:29;;;:19;:29;;;;;;;;;32386:124;;;;-1:-1:-1;;;32386:124:0;;12723:2:1;32386:124:0;;;12705:21:1;12762:2;12742:18;;;12735:30;12801:34;12781:18;;;12774:62;-1:-1:-1;;;12852:18:1;;;12845:43;12905:19;;32386:124:0;12521:409:1;32386:124:0;32554:33;;;;:24;:33;;;;;;;;32553:34;32531:126;;;;-1:-1:-1;;;32531:126:0;;13137:2:1;32531:126:0;;;13119:21:1;13176:2;13156:18;;;13149:30;13215:34;13195:18;;;13188:62;-1:-1:-1;;;13266:18:1;;;13259:40;13316:19;;32531:126:0;12935:406:1;32531:126:0;-1:-1:-1;;;;;32700:16:0;;32678:127;;;;-1:-1:-1;;;32678:127:0;;13548:2:1;32678:127:0;;;13530:21:1;13587:2;13567:18;;;13560:30;13626:34;13606:18;;;13599:62;13697:30;13677:18;;;13670:58;13745:19;;32678:127:0;13346:424:1;32678:127:0;32826:13;-1:-1:-1;;;;;32864:15:0;;251:20;309:8;32860:305;;-1:-1:-1;32906:4:0;32860:305;;;32951:16;;:34;;-1:-1:-1;;;32951:34:0;;-1:-1:-1;;;;;1594:32:1;;;32951:34:0;;;1576:51:1;32951:16:0;;;;:28;;1549:18:1;;32951:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33041:16;;:32;;-1:-1:-1;;;33041:32:0;;-1:-1:-1;;;;;1594:32:1;;;33041::0;;;1576:51:1;32943:42:0;;-1:-1:-1;33041:16:0;;;:25;;1549:18:1;;33041:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33040:33;33014:139;;;;-1:-1:-1;;;33014:139:0;;;;;;;:::i;:::-;33207:22;;;;:13;:22;;;;;;-1:-1:-1;;;;;33207:31:0;;;:22;;:31;33185:180;;;;-1:-1:-1;;;33185:180:0;;13977:2:1;33185:180:0;;;13959:21:1;14016:2;13996:18;;;13989:30;14055:34;14035:18;;;14028:62;14126:34;14106:18;;;14099:62;14198:34;14177:19;;;14170:63;-1:-1:-1;;;14249:19:1;;;14242:34;14293:19;;33185:180:0;13775:543:1;33185:180:0;33410:10;-1:-1:-1;;;;;33410:19:0;;;;:69;;-1:-1:-1;33447:32:0;;;;:23;:32;;;;;;-1:-1:-1;;;;;33447:32:0;33433:10;:46;33410:69;:116;;;-1:-1:-1;;;;;;33483:31:0;;;;;;:24;:31;;;;;;;;33515:10;33483:43;;;;;;;;;;33410:116;33388:232;;;;-1:-1:-1;;;33388:232:0;;14525:2:1;33388:232:0;;;14507:21:1;14564:2;14544:18;;;14537:30;-1:-1:-1;;;;;;;;;;;14583:18:1;;;14576:62;14674:34;14654:18;;;14647:62;-1:-1:-1;;;14725:19:1;;;14718:33;14768:19;;33388:232:0;14323:470:1;33388:232:0;33641:17;-1:-1:-1;;;;;33675:13:0;;251:20;309:8;33671:315;;-1:-1:-1;33719:2:0;33671:315;;;33766:16;;:32;;-1:-1:-1;;;33766:32:0;;-1:-1:-1;;;;;1594:32:1;;;33766::0;;;1576:51:1;33766:16:0;;;;:28;;1549:18:1;;33766:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33854:16;;:36;;-1:-1:-1;;;33854:36:0;;-1:-1:-1;;;;;1594:32:1;;;33854:36:0;;;1576:51:1;33754:44:0;;-1:-1:-1;33854:16:0;;;:25;;1549:18:1;;33854:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33853:37;33827:147;;;;-1:-1:-1;;;33827:147:0;;15000:2:1;33827:147:0;;;14982:21:1;15039:2;15019:18;;;15012:30;15078:34;15058:18;;;15051:62;-1:-1:-1;;;15129:18:1;;;15122:46;15185:19;;33827:147:0;14798:412:1;33827:147:0;-1:-1:-1;;;;;34031:27:0;;34006:22;34031:27;;;:20;:27;;;;;;:31;;34061:1;;34031:31;:::i;:::-;34073:18;34094:33;;;:24;:33;;;;;;34006:56;;-1:-1:-1;34144:28:0;;;34140:249;;-1:-1:-1;;;;;34211:21:0;;34189:19;34211:21;;;:14;:21;;;;;;;;:37;;;;;;;;;34265:33;;;;;;:47;;;34327:37;;:24;:37;;;;;:50;;;34140:249;-1:-1:-1;;;;;34408:21:0;;;;;;:14;:21;;;;;;;;:37;;;;;;;;34401:44;;;34463:33;;;:24;:33;;;;;34456:40;;;34517:28;;;:21;:28;;;;;:38;;;;;;;;:43;;34559:1;;34408:21;34517:43;;34559:1;;34517:43;:::i;:::-;;;;-1:-1:-1;;;;;;;34598:31:0;;;34581:14;34598:31;;;:20;:31;;;;;;;;;34650:14;:25;;;;;:33;;;;;;;;:43;;;34704:33;;;:24;:33;;;;;:42;;;34767:23;:32;;;;;;:45;;-1:-1:-1;;;;;;34767:45:0;;;34838:35;34598:31;;34686:7;;34581:14;34838:35;;;;;;34581:14;;34838:35;-1:-1:-1;;;;;34886:27:0;;;;;;:20;:27;;;;;:32;;34917:1;;34886:27;:32;;34917:1;;34886:32;:::i;:::-;;;;-1:-1:-1;;;;;;;34929:31:0;;;;;;:20;:31;;;;;:36;;34964:1;;34929:31;:36;;34964:1;;34929:36;:::i;:::-;;;;-1:-1:-1;;34976:22:0;;;;:13;:22;;;;;;;;:34;;-1:-1:-1;;;;;;34976:34:0;-1:-1:-1;;;;;34976:34:0;;;;;;;;35031:32;;:21;:32;;;;;:42;;;;;;;;:47;;-1:-1:-1;;34976:22:0;35031:47;;-1:-1:-1;;35031:47:0;:::i;:::-;;;;-1:-1:-1;;35096:27:0;;35115:7;;-1:-1:-1;;;;;35096:27:0;;;;;;;;;;;;;32145:2986;;;;;;32064:3067;;;:::o;35672:532::-;35761:7;;-1:-1:-1;;;;;35820:16:0;;251:20;309:8;35816:142;;-1:-1:-1;35864:5:0;35816:142;;;35911:16;;:35;;-1:-1:-1;;;35911:35:0;;-1:-1:-1;;;;;1594:32:1;;;35911:35:0;;;1576:51:1;35911:16:0;;;;:28;;1549:18:1;;35911:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35902:44;;35816:142;-1:-1:-1;;;;;36008:28:0;;;;;;:20;:28;;;;;;36000:36;;35978:161;;;;-1:-1:-1;;;35978:161:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36167:22:0;;;;;:14;:22;;;;;;;;:29;;;;;;;;;;-1:-1:-1;35672:532:0;;;;:::o;35139:145::-;35237:39;35254:4;35260:2;35264:7;35237:39;;;;;;;;;;;;:16;:39::i;:::-;35139:145;;;:::o;36320:253::-;36387:7;36437:12;;36429:5;:20;36407:121;;;;-1:-1:-1;;;36407:121:0;;15547:2:1;36407:121:0;;;15529:21:1;15586:2;15566:18;;;15559:30;15625:34;15605:18;;;15598:62;-1:-1:-1;;;15676:18:1;;;15669:48;15734:19;;36407:121:0;15345:414:1;36407:121:0;36556:9;:5;36564:1;36556:9;:::i;24249:2260::-;-1:-1:-1;;24354:12:0;;:27;24332:131;;;;-1:-1:-1;;;24332:131:0;;15966:2:1;24332:131:0;;;15948:21:1;16005:2;15985:18;;;15978:30;16044:34;16024:18;;;16017:62;-1:-1:-1;;;16095:18:1;;;16088:52;16157:19;;24332:131:0;15764:418:1;24332:131:0;24506:31;;;;:21;:31;;;;;;:36;;24484:148;;;;-1:-1:-1;;;24484:148:0;;;;;;;:::i;:::-;24645:14;24684:10;251:20;309:8;24680:327;;-1:-1:-1;24733:10:0;24680:327;;;24785:16;;:40;;-1:-1:-1;;;24785:40:0;;24814:10;24785:40;;;1576:51:1;-1:-1:-1;;;;;24785:16:0;;;;:28;;1549:18:1;;24785:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24881:16;;:33;;-1:-1:-1;;;24881:33:0;;-1:-1:-1;;;;;1594:32:1;;;24881:33:0;;;1576:51:1;24776:49:0;;-1:-1:-1;24881:16:0;;;:25;;1549:18:1;;24881:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24880:34;24854:141;;;;-1:-1:-1;;;24854:141:0;;;;;;;:::i;:::-;25059:46;25073:31;;;:21;:31;;;;;;;;;25059:46;;:13;:46;;;;;;-1:-1:-1;;;;;25049:56:0;;;25059:46;;25049:56;25027:174;;;;-1:-1:-1;;;25027:174:0;;16803:2:1;25027:174:0;;;16785:21:1;16842:2;16822:18;;;16815:30;;;-1:-1:-1;;;;;;;;;;;16861:18:1;;;16854:62;16952:34;16932:18;;;16925:62;-1:-1:-1;;;17003:19:1;;;16996:35;17048:19;;25027:174:0;16601:472:1;25027:174:0;25222:17;-1:-1:-1;;;;;25264:13:0;;251:20;309:8;25260:207;;-1:-1:-1;25308:2:0;25260:207;;;25332:15;;;25343:4;25332:15;25328:139;;-1:-1:-1;25376:2:0;25328:139;;;25423:16;;:32;;-1:-1:-1;;;25423:32:0;;-1:-1:-1;;;;;1594:32:1;;;25423::0;;;1576:51:1;25423:16:0;;;;:28;;1549:18:1;;25423:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25411:44;;25328:139;25503:1;25487:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;25529:12:0;;;25515:27;;;;:13;:27;;;;;;;;:39;;-1:-1:-1;;;;;;25515:39:0;-1:-1:-1;;;;;25515:39:0;;;;;25580:12;;25565:28;;:14;:28;;;;;:39;;;25656:31;;;:21;:31;;;;;;;;25750:12;;25700:15;:25;;;;;:47;;;;;;;;:62;;;;25773:31;;;;;;:36;;-1:-1:-1;;25515:27:0;25773:36;;-1:-1:-1;;25773:36:0;:::i;:::-;;;;-1:-1:-1;;;;;;;25820:32:0;;;;;;:21;:32;;;;;;;;:42;;;;;;;;:47;;25866:1;;25820:32;:47;;25866:1;;25820:47;:::i;:::-;;;;-1:-1:-1;;;;;;;25910:31:0;;25880:27;25910:31;;;:20;:31;;;;;;;;;;26011:12;;25962:14;:25;;;;;:46;;;;;;;;:61;;;26034:38;;:24;:38;;;;;:60;;;26105:31;;;;;;:36;;25910:31;;26140:1;;25910:31;;26105:36;;26140:1;;26105:36;:::i;:::-;;;;;;;;26184:58;26210:1;26214:9;26225:12;;26184:58;;;;;;;;;;;;:17;:58::i;:::-;26162:207;;;;-1:-1:-1;;;26162:207:0;;;;;;;:::i;:::-;26429:7;26395:42;;26415:12;;26405:8;26395:42;;;;;;;;;;26488:12;;26463:38;;-1:-1:-1;;;;;26463:38:0;;;26480:1;;26463:38;;26480:1;;26463:38;24321:2188;;;;24249:2260;;;:::o;30272:291::-;30331:4;30370:22;;;:13;:22;;;;;;-1:-1:-1;;;;;30370:22:0;30348:146;;;;-1:-1:-1;;;30348:146:0;;;;;;;:::i;:::-;-1:-1:-1;30522:33:0;;;;:24;:33;;;;;;;;;30272:291::o;38056:309::-;38130:7;38172:31;;;:21;:31;;;;;;:36;;38150:148;;;;-1:-1:-1;;;38150:148:0;;;;;;;:::i;:::-;-1:-1:-1;38326:31:0;;;;:21;:31;;;;;;;38056:309::o;26786:426::-;26850:7;26886:22;;;:13;:22;;;;;;-1:-1:-1;;;;;26886:22:0;;26929:129;;;;-1:-1:-1;;;26929:129:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27083:16:0;;251:20;309:8;27079:63;;27125:5;26786:426;-1:-1:-1;;26786:426:0:o;27079:63::-;27169:16;;:35;;-1:-1:-1;;;27169:35:0;;-1:-1:-1;;;;;1594:32:1;;;27169:35:0;;;1576:51:1;27169:16:0;;;;:28;;1549:18:1;;27169:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27162:42;26786:426;-1:-1:-1;;;26786:426:0:o;36585:288::-;36652:7;36694:22;;;:13;:22;;;;;;-1:-1:-1;;;;;36694:22:0;36672:146;;;;-1:-1:-1;;;36672:146:0;;;;;;;:::i;:::-;-1:-1:-1;36838:23:0;;;;:14;:23;;;;;;;36585:288::o;26517:261::-;26581:7;-1:-1:-1;;;;;26605:16:0;;251:20;309:8;26601:85;;-1:-1:-1;;;;;;26647:27:0;;;;;:20;:27;;;;;;;26517:261::o;26601:85::-;26734:16;;:35;;-1:-1:-1;;;26734:35:0;;-1:-1:-1;;;;;1594:32:1;;;26734:35:0;;;1576:51:1;26713:20:0;;:57;;26734:16;;;:28;;1549:18:1;;26734:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26713:57:0;;;;;;;;;;;;-1:-1:-1;26713:57:0;;;26517:261;-1:-1:-1;;26517:261:0:o;27320:96::-;27368:13;27401:7;27394:14;;;;;:::i;37403:525::-;37497:4;37536:31;;;:21;:31;;;;;;:36;;37514:148;;;;-1:-1:-1;;;37514:148:0;;;;;;;:::i;:::-;37683:13;251:20;;309:8;37709:142;;-1:-1:-1;37756:6:0;37709:142;;;37803:16;;:36;;-1:-1:-1;;;37803:36:0;;-1:-1:-1;;;;;1594:32:1;;;37803:36:0;;;1576:51:1;37803:16:0;;;;:28;;1549:18:1;;37803:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37795:44;;37709:142;-1:-1:-1;;;;;37878:28:0;37919:1;37878:28;;;:21;:28;;;;;;;;:38;;;;;;;;;:42;;;-1:-1:-1;37403:525:0;;;;:::o;36881:510::-;36949:7;36992:31;;;:21;:31;;;;;;37066:17;;;37044:129;;;;-1:-1:-1;;;37044:129:0;;;;;;;:::i;:::-;37194:13;37210:27;;;:13;:27;;;;;;-1:-1:-1;;;;;37210:27:0;251:20;;309:8;37250:63;;37296:5;36881:510;-1:-1:-1;;;36881:510:0:o;37250:63::-;37340:16;;:35;;-1:-1:-1;;;37340:35:0;;-1:-1:-1;;;;;1594:32:1;;;37340:35:0;;;1576:51:1;37340:16:0;;;;:28;;1549:18:1;;37340:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37333:42;36881:510;-1:-1:-1;;;;36881:510:0:o;30873:874::-;30960:13;31028:10;-1:-1:-1;;;;;31016:22:0;;;30994:117;;;;-1:-1:-1;;;30994:117:0;;;;;;;:::i;:::-;31136:10;251:20;309:8;31132:476;;-1:-1:-1;31184:10:0;31132:476;;;31235:16;;:40;;-1:-1:-1;;;31235:40:0;;31264:10;31235:40;;;1576:51:1;-1:-1:-1;;;;;31235:16:0;;;;:28;;1549:18:1;;31235:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31227:48;;31342:5;-1:-1:-1;;;;;31330:17:0;:8;-1:-1:-1;;;;;31330:17:0;;31304:124;;;;-1:-1:-1;;;31304:124:0;;;;;;;:::i;:::-;31484:16;;:32;;-1:-1:-1;;;31484:32:0;;-1:-1:-1;;;;;1594:32:1;;;31484::0;;;1576:51:1;31484:16:0;;;;:25;;1549:18:1;;31484:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31483:33;31457:139;;;;-1:-1:-1;;;31457:139:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31620:31:0;;;;;;;:24;:31;;;;;;;;:41;;;;;;;;;;;;;:52;;-1:-1:-1;;31620:52:0;;;;;;;;;;31698:41;;540::1;;;31698::0;;513:18:1;31698:41:0;;;;;;;30949:798;30873:874;;:::o;21703:2534::-;21876:7;-1:-1:-1;;21918:13:0;;:28;21896:133;;;;-1:-1:-1;;;21896:133:0;;18241:2:1;21896:133:0;;;18223:21:1;18280:2;18260:18;;;18253:30;18319:34;18299:18;;;18292:62;18390:25;18370:18;;;18363:53;18433:19;;21896:133:0;18039:419:1;21896:133:0;-1:-1:-1;;22072:12:0;;:27;22050:131;;;;-1:-1:-1;;;22050:131:0;;18665:2:1;22050:131:0;;;18647:21:1;18704:2;18684:18;;;18677:30;18743:34;18723:18;;;18716:62;-1:-1:-1;;;18794:18:1;;;18787:52;18856:19;;22050:131:0;18463:418:1;22050:131:0;22202:15;22236:9;;22220:27;;;;;;;:::i;:::-;;;;;;;;22202:45;;22290:16;:25;22307:7;22290:25;;;;;;;;;;;;22319:1;22290:30;22268:140;;;;-1:-1:-1;;;22268:140:0;;19364:2:1;22268:140:0;;;19346:21:1;19403:2;19383:18;;;19376:30;19442:34;19422:18;;;19415:62;19513:30;19493:18;;;19486:58;19561:19;;22268:140:0;19162:424:1;22268:140:0;22429:17;-1:-1:-1;;;;;22471:17:0;;251:20;309:8;22467:324;;-1:-1:-1;22519:6:0;22467:324;;;22570:16;;:36;;-1:-1:-1;;;22570:36:0;;-1:-1:-1;;;;;1594:32:1;;;22570:36:0;;;1576:51:1;22570:16:0;;;;:28;;1549:18:1;;22570:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22662:16;;:36;;-1:-1:-1;;;22662:36:0;;-1:-1:-1;;;;;1594:32:1;;;22662:36:0;;;1576:51:1;22558:48:0;;-1:-1:-1;22662:16:0;;;:25;;1549:18:1;;22662:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22661:37;22635:144;;;;-1:-1:-1;;;22635:144:0;;;;;;;:::i;:::-;22827:1;22811:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;22853:12:0;;;22839:27;;;;:13;:27;;;;;;;;:39;;-1:-1:-1;;;;;;22839:39:0;-1:-1:-1;;;;;22839:39:0;;;;;22904:12;;22889:28;;:14;:28;;;;;-1:-1:-1;22889:32:0;;;;22973:24;;;23053:12;;23010:40;;;:18;:40;;;;;:55;;;;23076:24;;;22973:21;23076:24;;;:29;;-1:-1:-1;;22973:24:0;;23076:29;;-1:-1:-1;;23076:29:0;:::i;:::-;;;;-1:-1:-1;;;;;;;23116:32:0;;;;;;:21;:32;;;;;;;;23155:1;23116:35;;;;;;;:40;;23155:1;;23116:35;;:40;;23155:1;;23116:40;:::i;:::-;;;;-1:-1:-1;;;;;;;23199:31:0;;23169:27;23199:31;;;:20;:31;;;;;;;;;;23300:12;;23251:14;:25;;;;;:46;;;;;;;;:61;;;23323:38;;:24;:38;;;;;:60;;;23394:31;;;;;;:36;;23199:31;;23429:1;;23199:31;;23394:36;;23429:1;;23394:36;:::i;:::-;;;;;;;;23468:1;23451:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;23519:12:0;;23502:13;;;23480:36;;;;:21;:36;;;;;;;;:51;;;;23555:13;;23542:27;;:12;:27;;;;:39;23572:9;;23542:27;:39;:::i;:::-;-1:-1:-1;23620:13:0;;;23592:25;;;;:16;:25;;;;;;;;:41;;;23644:34;;;:19;:34;;;;;:55;;-1:-1:-1;;23644:55:0;;;;;;;;;;23727:13;;23710:31;;:16;:31;;;;;:49;;;;;;;;;;;;23843:12;;23802:58;;;;;;;;;;;;;23592:25;;23832:9;;23802:17;:58::i;:::-;23780:207;;;;-1:-1:-1;;;23780:207:0;;;;;;;:::i;:::-;24026:12;;24013:33;;24040:5;;24026:12;24013:33;;;;24040:5;;24013:33;24101:12;;24072:42;;-1:-1:-1;;;;;24072:42:0;;;24089:1;;24072:42;;24089:1;;24072:42;24180:7;24166:12;;24151:13;;24140:48;;;;;;;;;;-1:-1:-1;;24216:13:0;;;21703:2534;-1:-1:-1;;;;;;;;21703:2534:0:o;35292:368::-;35408:31;35421:4;35427:2;35431:7;35408:12;:31::i;:::-;35482:43;35500:4;35506:2;35510:7;35519:5;35482:17;:43::i;:::-;35460:192;;;;-1:-1:-1;;;35460:192:0;;;;;;;:::i;:::-;35292:368;;;;:::o;27424:305::-;27573:1;27539:22;;;:13;:22;;;;;;27491:13;;-1:-1:-1;;;;;27539:22:0;27517:147;;;;-1:-1:-1;;;27517:147:0;;;;;;;:::i;:::-;27684:37;27697:23;;;:14;:23;;;;;;;;;27684:37;;:12;:37;;;;;27677:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27424:305;;;:::o;31755:301::-;31844:4;;-1:-1:-1;;;;;31879:16:0;;251:20;31878:96;;31934:16;;:40;;-1:-1:-1;;;31934:40:0;;31963:10;31934:40;;;1576:51:1;-1:-1:-1;;;;;31934:16:0;;;;:28;;1549:18:1;;31934:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31878:96;;;31914:5;31878:96;-1:-1:-1;;;;;32006:32:0;;;;;;;:24;:32;;;;;;;;:42;;;;;;;;;;;;;-1:-1:-1;;31755:301:0;;;;:::o;38912:807::-;39019:4;-1:-1:-1;;;;;39045:13:0;;251:20;309:8;39041:671;;39081:70;;-1:-1:-1;;;39081:70:0;;-1:-1:-1;;;;;39081:36:0;;;;;:70;;39118:10;;39130:4;;39136:7;;39145:5;;39081:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39081:70:0;;;;;;;;-1:-1:-1;;39081:70:0;;;;;;;;;;;;:::i;:::-;;;39077:580;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39325:6;:13;39342:1;39325:18;39321:321;;39368:109;;-1:-1:-1;;;39368:109:0;;;;;;;:::i;39321:321::-;39592:6;39586:13;39577:6;39573:2;39569:15;39562:38;39077:580;-1:-1:-1;;;;;;39202:55:0;-1:-1:-1;;;39202:55:0;;-1:-1:-1;39195:62:0;;39041:671;-1:-1:-1;39696:4:0;38912:807;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:423::-;634:3;672:5;666:12;699:6;694:3;687:19;724:1;734:162;748:6;745:1;742:13;734:162;;;810:4;866:13;;;862:22;;856:29;838:11;;;834:20;;827:59;763:12;734:162;;;738:3;941:1;934:4;925:6;920:3;916:16;912:27;905:38;1004:4;997:2;993:7;988:2;980:6;976:15;972:29;967:3;963:39;959:50;952:57;;;592:423;;;;:::o;1020:220::-;1169:2;1158:9;1151:21;1132:4;1189:45;1230:2;1219:9;1215:18;1207:6;1189:45;:::i;1245:180::-;1304:6;1357:2;1345:9;1336:7;1332:23;1328:32;1325:52;;;1373:1;1370;1363:12;1325:52;-1:-1:-1;1396:23:1;;1245:180;-1:-1:-1;1245:180:1:o;1638:131::-;-1:-1:-1;;;;;1713:31:1;;1703:42;;1693:70;;1759:1;1756;1749:12;1774:315;1842:6;1850;1903:2;1891:9;1882:7;1878:23;1874:32;1871:52;;;1919:1;1916;1909:12;1871:52;1958:9;1945:23;1977:31;2002:5;1977:31;:::i;:::-;2027:5;2079:2;2064:18;;;;2051:32;;-1:-1:-1;;;1774:315:1:o;2094:248::-;2162:6;2170;2223:2;2211:9;2202:7;2198:23;2194:32;2191:52;;;2239:1;2236;2229:12;2191:52;-1:-1:-1;;2262:23:1;;;2332:2;2317:18;;;2304:32;;-1:-1:-1;2094:248:1:o;2529:456::-;2606:6;2614;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2730:9;2717:23;2749:31;2774:5;2749:31;:::i;:::-;2799:5;-1:-1:-1;2856:2:1;2841:18;;2828:32;2869:33;2828:32;2869:33;:::i;:::-;2529:456;;2921:7;;-1:-1:-1;;;2975:2:1;2960:18;;;;2947:32;;2529:456::o;2990:118::-;3076:5;3069:13;3062:21;3055:5;3052:32;3042:60;;3098:1;3095;3088:12;3113:450;3187:6;3195;3203;3256:2;3244:9;3235:7;3231:23;3227:32;3224:52;;;3272:1;3269;3262:12;3224:52;3308:9;3295:23;3285:33;;3368:2;3357:9;3353:18;3340:32;3381:31;3406:5;3381:31;:::i;:::-;3431:5;-1:-1:-1;3488:2:1;3473:18;;3460:32;3501:30;3460:32;3501:30;:::i;:::-;3550:7;3540:17;;;3113:450;;;;;:::o;3568:247::-;3627:6;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3735:9;3722:23;3754:31;3779:5;3754:31;:::i;3820:382::-;3885:6;3893;3946:2;3934:9;3925:7;3921:23;3917:32;3914:52;;;3962:1;3959;3952:12;3914:52;4001:9;3988:23;4020:31;4045:5;4020:31;:::i;:::-;4070:5;-1:-1:-1;4127:2:1;4112:18;;4099:32;4140:30;4099:32;4140:30;:::i;:::-;4189:7;4179:17;;;3820:382;;;;;:::o;4207:998::-;4299:6;4307;4315;4323;4331;4384:3;4372:9;4363:7;4359:23;4355:33;4352:53;;;4401:1;4398;4391:12;4352:53;4440:9;4427:23;4459:31;4484:5;4459:31;:::i;:::-;4509:5;-1:-1:-1;4566:2:1;4551:18;;4538:32;4579:30;4538:32;4579:30;:::i;:::-;4628:7;-1:-1:-1;4687:2:1;4672:18;;4659:32;4700:30;4659:32;4700:30;:::i;:::-;4749:7;-1:-1:-1;4807:2:1;4792:18;;4779:32;4830:18;4860:14;;;4857:34;;;4887:1;4884;4877:12;4857:34;4925:6;4914:9;4910:22;4900:32;;4970:7;4963:4;4959:2;4955:13;4951:27;4941:55;;4992:1;4989;4982:12;4941:55;5032:2;5019:16;5058:2;5050:6;5047:14;5044:34;;;5074:1;5071;5064:12;5044:34;5119:7;5114:2;5105:6;5101:2;5097:15;5093:24;5090:37;5087:57;;;5140:1;5137;5130:12;5087:57;4207:998;;;;-1:-1:-1;4207:998:1;;-1:-1:-1;5171:2:1;5163:11;;5193:6;4207:998;-1:-1:-1;;;4207:998:1:o;5210:127::-;5271:10;5266:3;5262:20;5259:1;5252:31;5302:4;5299:1;5292:15;5326:4;5323:1;5316:15;5342:1266;5437:6;5445;5453;5461;5514:3;5502:9;5493:7;5489:23;5485:33;5482:53;;;5531:1;5528;5521:12;5482:53;5570:9;5557:23;5589:31;5614:5;5589:31;:::i;:::-;5639:5;-1:-1:-1;5696:2:1;5681:18;;5668:32;5709:33;5668:32;5709:33;:::i;:::-;5761:7;-1:-1:-1;5815:2:1;5800:18;;5787:32;;-1:-1:-1;5870:2:1;5855:18;;5842:32;5893:18;5923:14;;;5920:34;;;5950:1;5947;5940:12;5920:34;5988:6;5977:9;5973:22;5963:32;;6033:7;6026:4;6022:2;6018:13;6014:27;6004:55;;6055:1;6052;6045:12;6004:55;6091:2;6078:16;6113:2;6109;6106:10;6103:36;;;6119:18;;:::i;:::-;6194:2;6188:9;6162:2;6248:13;;-1:-1:-1;;6244:22:1;;;6268:2;6240:31;6236:40;6224:53;;;6292:18;;;6312:22;;;6289:46;6286:72;;;6338:18;;:::i;:::-;6378:10;6374:2;6367:22;6413:2;6405:6;6398:18;6453:7;6448:2;6443;6439;6435:11;6431:20;6428:33;6425:53;;;6474:1;6471;6464:12;6425:53;6530:2;6525;6521;6517:11;6512:2;6504:6;6500:15;6487:46;6575:1;6570:2;6565;6557:6;6553:15;6549:24;6542:35;6596:6;6586:16;;;;;;;5342:1266;;;;;;;:::o;6613:388::-;6681:6;6689;6742:2;6730:9;6721:7;6717:23;6713:32;6710:52;;;6758:1;6755;6748:12;6710:52;6797:9;6784:23;6816:31;6841:5;6816:31;:::i;:::-;6866:5;-1:-1:-1;6923:2:1;6908:18;;6895:32;6936:33;6895:32;6936:33;:::i;7006:380::-;7085:1;7081:12;;;;7128;;;7149:61;;7203:4;7195:6;7191:17;7181:27;;7149:61;7256:2;7248:6;7245:14;7225:18;7222:38;7219:161;;7302:10;7297:3;7293:20;7290:1;7283:31;7337:4;7334:1;7327:15;7365:4;7362:1;7355:15;7219:161;;7006:380;;;:::o;7391:424::-;7593:2;7575:21;;;7632:2;7612:18;;;7605:30;7671:34;7666:2;7651:18;;7644:62;7742:30;7737:2;7722:18;;7715:58;7805:3;7790:19;;7391:424::o;7820:470::-;8022:2;8004:21;;;8061:2;8041:18;;;8034:30;8100:34;8095:2;8080:18;;8073:62;8171:34;8166:2;8151:18;;8144:62;-1:-1:-1;;;8237:3:1;8222:19;;8215:33;8280:3;8265:19;;7820:470::o;8295:251::-;8365:6;8418:2;8406:9;8397:7;8393:23;8389:32;8386:52;;;8434:1;8431;8424:12;8386:52;8466:9;8460:16;8485:31;8510:5;8485:31;:::i;8551:245::-;8618:6;8671:2;8659:9;8650:7;8646:23;8642:32;8639:52;;;8687:1;8684;8677:12;8639:52;8719:9;8713:16;8738:28;8760:5;8738:28;:::i;8801:408::-;9003:2;8985:21;;;9042:2;9022:18;;;9015:30;9081:34;9076:2;9061:18;;9054:62;-1:-1:-1;;;9147:2:1;9132:18;;9125:42;9199:3;9184:19;;8801:408::o;9647:426::-;9849:2;9831:21;;;9888:2;9868:18;;;9861:30;9927:34;9922:2;9907:18;;9900:62;9998:32;9993:2;9978:18;;9971:60;10063:3;10048:19;;9647:426::o;10078:478::-;10280:2;10262:21;;;10319:2;10299:18;;;10292:30;10358:34;10353:2;10338:18;;10331:62;10429:34;10424:2;10409:18;;10402:62;-1:-1:-1;;;10495:3:1;10480:19;;10473:41;10546:3;10531:19;;10078:478::o;12256:127::-;12317:10;12312:3;12308:20;12305:1;12298:31;12348:4;12345:1;12338:15;12372:4;12369:1;12362:15;12388:128;12455:9;;;12476:11;;;12473:37;;;12490:18;;:::i;15215:125::-;15280:9;;;15301:10;;;15298:36;;;15314:18;;:::i;16187:409::-;16389:2;16371:21;;;16428:2;16408:18;;;16401:30;16467:34;16462:2;16447:18;;16440:62;-1:-1:-1;;;16533:2:1;16518:18;;16511:43;16586:3;16571:19;;16187:409::o;17078:543::-;17280:2;17262:21;;;17319:2;17299:18;;;17292:30;17358:34;17353:2;17338:18;;17331:62;17429:34;17424:2;17409:18;;17402:62;17501:34;17495:3;17480:19;;17473:63;-1:-1:-1;;;17567:3:1;17552:19;;17545:34;17611:3;17596:19;;17078:543::o;17626:408::-;17828:2;17810:21;;;17867:2;17847:18;;;17840:30;17906:34;17901:2;17886:18;;17879:62;-1:-1:-1;;;17972:2:1;17957:18;;17950:42;18024:3;18009:19;;17626:408::o;18886:271::-;19069:6;19061;19056:3;19043:33;19025:3;19095:16;;19120:13;;;19095:16;18886:271;-1:-1:-1;18886:271:1:o;19717:545::-;19819:2;19814:3;19811:11;19808:448;;;19855:1;19880:5;19876:2;19869:17;19925:4;19921:2;19911:19;19995:2;19983:10;19979:19;19976:1;19972:27;19966:4;19962:38;20031:4;20019:10;20016:20;20013:47;;;-1:-1:-1;20054:4:1;20013:47;20109:2;20104:3;20100:12;20097:1;20093:20;20087:4;20083:31;20073:41;;20164:82;20182:2;20175:5;20172:13;20164:82;;;20227:17;;;20208:1;20197:13;20164:82;;;20168:3;;;19717:545;;;:::o;20438:1206::-;20562:18;20557:3;20554:27;20551:53;;;20584:18;;:::i;:::-;20613:94;20703:3;20663:38;20695:4;20689:11;20663:38;:::i;:::-;20657:4;20613:94;:::i;:::-;20733:1;20758:2;20753:3;20750:11;20775:1;20770:616;;;;21430:1;21447:3;21444:93;;;-1:-1:-1;21503:19:1;;;21490:33;21444:93;-1:-1:-1;;20395:1:1;20391:11;;;20387:24;20383:29;20373:40;20419:1;20415:11;;;20370:57;21550:78;;20743:895;;20770:616;19664:1;19657:14;;;19701:4;19688:18;;-1:-1:-1;;20806:17:1;;;20907:9;20929:229;20943:7;20940:1;20937:14;20929:229;;;21032:19;;;21019:33;21004:49;;21139:4;21124:20;;;;21092:1;21080:14;;;;20959:12;20929:229;;;20933:3;21186;21177:7;21174:16;21171:159;;;21310:1;21306:6;21300:3;21294;21291:1;21287:11;21283:21;21279:34;21275:39;21262:9;21257:3;21253:19;21240:33;21236:79;21228:6;21221:95;21171:159;;;21373:1;21367:3;21364:1;21360:11;21356:19;21350:4;21343:33;20743:895;;;20438:1206;;;:::o;21649:489::-;-1:-1:-1;;;;;21918:15:1;;;21900:34;;21970:15;;21965:2;21950:18;;21943:43;22017:2;22002:18;;21995:34;;;22065:3;22060:2;22045:18;;22038:31;;;21843:4;;22086:46;;22112:19;;22104:6;22086:46;:::i;:::-;22078:54;21649:489;-1:-1:-1;;;;;;21649:489:1:o;22143:249::-;22212:6;22265:2;22253:9;22244:7;22240:23;22236:32;22233:52;;;22281:1;22278;22271:12;22233:52;22313:9;22307:16;22332:30;22356:5;22332:30;:::i

Swarm Source

ipfs://ed128e60413b656ff45393f6489543db35378425d081e8a8b93c12e03ec9c34d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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