anchor.diff:  let ProgramFiles = Environment.GetFolderPath Environment.SpecialFolder.ProgramFiles
   
   /// The path of Program Files (x86)
  -/// It seems this covers all cases where PROCESSOR\_ARCHITECTURE may misreport and the case where the other variable
  +/// It seems this covers all cases where PROCESSOR\_ARCHITECTURE may misreport and the case where the other variable 
   /// PROCESSOR\_ARCHITEW6432 can be null
  -let ProgramFilesX86 =
  +let ProgramFilesX86 = 
       let wow64 = environVar "PROCESSOR_ARCHITEW6432"
       let globalArch = environVar "PROCESSOR_ARCHITECTURE"
       match wow64, globalArch with
  -    | "AMD64", "AMD64"
  -    | null, "AMD64"
  +    | "AMD64", "AMD64" 
  +    | null, "AMD64" 
       | "x86", "AMD64" -> environVar "ProgramFiles(x86)"
       | _ -> environVar "ProgramFiles"
       |> fun detected -> if detected = null then @"C:\Program Files (x86)\" else detected
  
positive.code: let directorySeparator = Path.DirectorySeparatorChar.ToString()
  
  /// Convert the given windows path to a path in the current system
  let convertWindowsToCurrentPath (windowsPath : string) =
      if (windowsPath.Length > 2 && windowsPath.[1] = ':' && windowsPath.[2] = '\\') then windowsPath
      else windowsPath.Replace(@"\", directorySeparator)
  
  /// Contains the IO encoding which is given via build parameter "encoding" or the default encoding if no encoding was specified.
  let encoding =
      match getBuildParamOrDefault "encoding" "default" with
      | "default" -> Text.Encoding.Default
      | enc -> Text.Encoding.GetEncoding(enc)
  
  /// Returns a sequence with all installed .NET framework versions
  let getInstalledDotNetFrameworks() =
      let frameworks = new ResizeArray<_>()
      try
          let matches =
              Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP").GetSubKeyNames()
              |> Seq.filter (fun keyname -> Regex.IsMatch(keyname, @"^v\d"))
          for item in matches do
              match item with
              | "v4.0" -> ()
              | "v4" ->
                  let key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item
                  Registry.LocalMachine.OpenSubKey(key).GetSubKeyNames()
                  |> Seq.iter (fun subkey ->
                         let key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item + @"\" + subkey
                         let version = Registry.LocalMachine.OpenSubKey(key).GetValue("Version").ToString()
                         frameworks.Add(String.Format("{0} ({1})", version, subkey)))
              | "v1.1.4322" -> frameworks.Add item
              | _ ->
                  let key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item
                  frameworks.Add(Registry.LocalMachine.OpenSubKey(key).GetValue("Version").ToString())
          frameworks :> seq<_>
      with e -> frameworks :> seq<_> //Probably a new unrecognisable version
  
  /// A record which allows to display lots of machine specific information like machine name, processor count etc.
  type MachineDetails =
      { ProcessorCount : int
        Is64bit : bool
        OperatingSystem : string
  
negative.code: let mutable monoArguments = ""
  
  /// Modifies the ProcessStartInfo according to the platform semantics
  let platformInfoAction (psi : ProcessStartInfo) = 
      if isMono && psi.FileName.EndsWith ".exe" then 
          psi.Arguments <- monoArguments + " \"" + psi.FileName + "\" " + psi.Arguments
          psi.FileName <- monoPath
  
  /// The path of the current target platform
  let mutable TargetPlatformPrefix = 
      let (<|>) a b = 
          match a with
          | None -> b
          | _ -> a
      environVarOrNone "FrameworkDir32" <|> if (String.IsNullOrEmpty SystemRoot) then None
                                            else Some(SystemRoot @@ @"Microsoft.NET\Framework") 
      <|> if (isUnix) then Some "/usr/lib/mono"
          else Some @"C:\Windows\Microsoft.NET\Framework"
      |> Option.get
  