anchor.diff:  -export([notree/3, no_ips/3, reconcile/3, maintain/3]).
   
   push_vips(VIPs0) ->
  -    VIPs1 = lists:usort(VIPs0),
  -    VIPs2 = lists:map(fun({VIP, Backends}) -> {VIP, lists:usort(Backends)} end, VIPs1),
  -    gen_statem:cast(?SERVER, {vips, VIPs2}).
  +    VIPs1 = ordsets:from_list(VIPs0),
  +    gen_statem:cast(?SERVER, {vips, VIPs1}).
   
   start_link() ->
       gen_statem:start_link({local, ?SERVER}, ?MODULE, [], []).
  
positive.code:     ?assertEqual({[], [{b, [1, 2, 3]}], []}, generate_diff([{b, [1, 2, 3]}], [])),
      ?assertEqual({[{b, [1, 2, 3]}], [], []}, generate_diff([], [{b, [1, 2, 3]}])),
      ?assertEqual({[], [], []}, generate_diff([{a, [1, 2, 3]}], [{a, [1, 2, 3]}])),
      ?assertEqual({[{b, []}], [{a, []}, {c, []}], []}, generate_diff([{a, []}, {c, []}], [{b, []}])).
  
  -endif.
negative.code:     generate_diff(RestLhs, RestRhs, VIPsToAdd, VIPsToRemove, Mutations);
  %% VIPs are equal, but the backends are different, prepare a mutation entry
  generate_diff([{VIP, BELhs}|RestLhs], [{VIP, BERhs}|RestRhs], VIPsToAdd, VIPsToRemove, Mutations0) ->
      BERhs1 = ordsets:from_list(BERhs),
      BELhs1 = ordsets:from_list(BELhs),
      BEToAdd = ordsets:subtract(BERhs1, BELhs1),
      BEToRemove = ordsets:subtract(BELhs1, BERhs1),
      Mutation = {VIP, BEToAdd, BEToRemove},
      generate_diff(RestLhs, RestRhs, VIPsToAdd, VIPsToRemove, [Mutation|Mutations0]);
  %% New VIP
  