anchor.diff:        ADestination: Pointer; ADestinationIndex: Int32; ASize: Int32);
         static; inline;
   
  +    class procedure ReadUInt32AsBytesLE(AInput: UInt32;
  +      const AOutput: THashLibByteArray; AIndex: Int32); overload;
  +      static; inline;
  +
  +    class procedure ReadUInt32AsBytesBE(AInput: UInt32;
  +      const AOutput: THashLibByteArray; AIndex: Int32); overload;
  +      static; inline;
  +
  +    class procedure ReadUInt64AsBytesLE(AInput: UInt64;
  +      const AOutput: THashLibByteArray; AIndex: Int32); overload;
  +      static; inline;
  +
  +    class procedure ReadUInt64AsBytesBE(AInput: UInt64;
  +      const AOutput: THashLibByteArray; AIndex: Int32); overload;
  +      static; inline;
  +
       class function ReadPCardinalAsUInt32(AInput: PCardinal): UInt32;
         static; inline;
   
  
positive.code: {$ENDIF HASHLIB_LITTLE_ENDIAN}
  end;
  
  class function TConverters.ReadPCardinalAsUInt32(AInput: PCardinal): UInt32;
  begin
  {$IFDEF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
    System.Move(AInput^, result, System.SizeOf(UInt32));
  {$ELSE}
    result := AInput^;
  {$ENDIF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
  end;
  
  class function TConverters.ReadPUInt64AsUInt64(AInput: PUInt64): UInt64;
  begin
  {$IFDEF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
    System.Move(AInput^, result, System.SizeOf(UInt64));
  {$ELSE}
    result := AInput^;
  {$ENDIF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
  end;
  
  class function TConverters.ReadPCardinalAsUInt32LE(AInput: PCardinal): UInt32;
  begin
    result := le2me_32(ReadPCardinalAsUInt32(AInput));
    // while this below is slower, it's portable
    // result := (UInt32(AInput[AIndex])) or (UInt32(AInput[AIndex + 1]) shl 8) or
    // (UInt32(AInput[AIndex + 2]) shl 16) or (UInt32(AInput[AIndex + 3]) shl 24);
  end;
  
  class function TConverters.ReadPUInt64AsUInt64LE(AInput: PUInt64): UInt64;
  begin
    result := le2me_64(ReadPUInt64AsUInt64(AInput));
    // while this below is slower, it's portable
    // result := (UInt64(AInput[AIndex])) or (UInt64(AInput[AIndex + 1]) shl 8) or
    // (UInt64(AInput[AIndex + 2]) shl 16) or (UInt64(AInput[AIndex + 3]) shl 24)
    // or (UInt64(AInput[AIndex + 4]) shl 32) or
    // (UInt64(AInput[AIndex + 5]) shl 40) or (UInt64(AInput[AIndex + 6]) shl 48)
    // or (UInt64(AInput[AIndex + 7]) shl 56);
  end;
  
  class function TConverters.ReadBytesAsUInt32LE(AInput: PByte;
    AIndex: Int32): UInt32;
  begin
    result := ReadPCardinalAsUInt32LE(PCardinal(AInput + AIndex));
  end;
  
  class function TConverters.ReadBytesAsUInt64LE(AInput: PByte;
    AIndex: Int32): UInt64;
  begin
    result := ReadPUInt64AsUInt64LE(PUInt64(AInput + AIndex));
  end;
  
  class function TConverters.ReadBytesAsUInt32BE(AInput: PByte;
    AIndex: Int32): UInt32;
  begin
    result := (UInt32(AInput[AIndex]) shl 24) or
      (UInt32(AInput[AIndex + 1]) shl 16) or (UInt32(AInput[AIndex + 2]) shl 8) or
      (UInt32(AInput[AIndex + 3]));
  end;
  
  class function TConverters.ReadBytesAsUInt64BE(AInput: PByte;
    AIndex: Int32): UInt64;
  begin
    result := (UInt64(AInput[AIndex]) shl 56) or
      (UInt64(AInput[AIndex + 1]) shl 48) or (UInt64(AInput[AIndex + 2]) shl 40)
      or (UInt64(AInput[AIndex + 3]) shl 32) or
      (UInt64(AInput[AIndex + 4]) shl 24) or (UInt64(AInput[AIndex + 5]) shl 16)
      or (UInt64(AInput[AIndex + 6]) shl 8) or (UInt64(AInput[AIndex + 7]));
  end;
  
  class function TConverters.ReadUInt32AsBytesLE(AInput: UInt32)
    : THashLibByteArray;
  begin
    System.SetLength(result, System.SizeOf(UInt32));
    TConverters.ReadUInt32AsBytesLE(AInput, result, 0);
  end;
  
  class function TConverters.ReadUInt64AsBytesLE(AInput: UInt64)
    : THashLibByteArray;
  begin
    System.SetLength(result, System.SizeOf(UInt64));
    TConverters.ReadUInt64AsBytesLE(AInput, result, 0);
  end;
  
  class procedure TConverters.ReadUInt32AsBytesLE(AInput: UInt32;
    const AOutput: THashLibByteArray; AIndex: Int32);
  begin
  
negative.code:   AOutput[AIndex + 7] := Byte(AInput);
  end;
  
  class function TConverters.ReadBytesAsUInt32BE(AInput: PByte;
    AIndex: Int32): UInt32;
  begin
    result := (UInt32(AInput[AIndex]) shl 24) or
      (UInt32(AInput[AIndex + 1]) shl 16) or (UInt32(AInput[AIndex + 2]) shl 8) or
      (UInt32(AInput[AIndex + 3]));
  end;
  
  class function TConverters.ReadBytesAsUInt64BE(AInput: PByte;
    AIndex: Int32): UInt64;
  begin
    result := (UInt64(AInput[AIndex]) shl 56) or
      (UInt64(AInput[AIndex + 1]) shl 48) or (UInt64(AInput[AIndex + 2]) shl 40)
      or (UInt64(AInput[AIndex + 3]) shl 32) or
      (UInt64(AInput[AIndex + 4]) shl 24) or (UInt64(AInput[AIndex + 5]) shl 16)
      or (UInt64(AInput[AIndex + 6]) shl 8) or (UInt64(AInput[AIndex + 7]));
  end;
  
  class function TConverters.ReadPCardinalAsUInt32(AInput: PCardinal): UInt32;
  begin
  {$IFDEF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
    System.Move(AInput^, result, System.SizeOf(UInt32));
  {$ELSE}
    result := AInput^;
  {$ENDIF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
  end;
  
  class function TConverters.ReadPUInt64AsUInt64(AInput: PUInt64): UInt64;
  begin
  {$IFDEF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
    System.Move(AInput^, result, System.SizeOf(UInt64));
  {$ELSE}
    result := AInput^;
  {$ENDIF HASHLIB_REQUIRES_PROPER_ALIGNMENT}
  end;
  
  class function TConverters.ReadPCardinalAsUInt32LE(AInput: PCardinal): UInt32;
  begin
    result := le2me_32(ReadPCardinalAsUInt32(AInput));
    // while this below is slower, it's portable
    // result := (UInt32(AInput[AIndex])) or (UInt32(AInput[AIndex + 1]) shl 8) or
    // (UInt32(AInput[AIndex + 2]) shl 16) or (UInt32(AInput[AIndex + 3]) shl 24);
  end;
  
  class function TConverters.ReadPUInt64AsUInt64LE(AInput: PUInt64): UInt64;
  begin
    result := le2me_64(ReadPUInt64AsUInt64(AInput));
    // while this below is slower, it's portable
    // result := (UInt64(AInput[AIndex])) or (UInt64(AInput[AIndex + 1]) shl 8) or
    // (UInt64(AInput[AIndex + 2]) shl 16) or (UInt64(AInput[AIndex + 3]) shl 24)
    // or (UInt64(AInput[AIndex + 4]) shl 32) or
    // (UInt64(AInput[AIndex + 5]) shl 40) or (UInt64(AInput[AIndex + 6]) shl 48)
    // or (UInt64(AInput[AIndex + 7]) shl 56);
  end;
  
  class function TConverters.ReadBytesAsUInt32LE(AInput: PByte;
    AIndex: Int32): UInt32;
  begin
    result := ReadPCardinalAsUInt32LE(PCardinal(AInput + AIndex));
  end;
  
  class function TConverters.ReadBytesAsUInt64LE(AInput: PByte;
    AIndex: Int32): UInt64;
  begin
    result := ReadPUInt64AsUInt64LE(PUInt64(AInput + AIndex));
  end;
  
  class function TConverters.ReadUInt32AsBytesLE(AInput: UInt32)
    : THashLibByteArray;
  begin
    System.SetLength(result, System.SizeOf(UInt32));
    TConverters.ReadUInt32AsBytesLE(AInput, result, 0);
  end;
  
  class function TConverters.ReadUInt64AsBytesLE(AInput: UInt64)
    : THashLibByteArray;
  begin
    System.SetLength(result, System.SizeOf(UInt64));
    TConverters.ReadUInt64AsBytesLE(AInput, result, 0);
  end;
  
  class function TConverters.ConvertBytesToHexString(const AInput
    : THashLibByteArray; AGroup: Boolean): String;
  begin
  