anchor.diff:    if id = '' then
       Exit;
     with TBCP47Tag.Create(id) do
  -    try
  -      TLanguageCodeUtils.BCP47Languages.TryGetValue(Language, languageName);
  -      TLanguageCodeUtils.BCP47Scripts.TryGetValue(Script, scriptName);
  -      TLanguageCodeUtils.BCP47Regions.TryGetValue(Region, regionName);
  -    finally
  -      Free;
  +  try
  +    TLanguageCodeUtils.BCP47Languages.TryGetValue(Language, languageName);
  +    TLanguageCodeUtils.BCP47Scripts.TryGetValue(Script, scriptName);
  +    TLanguageCodeUtils.BCP47Regions.TryGetValue(Region, regionName);
  +  finally
  +    Free;
     end;
   
     displayName := TLanguageCodeUtils.LanguageName(languageName, scriptName, regionName);
  
positive.code:   v := o.Values[TKeyboardInfoFile.SLanguageName];
    if not Assigned(v) then
      o.AddPair(TKeyboardInfoFile.SLanguageName, languageName);
  
    v := o.Values[TKeyboardInfoFile.SScriptName];
    if not Assigned(v) and (scriptName <> '') then
      o.AddPair(TKeyboardInfoFile.SScriptName, scriptName);
  
negative.code:     alangs := v as TJSONArray;
      olangs := TJSONObject.Create;
      try
        for i := 0 to alangs.Count - 1 do
        begin
          id := alangs.Items[i].Value;
          if id = '' then
            continue;
  
          o := TJSONObject.Create;
          try
            olangs.AddPair(id, o);
            AddSubtagNames(id, o);
          finally
            o.Free;
          end;
        end;
  
        json.RemovePair(TKeyboardInfoFile.SLanguages);
        json.AddPair(TKeyboardInfoFile.SLanguages, olangs);
  
        // Migration complete and subtags populated
        Exit;
      finally
        olangs.Free;
      end;
    end;
  
    {
  