anchor.diff:  	when 
   		Identity :: string() | binary(),
   		Password :: string() | binary(),
  -		Product :: string(),
  +		Product :: string() | undefined,
   		Characteristics :: [tuple()],
   		Result :: {ok, #subscriber{}} | {error, Reason},
   		Reason :: term().
  
positive.code: 	when
  		Identity :: string() | binary() | undefined,
  		Password :: string() | binary() | undefined,
  		Product :: string(),
  		Characteristics :: [tuple()] | undefined,
  		Buckets :: [#bucket{}] | undefined,
  		Attributes :: radius_attributes:attributes() | binary(),
  
negative.code: 		when is_binary(Identity), is_binary(Password), is_list(Product), Product /= [],
  		is_list(Buckets), is_list(Attributes), is_boolean(EnabledStatus), is_boolean(MultiSession) ->
  	F1 = fun() ->
  				ProdId = case Product of
  					[] ->
  						case mnesia:first(product) of
  							'$end_of_table' ->
  								throw(product_not_found);
  							ProId ->
  								ProId
  						end;
  					Product ->
  						Product
  				end,
  				case mnesia:read(product, ProdId, read) of
  					[#product{start_date = SD, end_date = TD, status = Status }] ->
  						TS = erlang:system_time(?MILLISECOND),
  						N = erlang:unique_integer([positive]),
  