diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf6e05a --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +*.pdb + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories +vendor/ + +# IDE +.idea +.vscode + +# coverage +coverage.txt +coverage.html + +# antlr tool jar +antlr-*.jar + +# tempfiles +.cache + +# binary +bin/ +release/ +obj/ diff --git a/Program.cs b/Program.cs index 3096e3c..f72cfca 100644 --- a/Program.cs +++ b/Program.cs @@ -1,84 +1,220 @@ -using FrostFS.SDK.ClientV2; +using System.Diagnostics; + +using FrostFS.SDK.ClientV2; using FrostFS.SDK.ModelsV2; using FrostFS.SDK.ModelsV2.Enums; using FrostFS.SDK.ModelsV2.Netmap; +using FrostFS.SDK.ClientV2.Extensions; +using FrostFS.SDK.ClientV2.Interfaces; try { - var fsClient = new Client("KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq", "http://172.29.238.97:8080"); + var fsClient = Client.GetInstance("KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq", "http://172.29.238.97:8080"); - // List containers - Console.WriteLine("Existing containers:"); + await FetchAndRemoveContainers(fsClient); - await foreach(var cid in fsClient.ListContainersAsync()) + ContainerId containerId = await CreateContainer(fsClient); + + ShowFileInExplorer(); + + var fileName = "cat.jpg"; + //var fileName = "fat_cat.bmp"; + + var objectId = await PutObject(fsClient, containerId, fileName); + //var objectId = await PutSingleObject(fsClient, containerId, fileName); + //var objectId = await PutObjectClientCut(fsClient, containerId, fileName); + + var filter = new ObjectFilter(ObjectMatchType.Equals, "fileName", fileName); + await foreach (var objId in fsClient.SearchObjectsAsync(containerId, filter)) { - Console.WriteLine(cid.ToString()); - // await fsClient.DeleteContainerAsync(cid); - // Console.WriteLine($"REmoved container: {cid}"); + await GetObjectInfo(fsClient, containerId, objId); + } + + var @object = await fsClient.GetObjectAsync(containerId, objectId!); + + File.WriteAllBytes(GetBroFileName(fileName), @object.Payload); + + await foreach (var cid in fsClient.ListContainersAsync()) + { + Console.WriteLine($"ContainerId: {cid} (removing...)"); + await fsClient.DeleteContainerAsync(cid); } - // Create container + await Task.Delay(500); + + await foreach (var cid in fsClient.ListContainersAsync()) + { + Console.WriteLine($"Container {cid} still alive!"); + } +} +catch (Exception ex) +{ + Console.WriteLine($"Error: {ex.Message}"); +} + +static async Task FetchAndRemoveContainers(IFrostFSClient fsClient) +{ + Console.WriteLine("Existing containers:"); + + await foreach (var cid in fsClient.ListContainersAsync()) + { + await fsClient.DeleteContainerAsync(cid); + Console.WriteLine($"Removed container: {cid}"); + } +} + +static async Task CreateContainer(IFrostFSClient fsClient) +{ var placementPolicy = new PlacementPolicy(true, new Replica(1)); var containerId = await fsClient.CreateContainerAsync(new Container(BasicAcl.PublicRW, placementPolicy)); Console.WriteLine($"Created container: {containerId}"); Container? container = null; - while(container is null) + while (container is null) { try { + await Task.Delay(1000); container = await fsClient.GetContainerAsync(containerId); } catch { - Console.WriteLine("Waiting for the container is ready"); + Console.WriteLine("Waiting for the container is ready. Some time is required"); } } - var currentDir = Directory.GetCurrentDirectory(); + return containerId; +} - // Put object - using var fileStream = File.OpenRead("cat.jpg"); - - var cat = new ObjectHeader( +static async Task PutObject(IFrostFSClient fsClient, ContainerId containerId, string fileName) +{ + var fileStream = File.OpenRead(fileName); + + var header = new ObjectHeader( containerId: containerId, type: ObjectType.Regular, - new ObjectAttribute("Filename", "cat.jpg") + new ObjectAttribute("fileName", fileName) ); - var objectId = await fsClient.PutObjectAsync(cat, fileStream); + return await fsClient.PutObjectAsync(header, fileStream); +} + +static async Task PutSingleObject(IFrostFSClient fsClient, ContainerId containerId, string fileName) +{ + var bytes = File.ReadAllBytes(fileName); + + var obj = new FrostFS.SDK.ModelsV2.Object(containerId, bytes) + .AddAttribute("Filename", fileName); + + var objectId = await fsClient.PutSingleObjectAsync(obj); + + return objectId; +} + +static async Task GetObjectInfo(IFrostFSClient fsClient, ContainerId containerId, ObjectId objectId) +{ + Console.WriteLine("--------------------------------------------------"); + Console.WriteLine($"Object ID: {objectId}"); - // Get object header var objHeader = await fsClient.GetObjectHeadAsync(containerId, objectId); - Console.WriteLine("Attributes:"); - foreach(var attribute in objHeader.Attributes) + Console.WriteLine($"size: {objHeader.PayloadLength}"); + + if (objHeader.Split?.SplitId != null) + Console.WriteLine($"splitID: { objHeader.Split?.SplitId}"); + + if (objHeader.Split?.Parent != null) + Console.WriteLine($"parent: {objHeader.Split?.Parent}"); + + if (objHeader.Split?.Previous != null) + Console.WriteLine($"previous: {objHeader.Split?.Previous}"); + + Console.WriteLine($"Attributes:"); + foreach (var attribute in objHeader.Attributes) { - Console.WriteLine($"{attribute.Key}:{attribute.Value}"); + Console.WriteLine($"\t{attribute.Key} = {attribute.Value}"); } - // Get object back - var obj = await fsClient.GetObjectAsync(containerId, objectId); - - File.WriteAllBytes("downloaded.jpg", obj.Payload); - - Console.WriteLine("Existing containers after creating:"); - await foreach(var cid in fsClient.ListContainersAsync()) + if (objHeader.Split?.Children?.FirstOrDefault() != null) { - Console.WriteLine($"ContainerId: {cid} (removing...)"); - await fsClient.DeleteContainerAsync(cid); - } - - await Task.Delay(2000); - - await foreach(var cid in fsClient.ListContainersAsync()) - { - Console.WriteLine($"Container {cid} is alive!"); + Console.WriteLine($"Children:"); + objHeader.Split?.Children.ForEach(x => Console.WriteLine(x.Value)); } } -catch(Exception ex) + +static async Task PutObjectClientCut(IFrostFSClient fsClient, ContainerId containerId, string fileName) { - Console.WriteLine($"Error: {ex.Message}"); + List sentObjectIds = []; + FrostFS.SDK.ModelsV2.Object? currentObject; + + var partSize = 1024 * 1024; + var buffer = new byte[partSize]; + + var largeObject = new LargeObject(containerId); + + var split = new Split(); + + var fileInfo = new FileInfo(fileName); + var fullLength = (ulong)fileInfo.Length; + var fileNameAttribute = new ObjectAttribute("fileName", fileInfo.Name); + + using var stream = File.OpenRead(fileName); + while (true) + { + var bytesCount = await stream.ReadAsync(buffer.AsMemory(0, partSize)); + + split.Previous = sentObjectIds.LastOrDefault(); + + largeObject.AppendBlock(buffer, bytesCount); + + currentObject = new FrostFS.SDK.ModelsV2.Object(containerId, bytesCount < partSize ? buffer.Take(bytesCount).ToArray() : buffer) + .AddAttribute(fileNameAttribute) + .AddAttribute("type", $"part_{sentObjectIds.Count}") + .SetSplit(split); + + if (largeObject.PayloadLength == fullLength) + break; + + var objectId = await fsClient.PutSingleObjectAsync(currentObject); + sentObjectIds.Add(objectId); + } + + if (sentObjectIds.Any()) + { + largeObject.CalculateHash() + .AddAttribute("type", $"ParentObject") + .AddAttribute(fileNameAttribute); + + currentObject.SetParent(largeObject); + + var objectId = await fsClient.PutSingleObjectAsync(currentObject); + sentObjectIds.Add(objectId); + + var linkObject = new LinkObject(containerId, split.SplitId, largeObject) + .AddChildren(sentObjectIds) + .AddAttribute(fileNameAttribute) + .AddAttribute("type", $"LinkedObject"); + + _ = await fsClient.PutSingleObjectAsync(linkObject); + + //return fsClient.CalculateObjectId(largeObject.Header); + + return currentObject.GetParentId(); + } + + return await fsClient.PutSingleObjectAsync(currentObject); } +static void ShowFileInExplorer() +{ + Directory.SetCurrentDirectory(@"C:\Users\p.gross\Pictures\samples"); + var currentDir = Directory.GetCurrentDirectory(); + Process.Start("explorer.exe", currentDir); +} + +static string GetBroFileName(string path) +{ + var newName = Path.GetFileNameWithoutExtension(path) + "_bro" + Path.GetExtension(path); + return newName; +} \ No newline at end of file diff --git a/Sandbox.sln b/Sandbox.sln new file mode 100644 index 0000000..ac40cc1 --- /dev/null +++ b/Sandbox.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "client", "client.csproj", "{7A901C7D-42E7-4AA4-8622-FC808CEDA60D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7A901C7D-42E7-4AA4-8622-FC808CEDA60D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A901C7D-42E7-4AA4-8622-FC808CEDA60D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A901C7D-42E7-4AA4-8622-FC808CEDA60D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A901C7D-42E7-4AA4-8622-FC808CEDA60D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8438D170-FBBF-4F2A-B30A-9A7228114D89} + EndGlobalSection +EndGlobal diff --git a/client.csproj b/client.csproj index 73516c0..afc4e32 100644 --- a/client.csproj +++ b/client.csproj @@ -1,14 +1,29 @@ - - - - Exe net6.0 + 12.0 enable enable - + + + netstandard2.0\FrostFS.SDK.ClientV2.dll + + + + netstandard2.0\FrostFS.SDK.ModelsV2.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/netstandard2.0/FrostFS.SDK.ClientV2.deps.json b/netstandard2.0/FrostFS.SDK.ClientV2.deps.json new file mode 100644 index 0000000..beb5c80 --- /dev/null +++ b/netstandard2.0/FrostFS.SDK.ClientV2.deps.json @@ -0,0 +1,464 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "FrostFS.SDK.ClientV2/1.0.0": { + "dependencies": { + "FrostFS.SDK.Cryptography": "1.0.0", + "FrostFS.SDK.ModelsV2": "1.0.0", + "FrostFS.SDK.ProtosV2": "1.0.0", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Moq.AutoMock": "3.5.0", + "NETStandard.Library": "2.0.3" + }, + "runtime": { + "FrostFS.SDK.ClientV2.dll": {} + } + }, + "BouncyCastle.Cryptography/2.4.0": { + "runtime": { + "lib/netstandard2.0/BouncyCastle.Cryptography.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.4.0.33771" + } + } + }, + "Castle.Core/5.1.1": { + "dependencies": { + "System.Diagnostics.EventLog": "4.7.0", + "System.Reflection.Emit": "4.7.0" + }, + "runtime": { + "lib/netstandard2.0/Castle.Core.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.1.1.0" + } + } + }, + "Google.Protobuf/3.27.0": { + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "runtime": { + "lib/netstandard2.0/Google.Protobuf.dll": { + "assemblyVersion": "3.27.0.0", + "fileVersion": "3.27.0.0" + } + } + }, + "Grpc.Core.Api/2.62.0": { + "dependencies": { + "System.Memory": "4.5.5" + }, + "runtime": { + "lib/netstandard2.0/Grpc.Core.Api.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.62.0.0" + } + } + }, + "Grpc.Net.Client/2.62.0": { + "dependencies": { + "Grpc.Net.Common": "2.62.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" + }, + "runtime": { + "lib/netstandard2.0/Grpc.Net.Client.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.62.0.0" + } + } + }, + "Grpc.Net.Common/2.62.0": { + "dependencies": { + "Grpc.Core.Api": "2.62.0" + }, + "runtime": { + "lib/netstandard2.0/Grpc.Net.Common.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "2.62.0.0" + } + } + }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.23.53103" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/6.0.0": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.21.52210" + } + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "Moq/4.18.4": { + "dependencies": { + "Castle.Core": "5.1.1", + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netstandard2.0/Moq.dll": { + "assemblyVersion": "4.18.0.0", + "fileVersion": "4.18.4.0" + } + } + }, + "Moq.AutoMock/3.5.0": { + "dependencies": { + "Moq": "4.18.4", + "NonBlocking": "2.1.1" + }, + "runtime": { + "lib/netstandard2.0/Moq.AutoMock.dll": { + "assemblyVersion": "3.5.0.0", + "fileVersion": "3.5.0.0" + } + } + }, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "NonBlocking/2.1.1": { + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "runtime": { + "lib/netstandard2.0/NonBlocking.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "System.Buffers/4.5.1": { + "runtime": { + "lib/netstandard2.0/System.Buffers.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.28619.1" + } + } + }, + "System.Diagnostics.DiagnosticSource/6.0.1": { + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.1523.11507" + } + } + }, + "System.Diagnostics.EventLog/4.7.0": { + "dependencies": { + "System.Security.Principal.Windows": "4.7.0" + }, + "runtime": { + "lib/netstandard2.0/System.Diagnostics.EventLog.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.700.19.56404" + } + } + }, + "System.Memory/4.5.5": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Memory.dll": { + "assemblyVersion": "4.0.1.2", + "fileVersion": "4.6.31308.1" + } + } + }, + "System.Numerics.Vectors/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Reflection.Emit/4.7.0": { + "dependencies": { + "System.Reflection.Emit.ILGeneration": "4.7.0" + }, + "runtime": { + "lib/netstandard2.0/System.Reflection.Emit.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.700.19.56404" + } + } + }, + "System.Reflection.Emit.ILGeneration/4.7.0": { + "runtime": { + "lib/netstandard2.0/System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.700.19.56404" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "runtime": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.21.52210" + } + } + }, + "System.Security.Principal.Windows/4.7.0": { + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.700.19.56404" + } + } + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "4.2.0.1", + "fileVersion": "4.6.28619.1" + } + } + }, + "FrostFS.SDK.Cryptography/1.0.0": { + "dependencies": { + "BouncyCastle.Cryptography": "2.4.0", + "Google.Protobuf": "3.27.0", + "System.Memory": "4.5.5" + }, + "runtime": { + "FrostFS.SDK.Cryptography.dll": {} + } + }, + "FrostFS.SDK.ModelsV2/1.0.0": { + "dependencies": { + "FrostFS.SDK.Cryptography": "1.0.0" + }, + "runtime": { + "FrostFS.SDK.ModelsV2.dll": {} + } + }, + "FrostFS.SDK.ProtosV2/1.0.0": { + "dependencies": { + "Google.Protobuf": "3.27.0", + "Grpc.Net.Client": "2.62.0" + }, + "runtime": { + "FrostFS.SDK.ProtosV2.dll": {} + } + } + } + }, + "libraries": { + "FrostFS.SDK.ClientV2/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "BouncyCastle.Cryptography/2.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==", + "path": "bouncycastle.cryptography/2.4.0", + "hashPath": "bouncycastle.cryptography.2.4.0.nupkg.sha512" + }, + "Castle.Core/5.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "path": "castle.core/5.1.1", + "hashPath": "castle.core.5.1.1.nupkg.sha512" + }, + "Google.Protobuf/3.27.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tEaKpc+SP7I3gYW9AHozESyKkrCg8Xe7huI3Q3iUt5t8Dn29r2k1u8jyrGrD16maj/0UsQBM0MDViWEj0iynOA==", + "path": "google.protobuf/3.27.0", + "hashPath": "google.protobuf.3.27.0.nupkg.sha512" + }, + "Grpc.Core.Api/2.62.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-q4Jj6bRZHNnE4CMLqgjiBUCKLit+tRr0simZsS2W6U++akd7CzXByeKy2tddqT68hFzP2XzceXA2YtBTfWtixA==", + "path": "grpc.core.api/2.62.0", + "hashPath": "grpc.core.api.2.62.0.nupkg.sha512" + }, + "Grpc.Net.Client/2.62.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-C7HxLt+wWPTpPFORRHkxxtDLL+K/jXSmZBaPLhFM8AEkN0bYjklIfCwnzajn1gcbRcEETBb0WnRgHJdVzpwbCg==", + "path": "grpc.net.client/2.62.0", + "hashPath": "grpc.net.client.2.62.0.nupkg.sha512" + }, + "Grpc.Net.Common/2.62.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-eBv5I4RPWfdezGXqooU5hs3+XcfVMLk5XDlA4G/Nd9TMX78ZGrFl/lM1Ad187zgBLmH7WPAgfjKRWLBwaa1Wbw==", + "path": "grpc.net.common/2.62.0", + "hashPath": "grpc.net.common.2.62.0.nupkg.sha512" + }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "path": "microsoft.bcl.asyncinterfaces/8.0.0", + "hashPath": "microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512" + }, + "Microsoft.Extensions.Logging.Abstractions/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==", + "path": "microsoft.extensions.logging.abstractions/6.0.0", + "hashPath": "microsoft.extensions.logging.abstractions.6.0.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "Moq/4.18.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==", + "path": "moq/4.18.4", + "hashPath": "moq.4.18.4.nupkg.sha512" + }, + "Moq.AutoMock/3.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-x5pBS+sDYxnDlyf/KVZKQJGLygYcT2745XImXPL12O0547l4jgfaEujGoPyEyjXyB9dmC+XCgYV5jLa7eFGZew==", + "path": "moq.automock/3.5.0", + "hashPath": "moq.automock.3.5.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "NonBlocking/2.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-wCfoF5muN8Qx9Mz3IBsCb0qlViH2fAWTwzpHWp+vSBTxy2U3/5xW5+niLtSG3dXook3bN3U8hdEWRGHM0+5f5Q==", + "path": "nonblocking/2.1.1", + "hashPath": "nonblocking.2.1.1.nupkg.sha512" + }, + "System.Buffers/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", + "path": "system.buffers/4.5.1", + "hashPath": "system.buffers.4.5.1.nupkg.sha512" + }, + "System.Diagnostics.DiagnosticSource/6.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "path": "system.diagnostics.diagnosticsource/6.0.1", + "hashPath": "system.diagnostics.diagnosticsource.6.0.1.nupkg.sha512" + }, + "System.Diagnostics.EventLog/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-iDoKGQcRwX0qwY+eAEkaJGae0d/lHlxtslO+t8pJWAUxlvY3tqLtVOPnW2UU4cFjP0Y/L1QBqhkZfSyGqVMR2w==", + "path": "system.diagnostics.eventlog/4.7.0", + "hashPath": "system.diagnostics.eventlog.4.7.0.nupkg.sha512" + }, + "System.Memory/4.5.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "path": "system.memory/4.5.5", + "hashPath": "system.memory.4.5.5.nupkg.sha512" + }, + "System.Numerics.Vectors/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", + "path": "system.numerics.vectors/4.4.0", + "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==", + "path": "system.reflection.emit/4.7.0", + "hashPath": "system.reflection.emit.4.7.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA==", + "path": "system.reflection.emit.ilgeneration/4.7.0", + "hashPath": "system.reflection.emit.ilgeneration.4.7.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" + }, + "System.Security.Principal.Windows/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==", + "path": "system.security.principal.windows/4.7.0", + "hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "path": "system.threading.tasks.extensions/4.5.4", + "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" + }, + "FrostFS.SDK.Cryptography/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "FrostFS.SDK.ModelsV2/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "FrostFS.SDK.ProtosV2/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file