anchor.diff:    end
     else
       json.AddPair('encodings', v);
  +end;
  +
  +//
  +// packageFileSize, jsFileSize, documentationFileSize, all from the actual files
  +//
  +procedure TMergeKeyboardInfo.CheckOrAddFileSizes;
  +  procedure DoFileSize(prefix: string);
  +  var
  +    vs, v: TJSONValue;
  +    f: TSearchRec;
  +  begin
  +    v := json.GetValue(prefix+'Filename');
  +    if v <> nil then
  +    begin
  +      if FindFirst(ExtractFilePath(FJsonFile)+v.Value, 0, f) <> 0 then
  +        raise EInvalidKeyboardInfo.CreateFmt('Unable to locate file %s to check its size', [v.Value]);
  +      FindClose(f);
  +      vs := json.GetValue(prefix+'FileSize');
  +      if vs = nil then
  +        json.AddPair(prefix+'FileSize', TJSONNumber.Create(f.Size))
  +      else
  +      begin
  +        if f.Size <> (vs as TJSONNumber).AsInt64 then
  +          raise EInvalidKeyboardInfo.CreateFmt('File size for %s is recorded as %d but should be %d.',
  +            [v.Value, (vs as TJSONNumber).AsInt64, f.Size]);
  +      end;
  +    end;
  +  end;
  +
  +begin
  +  DoFileSize('js');
  +  DoFileSize('package');
  +  DoFileSize('documentation');
   end;
   
   //
  
positive.code:     procedure AddAuthor;
      procedure AddAuthorEmail;
      procedure CheckOrAddEncodings;
      procedure CheckOrAddID;
      procedure CheckOrAddJsFilename;
      procedure AddLastModifiedDate;
  
negative.code:   end;
  
    Result := Assigned(json);
  end;
  
  function TMergeKeyboardInfo.LoadKMPFile: Boolean;
  