code: func mergeUpdate(r *core.Registration, input core.Registration) bool {
  	var changed bool
  
  	// Note: we allow input.Contact to overwrite r.Contact even if the former is
  	// empty in order to allow users to remove the contact associated with
  	// a registration. Since the field type is a pointer to slice of pointers we
  	// can perform a nil check to differentiate between an empty value and a nil
  	// (e.g. not provided) value
  	if input.Contact != nil && !contactsEqual(r, input) {
  		r.Contact = input.Contact
  		changed = true
  	}
  
  	// If there is an agreement in the input and it's not the same as the base,
  	// then we update the base
  	if len(input.Agreement) > 0 && input.Agreement != r.Agreement {
  		r.Agreement = input.Agreement
  		changed = true
  	}
  
  	if input.Key != nil {
  		if r.Key != nil {
  			sameKey, _ := core.PublicKeysEqual(r.Key.Key, input.Key.Key)
  			if !sameKey {
  				r.Key = input.Key
  				changed = true
  			}
  		}
  	}
  
  	return changed
  }
docs: // MergeUpdate copies a subset of information from the input Registration
  // into the Registration r. It returns true if an update was performed and the base object
  // was changed, and false if no change was made.