code: def _normalize_branch_node(self, node):
          # sys.stderr.write('nbn\n')
          
          not_blank_items_count = sum(1 for x in range(17) if node[x])
          assert not_blank_items_count >= 1
  
          if not_blank_items_count > 1:
              self._encode_node(node)
              return node
  
          # now only one item is not blank
          not_blank_index = [i for i, item in enumerate(node) if item][0]
  
          # the value item is not blank
          if not_blank_index == 16:
              o = [pack_nibbles(with_terminator([])), node[16]]
              self._encode_node(o)
              return o
  
          # normal item is not blank
          sub_node = self._decode_to_node(node[not_blank_index])
          sub_node_type = self._get_node_type(sub_node)
  
          if is_key_value_type(sub_node_type):
              # collape subnode to this node, not this node will have same
              # terminator with the new sub node, and value does not change
              self._delete_node_storage(sub_node)
              new_key = [not_blank_index] + \
                  unpack_to_nibbles(sub_node[0])
              o = [pack_nibbles(new_key), sub_node[1]]
              self._encode_node(o)
              return o
          if sub_node_type == NODE_TYPE_BRANCH:
              o = [pack_nibbles([not_blank_index]),
                   node[not_blank_index]]
              self._encode_node(o)
              return o
          assert False
docs: node should have only one item changed