Skip to content

Commit 31e6a03

Browse files
ghost1facewicouy
andauthored
feat: Implement key folding spec 1.5 (#14)
* feat: Implement key folding spec 1.5 * chore: Code formatting * chore: gitattributes to maintain line-endings * chore: Prevent line ending translations on Windows * feat: Adds generated tests for KeyFolding to ensure alignment with spec * Fix: use InvariantCulture for numeric encoding; add complex JSON roun… (#15) * Fix: use InvariantCulture for numeric encoding; add complex JSON round-trip tests * Fix: use InvariantCulture for numeric encoding; add complex JSON round-trip tests * Fix: update DateTime assertion to validate full ISO 8601 UTC timestamp format * feat: Implement key folding spec 1.5 * chore: Sync test line endings --------- Co-authored-by: nic0c4b <24830193+wicouy@users.noreply.github.com>
1 parent e4df90b commit 31e6a03

File tree

22 files changed

+1843
-1065
lines changed

22 files changed

+1843
-1065
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
* text=auto
1+
* -text
22
*.cs text=lf

.specignore

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
# reason: .net doesn't support hyphens in property/field names (full-name)
2-
skips folding when segment requires quotes (safe mode)
3-
4-
# reason: .net doesn't support . syntax for properties/fields (data.meta.items)
5-
skips folding on sibling literal-key collision (safe mode)
6-
7-
# reason: .net doesn't support special chars or colons/brackets/spaces in property/field names or spaces (order:id full name)
8-
encodes tabular arrays with keys needing quotes
9-
quotes key with colon
10-
quotes key with brackets
11-
quotes key with braces
12-
quotes key with comma
13-
quotes key with spaces
14-
quotes key with leading hyphen
15-
quotes key with leading and trailing spaces
16-
quotes numeric key
17-
quotes empty string key
18-
escapes newline in key
19-
escapes tab in key
20-
escapes quotes in key
21-
22-
# reason: may need to rely on System.Numerics.BigInteger for large numbers
1+
# reason: .net doesn't support hyphens in property/field names (full-name)
2+
skips folding when segment requires quotes (safe mode)
3+
4+
# reason: .net doesn't support . syntax for properties/fields (data.meta.items)
5+
skips folding on sibling literal-key collision (safe mode)
6+
7+
# reason: .net doesn't support special chars or colons/brackets/spaces in property/field names or spaces (order:id full name)
8+
encodes tabular arrays with keys needing quotes
9+
quotes key with colon
10+
quotes key with brackets
11+
quotes key with braces
12+
quotes key with comma
13+
quotes key with spaces
14+
quotes key with leading hyphen
15+
quotes key with leading and trailing spaces
16+
quotes numeric key
17+
quotes empty string key
18+
escapes newline in key
19+
escapes tab in key
20+
escapes quotes in key
21+
22+
# reason: may need to rely on System.Numerics.BigInteger for large numbers
2323
encodes large number

CONTRIBUTING.md

Lines changed: 98 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,98 @@
1-
# Contributing to toon-dotnet
2-
3-
Thank you for your interest in contributing to the official .NET implementation of TOON!
4-
5-
## Project Setup
6-
7-
This project uses the .NET SDK for building and testing.
8-
9-
```bash
10-
# Clone the repository
11-
git clone https://github.com/toon-format/toon-dotnet.git
12-
cd toon-dotnet
13-
14-
# Restore dependencies
15-
dotnet restore
16-
17-
# Build the project
18-
dotnet build
19-
20-
# Run tests
21-
dotnet test
22-
23-
# Run tests with coverage
24-
dotnet test --collect:"XPlat Code Coverage"
25-
```
26-
27-
## Development Workflow
28-
29-
1. **Fork the repository** and create a feature branch
30-
2. **Make your changes** following the coding standards below
31-
3. **Add tests** for any new functionality
32-
4. **Ensure all tests pass** and coverage remains high
33-
5. **Submit a pull request** with a clear description
34-
35-
## Coding Standards
36-
37-
### .NET Version Support
38-
39-
We target .NET 8.0 and .NET 9.0 for broad compatibility.
40-
41-
### Type Safety
42-
43-
- Use nullable reference types
44-
- Avoid `dynamic` where possible
45-
- Leverage C# language features appropriately
46-
47-
### Code Style
48-
49-
- We follow standard .NET conventions
50-
- Use `dotnet format` for consistent formatting:
51-
```bash
52-
dotnet format
53-
```
54-
- Consider enabling code analyzers in your IDE
55-
56-
### Testing
57-
58-
- All new features must include tests
59-
- Aim for high test coverage (80%+)
60-
- Tests should cover edge cases and spec compliance
61-
- Run the full test suite:
62-
```bash
63-
dotnet test
64-
```
65-
66-
Some tests are auto generated to comply with the [TOON specification](https://github.com/toon-format/spec/blob/main/SPEC.md). To ensure tests are
67-
aligned with the spec, execute the `specgen.sh` or `specgen.ps1` script.
68-
69-
## SPEC Compliance
70-
71-
All implementations must comply with the [TOON specification](https://github.com/toon-format/spec/blob/main/SPEC.md).
72-
73-
Before submitting changes that affect encoding/decoding behavior:
74-
1. Verify against the official SPEC.md
75-
2. Add tests for the specific spec sections you're implementing
76-
3. Document any spec version requirements
77-
78-
## Pull Request Guidelines
79-
80-
- **Title**: Use a clear, descriptive title (e.g., "Add support for nested arrays", "Fix: Handle edge case in decoder")
81-
- **Description**: Explain what changes you made and why
82-
- **Tests**: Include tests for your changes
83-
- **Documentation**: Update README or XML documentation if needed
84-
- **Commits**: Use clear commit messages ([Conventional Commits](https://www.conventionalcommits.org/) preferred)
85-
86-
## Communication
87-
88-
- **GitHub Issues**: For bug reports and feature requests
89-
- **GitHub Discussions**: For questions and general discussion
90-
- **Pull Requests**: For code reviews and implementation discussion
91-
92-
## Maintainers
93-
94-
This is a collaborative project. All maintainers have equal decision-making power. For major architectural decisions, please open a discussion issue first.
95-
96-
## License
97-
98-
By contributing, you agree that your contributions will be licensed under the MIT License.
1+
# Contributing to toon-dotnet
2+
3+
Thank you for your interest in contributing to the official .NET implementation of TOON!
4+
5+
## Project Setup
6+
7+
This project uses the .NET SDK for building and testing.
8+
9+
```bash
10+
# Clone the repository
11+
git clone https://github.com/toon-format/toon-dotnet.git
12+
cd toon-dotnet
13+
14+
# Restore dependencies
15+
dotnet restore
16+
17+
# Build the project
18+
dotnet build
19+
20+
# Run tests
21+
dotnet test
22+
23+
# Run tests with coverage
24+
dotnet test --collect:"XPlat Code Coverage"
25+
```
26+
27+
## Development Workflow
28+
29+
1. **Fork the repository** and create a feature branch
30+
2. **Make your changes** following the coding standards below
31+
3. **Add tests** for any new functionality
32+
4. **Ensure all tests pass** and coverage remains high
33+
5. **Submit a pull request** with a clear description
34+
35+
## Coding Standards
36+
37+
### .NET Version Support
38+
39+
We target .NET 8.0 and .NET 9.0 for broad compatibility.
40+
41+
### Type Safety
42+
43+
- Use nullable reference types
44+
- Avoid `dynamic` where possible
45+
- Leverage C# language features appropriately
46+
47+
### Code Style
48+
49+
- We follow standard .NET conventions
50+
- Use `dotnet format` for consistent formatting:
51+
```bash
52+
dotnet format
53+
```
54+
- Consider enabling code analyzers in your IDE
55+
56+
### Testing
57+
58+
- All new features must include tests
59+
- Aim for high test coverage (80%+)
60+
- Tests should cover edge cases and spec compliance
61+
- Run the full test suite:
62+
```bash
63+
dotnet test
64+
```
65+
66+
Some tests are auto generated to comply with the [TOON specification](https://github.com/toon-format/spec/blob/main/SPEC.md). To ensure tests are
67+
aligned with the spec, execute the `specgen.sh` or `specgen.ps1` script.
68+
69+
## SPEC Compliance
70+
71+
All implementations must comply with the [TOON specification](https://github.com/toon-format/spec/blob/main/SPEC.md).
72+
73+
Before submitting changes that affect encoding/decoding behavior:
74+
1. Verify against the official SPEC.md
75+
2. Add tests for the specific spec sections you're implementing
76+
3. Document any spec version requirements
77+
78+
## Pull Request Guidelines
79+
80+
- **Title**: Use a clear, descriptive title (e.g., "Add support for nested arrays", "Fix: Handle edge case in decoder")
81+
- **Description**: Explain what changes you made and why
82+
- **Tests**: Include tests for your changes
83+
- **Documentation**: Update README or XML documentation if needed
84+
- **Commits**: Use clear commit messages ([Conventional Commits](https://www.conventionalcommits.org/) preferred)
85+
86+
## Communication
87+
88+
- **GitHub Issues**: For bug reports and feature requests
89+
- **GitHub Discussions**: For questions and general discussion
90+
- **Pull Requests**: For code reviews and implementation discussion
91+
92+
## Maintainers
93+
94+
This is a collaborative project. All maintainers have equal decision-making power. For major architectural decisions, please open a discussion issue first.
95+
96+
## License
97+
98+
By contributing, you agree that your contributions will be licensed under the MIT License.

ToonFormat.sln

Lines changed: 71 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,71 @@
1-
2-
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.0.31903.59
5-
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
7-
EndProject
8-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat", "src\ToonFormat\ToonFormat.csproj", "{1951209F-73E0-4B33-AB40-8D80CACCB507}"
9-
EndProject
10-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}"
11-
EndProject
12-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat.Tests", "tests\ToonFormat.Tests\ToonFormat.Tests.csproj", "{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}"
13-
EndProject
14-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat.SpecGenerator", "tests\ToonFormat.SpecGenerator\ToonFormat.SpecGenerator.csproj", "{DB25DA28-D02C-4D8F-8C4A-D581D544607C}"
15-
EndProject
16-
Global
17-
GlobalSection(SolutionConfigurationPlatforms) = preSolution
18-
Debug|Any CPU = Debug|Any CPU
19-
Debug|x64 = Debug|x64
20-
Debug|x86 = Debug|x86
21-
Release|Any CPU = Release|Any CPU
22-
Release|x64 = Release|x64
23-
Release|x86 = Release|x86
24-
EndGlobalSection
25-
GlobalSection(ProjectConfigurationPlatforms) = postSolution
26-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|Any CPU.Build.0 = Debug|Any CPU
28-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x64.ActiveCfg = Debug|Any CPU
29-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x64.Build.0 = Debug|Any CPU
30-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x86.ActiveCfg = Debug|Any CPU
31-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x86.Build.0 = Debug|Any CPU
32-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|Any CPU.ActiveCfg = Release|Any CPU
33-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|Any CPU.Build.0 = Release|Any CPU
34-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x64.ActiveCfg = Release|Any CPU
35-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x64.Build.0 = Release|Any CPU
36-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x86.ActiveCfg = Release|Any CPU
37-
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x86.Build.0 = Release|Any CPU
38-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|Any CPU.Build.0 = Debug|Any CPU
40-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x64.ActiveCfg = Debug|Any CPU
41-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x64.Build.0 = Debug|Any CPU
42-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x86.ActiveCfg = Debug|Any CPU
43-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x86.Build.0 = Debug|Any CPU
44-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|Any CPU.ActiveCfg = Release|Any CPU
45-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|Any CPU.Build.0 = Release|Any CPU
46-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x64.ActiveCfg = Release|Any CPU
47-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x64.Build.0 = Release|Any CPU
48-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x86.ActiveCfg = Release|Any CPU
49-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x86.Build.0 = Release|Any CPU
50-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|Any CPU.Build.0 = Debug|Any CPU
52-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x64.ActiveCfg = Debug|Any CPU
53-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x64.Build.0 = Debug|Any CPU
54-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x86.ActiveCfg = Debug|Any CPU
55-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x86.Build.0 = Debug|Any CPU
56-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|Any CPU.ActiveCfg = Release|Any CPU
57-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|Any CPU.Build.0 = Release|Any CPU
58-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x64.ActiveCfg = Release|Any CPU
59-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x64.Build.0 = Release|Any CPU
60-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x86.ActiveCfg = Release|Any CPU
61-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x86.Build.0 = Release|Any CPU
62-
EndGlobalSection
63-
GlobalSection(SolutionProperties) = preSolution
64-
HideSolutionNode = FALSE
65-
EndGlobalSection
66-
GlobalSection(NestedProjects) = preSolution
67-
{1951209F-73E0-4B33-AB40-8D80CACCB507} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
68-
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
69-
{DB25DA28-D02C-4D8F-8C4A-D581D544607C} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
70-
EndGlobalSection
71-
EndGlobal
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat", "src\ToonFormat\ToonFormat.csproj", "{1951209F-73E0-4B33-AB40-8D80CACCB507}"
9+
EndProject
10+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}"
11+
EndProject
12+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat.Tests", "tests\ToonFormat.Tests\ToonFormat.Tests.csproj", "{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}"
13+
EndProject
14+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToonFormat.SpecGenerator", "tests\ToonFormat.SpecGenerator\ToonFormat.SpecGenerator.csproj", "{DB25DA28-D02C-4D8F-8C4A-D581D544607C}"
15+
EndProject
16+
Global
17+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
18+
Debug|Any CPU = Debug|Any CPU
19+
Debug|x64 = Debug|x64
20+
Debug|x86 = Debug|x86
21+
Release|Any CPU = Release|Any CPU
22+
Release|x64 = Release|x64
23+
Release|x86 = Release|x86
24+
EndGlobalSection
25+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
26+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|Any CPU.Build.0 = Debug|Any CPU
28+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x64.ActiveCfg = Debug|Any CPU
29+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x64.Build.0 = Debug|Any CPU
30+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x86.ActiveCfg = Debug|Any CPU
31+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Debug|x86.Build.0 = Debug|Any CPU
32+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|Any CPU.ActiveCfg = Release|Any CPU
33+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|Any CPU.Build.0 = Release|Any CPU
34+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x64.ActiveCfg = Release|Any CPU
35+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x64.Build.0 = Release|Any CPU
36+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x86.ActiveCfg = Release|Any CPU
37+
{1951209F-73E0-4B33-AB40-8D80CACCB507}.Release|x86.Build.0 = Release|Any CPU
38+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|Any CPU.Build.0 = Debug|Any CPU
40+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x64.ActiveCfg = Debug|Any CPU
41+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x64.Build.0 = Debug|Any CPU
42+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x86.ActiveCfg = Debug|Any CPU
43+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Debug|x86.Build.0 = Debug|Any CPU
44+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|Any CPU.ActiveCfg = Release|Any CPU
45+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|Any CPU.Build.0 = Release|Any CPU
46+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x64.ActiveCfg = Release|Any CPU
47+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x64.Build.0 = Release|Any CPU
48+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x86.ActiveCfg = Release|Any CPU
49+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55}.Release|x86.Build.0 = Release|Any CPU
50+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|Any CPU.Build.0 = Debug|Any CPU
52+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x64.ActiveCfg = Debug|Any CPU
53+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x64.Build.0 = Debug|Any CPU
54+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x86.ActiveCfg = Debug|Any CPU
55+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Debug|x86.Build.0 = Debug|Any CPU
56+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|Any CPU.ActiveCfg = Release|Any CPU
57+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|Any CPU.Build.0 = Release|Any CPU
58+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x64.ActiveCfg = Release|Any CPU
59+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x64.Build.0 = Release|Any CPU
60+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x86.ActiveCfg = Release|Any CPU
61+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C}.Release|x86.Build.0 = Release|Any CPU
62+
EndGlobalSection
63+
GlobalSection(SolutionProperties) = preSolution
64+
HideSolutionNode = FALSE
65+
EndGlobalSection
66+
GlobalSection(NestedProjects) = preSolution
67+
{1951209F-73E0-4B33-AB40-8D80CACCB507} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
68+
{25E10B0C-CAC4-475E-90C9-B4F85BB56C55} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
69+
{DB25DA28-D02C-4D8F-8C4A-D581D544607C} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
70+
EndGlobalSection
71+
EndGlobal

0 commit comments

Comments
 (0)