function safeTransferFrom(address _from, address _to, uint256 _tokenId) 
        external 
        payable 
        mustExist(_tokenId) 
        canOperate(_tokenId) 
        notZero(uint(_to)) 
    {
        address owner = ownerOf(_tokenId);
        
        require (
            _from == owner, 
            "TOY Token not owned by '_from'"
        );
               
        
        
        ExternalNft memory externalNft = uidToExternalNft[_tokenId];
        if (externalNft.nftContractAddress != 0) {
            
            ERC721 externalContract = ERC721(externalNft.nftContractAddress);
            
            externalContract.transferFrom(_from, _to, externalNft.nftId);
        }

        
        idToApprovedAddress[_tokenId] = 0;
        
        toyArray[uidToToyIndex[_tokenId]].owner = _to;

        emit Transfer(_from, _to, _tokenId);

        
        
        uint size;
        assembly { size := extcodesize(_to) }
        if (size > 0) {
            bytes4 retval = TokenReceiverInterface(_to).onERC721Received(msg.sender, _from, _tokenId, "");
            require(
                retval == 0x150b7a02, 
                "Destination contract not equipped to receive TOY Tokens"
            );
        }
    }