anchor.diff:      match(MP, Topic, Rest, Acc);
   
   match(MP, Topic, [#trie_node{topic=Name}|Rest], Acc) when Name =/= undefined ->
  -    match(MP, Topic, Rest, match_(Name, ets:lookup(vmq_trie_topic, {MP, Name}), Acc));
  +    case ets:lookup(vmq_trie_topic, {MP, Name}) of
  +        [] ->
  +            match(MP, Topic, Rest, Acc);
  +        [{_, _, _, Nodes}] ->
  +            match(MP, Topic, Rest, match_(Name, Nodes, Acc))
  +    end;
   match(MP, Topic, [_|Rest], Acc) ->
       match(MP, Topic, Rest, Acc);
   match(_, _, [], Acc) -> Acc.
   
  -match_(Topic, [{_, Node}|Rest], Acc) ->
  +match_(Topic, [Node|Rest], Acc) ->
       match_(Topic, Rest, [{Topic, Node}|Acc]);
   match_(_, [], Acc) -> Acc.
   
  
positive.code: 
  add_topic(MP, Topic, Node) ->
      MPTopic = {MP, Topic},
      ets:insert(vmq_trie_topic, {MPTopic, Node}),
      case ets:lookup(vmq_trie_node, MPTopic) of
          [#trie_node{topic=Topic}] ->
              ignore;
  
negative.code: 
  del_topic(MP, Topic, Node) ->
      MPTopic = {MP, Topic},
      case ets:lookup(vmq_trie_topic, MPTopic) of
          [{_, TotalCnt, NodeMap, _}] ->
              {NewNodeMap, NewTotalCnt} =
              case maps:find(Node, NodeMap) of
                  error ->
                      {NodeMap, TotalCnt};
                  {ok, 1} ->
                      {maps:remove(Node, NodeMap), TotalCnt -1};
                  {ok, Cnt} ->
                      {maps:put(Node, Cnt - 1, NodeMap), TotalCnt -1}
              end,
              case NewTotalCnt > 0 of
                  true ->
                      ets:insert(vmq_trie_topic, {MPTopic, NewTotalCnt, NewNodeMap,
                                                  [N || {N, _} <- maps:to_list(NewNodeMap)]}),
                      ignore;
                 false ->
                      ets:delete(vmq_trie_topic, MPTopic),
                      trie_delete(MP, Topic)
              end;
          _ ->
              ignore
      end.
  