anchor.diff:        %% key's attributes have changed.
         ok;
       {false, Path} ->
  -      U = #item{k = X, p = ?NOPAGEID},
  +      U = ?item(X, ?NOPAGEID),
         case insert(IO, N, ?NOPAGEID, U, Path) of
           false ->
             ok;
  
positive.code: 
  check_elements(_IO, _N, E, I, LowerBound) when I > size(E) -> LowerBound;
  check_elements(IO, N, E, I, LowerBound) ->
    #item{k = K, p = P} = element(I, E),
    check_key(K, LowerBound),
    LowerBound2 = {ok, K},
    LowerBound3 = check_pageid(IO, N, P, LowerBound2, false),
  
negative.code:       %% b = page to the left of a
        BPageId =
          if S =:= 1 -> CP0;
             true -> item_p(element(S - 1, CE))
          end,
        {Cache4, B = #page{e = BE}} = cache_read(Cache3, BPageId),
        MB = size(BE) + 1,
        K = (MB - N) div 2,
        if K > 0 ->
            %% move k items from page b to a
            U = ?item(item_k(element(S, CE)), AP0),
            MB2 = MB - K,
            {BE1, [?item(BEMB2k, BEMB2p) | BE2]} = lists:split(MB2 - 1, tuple_to_list(BE)),
            AE2 = list_to_tuple(BE2 ++ [U] ++ tuple_to_list(AE)),
            CE2 = setelement(S, CE, ?item(BEMB2k, APageId)),
            Cache5 = cache_write(Cache4, A#page{p0 = BEMB2p, e = AE2}),
            Cache6 = cache_write(Cache5, B#page{e = list_to_tuple(BE1)}),
            Cache7 = cache_write(Cache6, C#page{e = CE2}),
            {Cache7, false};
           true ->
            %% merge pages a and b
            U = ?item(item_k(element(S, CE)), AP0),
            BE2 = list_to_tuple(tuple_to_list(BE) ++ [U] ++ tuple_to_list(AE)),
            Cache5 = cache_write(Cache4, B#page{e = BE2}),
            Cache6 = cache_write(Cache5, C#page{e = erlang:delete_element(S, CE)}),
  