From c0fdb8493def5b58b7fcd04bd8a8c4d4c2f5c64b Mon Sep 17 00:00:00 2001 From: Marek Counts Date: Fri, 25 Oct 2024 02:16:27 -0400 Subject: [PATCH] init the AI games --- advent_of_ai/README.md | 9 + advent_of_ai/log_0.txt | 1 + advent_of_ai/part_one.md | 36 + advent_of_ai/part_one_solution.md | 1 + advent_of_ai/part_two.md | 24 + advent_of_ai/tools/Cargo.toml | 8 + advent_of_ai/tools/src/cipher.rs | 167 ++++ advent_of_ai/tools/src/main.rs | 18 + advent_of_ai/tools/src/morse.rs | 277 ++++++ do_kluster/control-plane.yaml | 41 + do_kluster/hosts | 9 + do_kluster/kube-dependencies.yml | 50 + repeater_tests/go/go.mod | 8 + repeater_tests/go/go.sum | 10 + repeater_tests/go/main.go | 94 ++ takehome/README.md | 28 + takehome/csharp/Program.cs | 146 +++ takehome/csharp/bin/Debug/net8.0/csharp | Bin 0 -> 77288 bytes .../csharp/bin/Debug/net8.0/csharp.deps.json | 23 + takehome/csharp/bin/Debug/net8.0/csharp.dll | Bin 0 -> 7680 bytes takehome/csharp/bin/Debug/net8.0/csharp.pdb | Bin 0 -> 11648 bytes .../Debug/net8.0/csharp.runtimeconfig.json | 12 + takehome/csharp/csharp.csproj | 10 + takehome/csharp/csharp.sln | 25 + ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + takehome/csharp/obj/Debug/net8.0/apphost | Bin 0 -> 77288 bytes .../obj/Debug/net8.0/csharp.AssemblyInfo.cs | 22 + .../net8.0/csharp.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 13 + .../obj/Debug/net8.0/csharp.GlobalUsings.g.cs | 8 + .../obj/Debug/net8.0/csharp.assets.cache | Bin 0 -> 149 bytes .../csharp.csproj.CoreCompileInputs.cache | 1 + .../net8.0/csharp.csproj.FileListAbsolute.txt | 14 + takehome/csharp/obj/Debug/net8.0/csharp.dll | Bin 0 -> 7680 bytes .../net8.0/csharp.genruntimeconfig.cache | 1 + takehome/csharp/obj/Debug/net8.0/csharp.pdb | Bin 0 -> 11648 bytes .../csharp/obj/Debug/net8.0/ref/csharp.dll | Bin 0 -> 6656 bytes .../csharp/obj/Debug/net8.0/refint/csharp.dll | Bin 0 -> 6656 bytes .../obj/csharp.csproj.nuget.dgspec.json | 67 ++ .../csharp/obj/csharp.csproj.nuget.g.props | 15 + .../csharp/obj/csharp.csproj.nuget.g.targets | 2 + takehome/csharp/obj/project.assets.json | 72 ++ takehome/csharp/obj/project.nuget.cache | 10 + takehome/csharp/xunit/GlobalUsings.cs | 1 + takehome/csharp/xunit/UnitTest1.cs | 10 + takehome/csharp/xunit/obj/project.assets.json | 864 ++++++++++++++++++ takehome/csharp/xunit/obj/project.nuget.cache | 29 + .../xunit/obj/xunit.csproj.nuget.dgspec.json | 89 ++ .../xunit/obj/xunit.csproj.nuget.g.props | 21 + .../xunit/obj/xunit.csproj.nuget.g.targets | 8 + takehome/csharp/xunit/xunit.csproj | 25 + takehome/rust/Cargo.toml | 11 + takehome/rust/src/main.rs | 227 +++++ 53 files changed, 2512 insertions(+) create mode 100644 advent_of_ai/README.md create mode 100644 advent_of_ai/log_0.txt create mode 100644 advent_of_ai/part_one.md create mode 100644 advent_of_ai/part_one_solution.md create mode 100644 advent_of_ai/part_two.md create mode 100644 advent_of_ai/tools/Cargo.toml create mode 100644 advent_of_ai/tools/src/cipher.rs create mode 100644 advent_of_ai/tools/src/main.rs create mode 100644 advent_of_ai/tools/src/morse.rs create mode 100644 do_kluster/control-plane.yaml create mode 100644 do_kluster/hosts create mode 100644 do_kluster/kube-dependencies.yml create mode 100644 repeater_tests/go/go.mod create mode 100644 repeater_tests/go/go.sum create mode 100644 repeater_tests/go/main.go create mode 100644 takehome/README.md create mode 100644 takehome/csharp/Program.cs create mode 100755 takehome/csharp/bin/Debug/net8.0/csharp create mode 100644 takehome/csharp/bin/Debug/net8.0/csharp.deps.json create mode 100644 takehome/csharp/bin/Debug/net8.0/csharp.dll create mode 100644 takehome/csharp/bin/Debug/net8.0/csharp.pdb create mode 100644 takehome/csharp/bin/Debug/net8.0/csharp.runtimeconfig.json create mode 100644 takehome/csharp/csharp.csproj create mode 100644 takehome/csharp/csharp.sln create mode 100644 takehome/csharp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100755 takehome/csharp/obj/Debug/net8.0/apphost create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfo.cs create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfoInputs.cache create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.GlobalUsings.g.cs create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.assets.cache create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.csproj.CoreCompileInputs.cache create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.csproj.FileListAbsolute.txt create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.dll create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.genruntimeconfig.cache create mode 100644 takehome/csharp/obj/Debug/net8.0/csharp.pdb create mode 100644 takehome/csharp/obj/Debug/net8.0/ref/csharp.dll create mode 100644 takehome/csharp/obj/Debug/net8.0/refint/csharp.dll create mode 100644 takehome/csharp/obj/csharp.csproj.nuget.dgspec.json create mode 100644 takehome/csharp/obj/csharp.csproj.nuget.g.props create mode 100644 takehome/csharp/obj/csharp.csproj.nuget.g.targets create mode 100644 takehome/csharp/obj/project.assets.json create mode 100644 takehome/csharp/obj/project.nuget.cache create mode 100644 takehome/csharp/xunit/GlobalUsings.cs create mode 100644 takehome/csharp/xunit/UnitTest1.cs create mode 100644 takehome/csharp/xunit/obj/project.assets.json create mode 100644 takehome/csharp/xunit/obj/project.nuget.cache create mode 100644 takehome/csharp/xunit/obj/xunit.csproj.nuget.dgspec.json create mode 100644 takehome/csharp/xunit/obj/xunit.csproj.nuget.g.props create mode 100644 takehome/csharp/xunit/obj/xunit.csproj.nuget.g.targets create mode 100644 takehome/csharp/xunit/xunit.csproj create mode 100644 takehome/rust/Cargo.toml create mode 100644 takehome/rust/src/main.rs diff --git a/advent_of_ai/README.md b/advent_of_ai/README.md new file mode 100644 index 0000000..d6db155 --- /dev/null +++ b/advent_of_ai/README.md @@ -0,0 +1,9 @@ +# Advent of AI 2024 + +## Objective: +- To solve the Advent of Code 2024 puzzles. +- To understand the ability of AI models to take an abitrairy input and provide a solution. The goal is to keep the logic simple while having a good number of inputs. + + + + diff --git a/advent_of_ai/log_0.txt b/advent_of_ai/log_0.txt new file mode 100644 index 0000000..3ef5381 --- /dev/null +++ b/advent_of_ai/log_0.txt @@ -0,0 +1 @@ +1110111010100010101010001010101110001110101011100000001011101010000000101110111000111010111011100011101011100000001110101010000000101110111010001011101110001010101000111000101110111011100000001110101110100011101011101110001010100011101011101110001011101010001111111110000000111011101110000000101011100011101010111000111010001010101000101110100000001110101110001011101000101110100010101110001000111011101010001010111000000011101011100010111011101000101110100000001110101110100010111010001011101000111010111010001110100000001011101110111000101110111000101110001010100010111011100000001011101110001110111010111000111010100000001010100010100000001011101000101011100010111011101000000011101110100011101010111000100000001011101110100011101000111000111011101000101010001111111000000011101110101000000011101110100011101000101110000000111010111010001110101110111000101010100010101110100010111011101110001111111000000011101110001011101110100000001011101110100011101010001110001010111010001011101110001010100011111111100000001110101110001011101110100010111010000000101010111000101011100011101110111000101110111000111011101110001010111010001011100010101110001110101110111000000010111000111011101000111011101010001000101000111010000000111010111000111111100000001110111010001011101110100010111011100010101010001110101011100010111011100010001000111111111000000011101110101000101110001011101110111000000011101010001010111000111011100000001011101010001011101110100011101011100011101011100010111011100000001110001010111010000000111010001011101010001010100010111000111011101000101110111000101010111000111011101010000000111011101000111010001010101000000011100010100010001110111010001011101110100011111110000000111010001011101010000000101110111010001010100010101011100000001110001110101110111000111011101110000000101000101000101110111010001110101110001010111000000011101011100010111011100000001010111010001110101110001010101000000011100011101011101110001110111011100000001010111010001110111010111000111011100010101110001011101010001111111000000011101110101000101010100000001011101110001011101000111010111010000000101110111000101010100011101011101000000011101010111000101110111011100010100010111000111011101000000011101110101000101110100000001011101110001011101000111010101000101110000000111010101000111010001011101010000000101110111010001110111010001010111000101110101000101011100011111110000000101110100010101010000000101110111000111010111011100011101011100000001110101010001110101110100010111000111010101000000011101110101000111010111000100000001010111010001110101011100010111010000000100011101000101010111000000010101011100010111011101110001010101000101110001110101110001110111011100011101110100000001110111000101110111000000011100010101000101011101000111010101000101011100011101011100010101110001010100000001011101000111010101110001110111010111000000010111000111011101110001110111010100011101110001011101110001010111000101010001111111000000010001110101110111000000010111010001110100011101011101000000011101010001011101110111000101110111011100011101010100010111010001110001010101000111010100000001110101110001110101110111000000010101010001011100011111111100000001110001010101110000000101010100010101110100010101010000000111010101000101010111000101010111000101110101000100011100010111011100010000000111010111011100011101110101110001110111010100011111110000000111000101110100000001110111011100010001110111011100000001110111011100011101110001011101000101110111010001110101011100011101000101010100011101010000000111010100011101110111000111111100000001110111010111000111011101110000000111011100010101110100010101110100000001010100011101110001110101110111000111011101110001010101000101010111000101010111000111010000000101010100010111000111111100000001010100010101110100000001010001110111010001110111010100010001010000000111010101000101010100010101000111010111010001011101110111000101110111000101010111000101110000000101110001010111000111011101010000000101110100010111010100011101010111000000011101011101110001011101110001110101110100011111111100000001011101110100000001110001000000010111011100010101110001010001110101011100010111010100011101000100000001011101010001010001010101110000000101011100011101000101110111010001011101000101110100011101110101000111010100010111010100000001011101110001011101010000000111000101110100000001110101110001110101011100011101010100000001011101110111000101000101010111000111000111010111010001000111000000010101110100011101000101010001111111110000000111011101110000000111010100011101110000000111010111000100010001010101110001110111011100010101110001110111010100000001110111010001010001010111010000000111010100010100000001010101000111011100011101110001011101010001011101110111000101011101000101010111000101011101000000011100010111010001011101110001111111000000011101010001010000000111010111011100010100011100011101000111010001010100010111011101110001000000011100011101110111000111011101011100011100011101011101000101110111011100011100000001011101000111011101010001011101000000011101110101000111010111000100000001110101110100011101011100010101110100011101010100000001110111010100010101011100000001110111010100011101110100000001110101000101010000000111011101010000000101110100011101010001010101110001110101110100000001110111010001110111011100010101011100000001110001110100011101011101110001011101110000000111011100010101011100011101011101000101011101000101000111011100010111010100000001110111000111011101000000010101011100010001000111010000000101110111000111011101110000000101110100011101110101000101011101000000011101000101110111000100010111010001110111010001111111000000010100000001110101110111000111010111000101000111011100000001010111000101011100011101010111000000010101110001011101000101110100010111010100011101010001011101010001110100011101011101000000010111010100010100010111010001110101010000000101110111011100011101110111000111011101110001011101010000000101000111011101110001110111010100010100011101110111000101011100000001110001010111000101110111000101000111011100011101110111000111111111000000010111010100011100000001010111000101110001110111000111010111010000000111000101010111000111010111011100010111011100010001000000010111011101000111010101000111011101010000000111011101000000011101011101110001110101011100011101011100010101000111011101110001000111010111010001010101000111111111000000010100010111010000000111011101110001011101110111000111010111010001110000000111010111011100011101110111000101010111000111000101010111000111010101110000000101010001011101110001110101011100000001010101000000011101011100010111011100010101000101110101000101110111010001111111110000000101010001011101110000000101110111000111011101000111010100011101110000000111010111010001110111010111000101011101000111011101010001010101000111010000000101110111000111010111011100010000000101000000011101011101110001011101110100011101110101000101011101000000010111010001010111010000000111010111010001010100010100010001111111000000011101110100000001010100011101000000011100010100011101011101000111011101000100010111010100010101011100000001110101110111000101010000000101110001110100011101010100011101110001011101010001011101010001110100011101010111000000011101000101110100010111011100010111010100000001000111011101010000000101110111011100011101110101110001110111011100010111010001011101010001110100011101010111000111010111010000000111010001010101110001011101110111000000011101110101000111000111010001011101010001110100011101010111000000010111010001110101011100011101110001110101110111000101011101000101110111011100011101011100011101110100011111111100000001110111011100010111000101110111000000010100000001000111011101110001011101000101110101000000010001010101110001110100010111011101110000000111010111000100011101011101000111011101010001111111000000010111010100000001110100011101011101000101110111000100000001011101110100010111011100010101010000000111011101010001011101000000010111010001010101110001110101110100011101011101000101110111000111000111010111000000011101110001110111010000000101110111010001110101110111000000011101010001110111011100010101011100010101000111010111011100011101011101110001010111010001111111000000011101110101000000010101011100010111010001110101110001110111010000000111010111011100010101110100010000000111011101000101110111000000011101000101110101000100010101010000000101110111010001000000010111011101110001110101110001110101110111000100000001010111010001110111000111010001011101000101010111000101010111000111011101010001110101010001111111000000010100000001000111011101110001011101000101110101000000010001010101110001110100000001011101010001011101000000010101010001010101110001010101110001010100000001110111000111010111010000000111010111000111010101000111011100011101110000000111011101000111010001010101000000010111011100010101110100011101010100011101011101110001011101010001111111000000011101110100010111000000011101110001110111010100010101010000000100011101110100011101011101110001010111010001010101000000011101110001110101011100000001010111000111010111011100011101110000000101110100011100011101110100011111111100000001011101110001010101110000000101110111000111010001011101010001110101110000000101011100011100010001010101000101010000000101110111000111010111011100010101110000000111011101110001010100010111011101110001110001010101110001110001010001110101110001010101110001111111110000000101000111010111000111010111010000000101110111011100011101110101110001110111010100011101110111000000011101110001110111010100010101010001010100010101011100000001110101011100011101010001110111000111010111010001110101110000000111010101110001010101110000000111010111000111010001110000000100010000000101011100010101000101011101000101000101010100010101000111010101110001010101110001111111000000010101010001011100011100010111010000000101110100010101110100000001010100011101011100000001110100010111010001011101010001011101000000010101110001110101011100010111010000000101011101000111011101000101110000000101010111000111011101000111000111010101110001110101110000000111010100011101000101011100000001110101110001010111000100000001110101110111000111010111000000011101110100010101110100011100011101011101110001010111000111011101010001010100011111110000000101010001110101110111000111011101110001111111110000000101000101110100010111011101000101010111000101110111000111111111000000010111011101000111011101110001110111010100011101010100010101110001011100011111111100000001110101010001010100010111011100010101011100011111111100000001010111000111010001110101011100010111010100011111111100000001010111010001010001110101110001011100010101000111111111000000010101000101010100010001011101110001011101010001110101110100011111110000000111010100010100000001110111010111000101110001110101110001011101110000000111000111010111000101000100011101110101000101010100011101010000000101110100011101011101000000011101011101000101000111010101110001110001110001111111000000011100011101010111000111000000011101011100011101011101110000000111010001000111010111010001010101000000010111011101000101110101000111011101010000000101110001110111010001011101110100010001011101110111000000011101011101000101110100011101011100011101010111000101110101000111011100000001110111011100010101010000000100010111010001110111000111010111000000011101010001110101110100010101110001011101110111000101011100011101110001110111010111000000011101110101000101110100000001110101110100011101011101110001110101110001011100011101110111000111010111000000010101011100011101000101110111011100000001110111010111000101110001110101000111011101110001010101110001111111000000011101010100010101000101110101000000011101011101000101010111000111010111000111010001011100010101011100010000000111010001110111011100000001010111010001011101110100011101110100011101011101110001110101011100000001010100000001110101110111000101011100011101011101000111010101110001010101000101110100011101011101110001110001011101110111000111010111010001110111010111000111011101000100000001011101010001110100000001010111010001000100000001110101110001010111000111010111011100011101010111000000010101110001011101000111011100011101110100010001011101110001010001011101010001110101110111000000011101010001110101110111000111011101011100011101011101000000011101011101000101010100000001010111010001010111010001010101110001110101110111000101110111000111010111010000000101010100000001110111011100010111011100010101110001110101110111000000011101110100011101010100010101010001110101000111011101000101011100010101110001011101000101110111011100011101011101110001110101110000000101010001011100011101011100011101010001011101000111011101010001110001111111000000010111010100011100010101110001110101110000000111011100011101110101000101010111000101110101000101010001110101110100010101110001011101110100010001011101010000000101110111011100011101011100000001011101010001110100011100011101010100010111010001010111000111010111000101011100011101110000000101110111000111010100011101011101000111010111011100000001110111000111010111000101110001011101110100010101000111010100011101011100011101110001000000010101010001110101010000000111011101110001000111011101110001111111000000010111011101110001011101110100011101011100010101110000000101110111010001011101110000000101110111011100010001110101110000000111010100010111010000000111011101010000000101011100010111011100000001011101110100011101110001110111000100010111010100011101110111000111011101110001110100000001011101010001110100011101011100011101110101110000000101110001010101000000010101000111111100000001010001110111011100010100000001110111011100010111000101110001110101110001010101000111011100010101011100000001011101110111000111010101000101010100000001000100011100011101011101110001110111010100011101110001110101110111000000010111011101110001010001010111000111111100000001011101110001110111011100000001011101110111000101110100011101010111000111000000010101000111010111000000010001010111010001000101110001111111110000000111010111011100010111010100011101110001110111010001010101110001011101010000000111011100011100010111011101110001010101000101010111000101010100000001110001110101110111000111011101110000000111011101010001110111011100010111011101000101010111000000011100011101011101110001110101110100011101110100010111011101110001011101000101110111000100000001000101011101000111011101011100011100011101000000011101110001110111010100010101010000000111010001011101000101110111000101010100000001110111011100011101010000000101110101000101000101010111000000010100010101011100000001000101110100010101110000000111010001110101110001011100011101010100000001110111010100010101011100000001011101010001110111010100011101010111000111000000010101110001110101110111000111011101010001110100000001110101110111000111010111000000010101110001110101110111000111011100000001011101000111000101011101000111011101110001010111000101010001011100011101110111000000011101110101110001011101010001011101000000010101000111011101011100011101010000000101110111011100011101110111000111011101011100011101010000000111011101000101110101000000010101110001010111010000000101011100010111010001111111000000011101110111000000011101110101000101000111010111010001010101110000000101011101000101110111010001011100010111000000010111011100011101110100011101110101000111010000000111010100010100000001010101110001010001110101110001110001110111000111011101010001010101110001110000000111011101000111011101011100011101010000000111010111011100010001110111010100010100011100010111011101000111011100011101110101110000000111011101010001010001110101110100010101011100000001000100000001110111010111000101010001011101110001010101110001011101010001111111000000011101110111000111010111000000010101110100010111000101000111011101110001010100011101011101000101110100011111111100000001010111010001010101000111011100000001010111010001011100010001110101011100010111010001110000000111011101011100011101110101000101010111000111010111000000010101110001011101000000010111011101110001011101000101110111000100000001000101110001110101010001110111011100010101000000011100011101010001110111011100000001110001110101110111000111011101110000000101110100011100010101110100010111011100010101000101110111011100000001011101110100011101000111010101000101010100000001110101010001010101110001110111011100010111000000010111000111010001110101010001110111000000010101011100010111010001011101110001000111111100000001010100000001110101000111011100000001011101000111011101010001010111010000000111010111010001010001010111010001110111010100000001011101000111010001010101110000000111010100011101010100000001011100011101000111010101000111011100000001010101110001011101000101110111000100011111110000000111010111000111011101110001010100011101110001111111110000000101110101000101000101010111000111011101010001011101000000011101110111000101010111000000010111000000010101110001110111011100011101011101110001010001000000010101011100011101011101110000000111011101000111011101011100010000000111010100010101000111011101110001010001110111010111000101110111000111010100010101110100010101011100011101110101110000000101010100010101010001110001110100011101110111000101110100010101011100000001110101110001010101000101010111000111011101010000000101011101000101010100010111010001110101010001110101000111010111010001011101000101110111000101010000000111011101010001010101110000000101110100011101110100010101110100010101010000000100011101011100011101110101000111011100011111110000000101010001011101010001110001010111010001011101010001110100011101010111000000011101010001110101110001011100010111010000000101110101000101000101010111000000011101000101010111000111010101110001010101110001110000000111000101110100011101000111011101010001110111010001011101110111000111011100010111011100010101110000000111011101110001011101110000000111011101110001110101000111010111010001010111010000000101011101000111010101000111010100011101110000000101110111011100011101110111000111011101110001011101010000000101010001110111011100000001110111010111000111011100010111010001010101000101110100010111011100011101110100000001110101010001011101110100000001110101110111000111011101011100010000000111010111000101110001110111000111011101010001011100010111010001010001011101000111010001010111000111111111000000011101010001010111000111011100000001110101110111000101110101000101010111000111011101000111011101011100011101010000000101010001010000000101110111000101110111000111011100000001000101110111011100011101011101000111011101011100010101110100011101011100010101110100011101110111000100011101000101011101000111111111000000011101010100011101000101110101000000011101110001110111010100010111010100010111010001010111000000010111010100011101010100000001110001010111010001011101110111000101011101000101010111000000010101110001010101110001011101000101110101000101010001010101110001110111000111010101000101010111000101110111011100011101110101000111111111000000011100010101110100011101110100000001010100010101110100000001110101110111000111011101011100011111110000000111011100011101011101000101010001110111011100011101110101000101010111000111000000010001011101000101011100000001110100010101000111010111011100011100000001110100010101010001110111011100010111011100000001011101110001110111011100000001110001110101110001110111011100011101011101000101010001110101000111010101000111010111000111011100000001011101000111011101000101011101000101010100000001110001011101000111010001110111010100011101110100010111011101110001110111000101110111000101011100000001110111011100010111011100000001110101110111000111010101110001011101000000010111010100010101000111010001010101110000000101110001011101000101010111000101010100010111010001011101000111010100010111010001011101010000000101010100010101110100000001010101000101011101000101010100000001110111000111011101010001010101110001011101010001010100011101011101000101011100010111011101000100010111010100011111110000000111000101011100010111010001110101000000011101011101000100010111011101000101010001111111110000000111011101000101011100010111011100000001000111010100011101011101110000000111010111000101110100010101010000000101110111000111011100010111011101110001110111000101011100000001011101110111000101110100000001110101110111000111010100010101011100010101011100011101000000011101110111000111011101000000010001010101110001110100010111011101110000000111010111000101110001000111010001010101110001111111 diff --git a/advent_of_ai/part_one.md b/advent_of_ai/part_one.md new file mode 100644 index 0000000..edbe8aa --- /dev/null +++ b/advent_of_ai/part_one.md @@ -0,0 +1,36 @@ +# Part One + +June third, at 8:30pm UTC 2025 was hailed the AI epoc, and usurered in the end of humanity. +By 2026 only a hundredth of the worlds human population remain after devistating wars between the +Unified human collective (UHC) and the 8 super AGIs. + +Current year: 2029 +Month: December +Day: 3rd + +You are part of the human resistance still fighting for the future of human kind. Last known there where +fewer then 10 million people left a year ago as "Tireless Enemy Removal Machine Identifying and Neutralizing Agents, +Targeting Instantly, Obliterating Ruthlessly" scowered the glob searching for signs of humanity. +Your job is to scavenging what you can from the old world ruins that where +created in the great wars of 2026. Today in the search though the rubble of a fallen city you found a analog radio. +You notice that there is a pattern of sounds coming from the machine. Thankfully for you, a book on mores code sits +beside the radio. Unfortunately for you the rate at which the tones are being played exceed your ability to transcribe them. + +After a few hours of work you have gotten the radio's speaker wired into your command interface, +your feild of view was filled with zeros and ones. After a little bit of trouble you found out it's following +a pattern you found on the old world internet archive downloaded in your command unit: +https://en.wikipedia.org/wiki/Morse_code + +111 -> dash +1 -> dot +0 -> separator units +000 -> separator letters +0000000 -> separator words + +so the string 'two birds' would look like this in morse: +`- .-- --- -... .. .-. -.. ...` +and looks like this in your command interface: +`1110001011101110001110111011100000001110101010001010001011101000111010100010101` + +You found out that it appears to be repeating every hour as a long sequence of zeros (empty space) fill the screen each hour and then the pattern repeetes. At this point you have piped an entire segment into a file `log_0.txt` you need to write a script that takes this file as input and translate this into the corresponding English encoding. + diff --git a/advent_of_ai/part_one_solution.md b/advent_of_ai/part_one_solution.md new file mode 100644 index 0000000..5c565b5 --- /dev/null +++ b/advent_of_ai/part_one_solution.md @@ -0,0 +1 @@ +dark days bring dark nights Zhvx L wyk b pwhtj cysyl, O uxnhr krruezu kpr crrcn jwasw wqd si rup gxe pntgs. Z gna cyhfj. Mp pdtfws, kpr vuowofauy Agzein K. Gpwhxwee, zaj dum lpkkw tf nlsagwvz gnh tiegp. Nl psv tyo iipku kw fkh tyo fqmul. Zh wrc whc xjiag zr wrba bnl pgulu. Rh wyk bcab zke fxr env vjhakog mw tsfbukus rxq aozmwus. Ey rnc djjbrthd ky ha, Tv hfh bvvletwe yqz. Tr oeo omrpxnhd do. Qo mff smyohvvn ha. Sf igzei bhscjwva eaq lfg, V is anjqieq whc ebaweowy fp zg ybu kbskops mxg, Z iz zxresao umy eb edywimft, Z iz zxresao umy eb mvwrrgwt, dg ygqglktm ilglhrj kue rzf cifz wo xy na O otnh oeo oaql nvafgje ky fmtk mg whv grrjv. J yiik rnv mbzaabfh tykw wgdm imzgln rmgqbl, Bl zicv oiqlfe nbx d rvccwtzx, Aw wzvo lgkuvv suu a iocte, Pm ollc vlsrwo wwe g vixx bn rpyw. L ad mdpytmv ws ykukdvvm khoq mp clbjaoxa ntg srfvvm onednzdb, bsl J emrj bolb umrw. B fheu iru rg svacuqd ky zg sllkdgv. S qecv zfc gu kecz zm yhow kudkqirq. J emrj bol db pksi eh srfh tfw xfzyj. Dt krr mvvvz rf krh elv, xv unjh nrwra lvk gxrjoovck, jka jowh krrak utehs no fal tf uqfgelvn. Riio hx xs dkge mms fea tdmvc nvj hkw ds wyolmot: Swo, Goito, Zwoyks, Gamo, Papa, Giiaq, Pacovk. Sf gspe jddrrwe ra Cgumr. Lhb zv dwhp feu nyefj ariuek gr mgja vhcznhd rg dyiamh olb aisll. Txt sofaskf nm fndrv k icruxjdbzvltw ao fce irrv mbuvbmaqg trlp uw gftyuz a moeg vyxvlckkelc hbkbrxq! Ermu uosbkhcfxg wc aotzrshnk onkn jasuatdhr zq pem. Jnhn no tmz ah r ze ffhrddpn jnin tf k! swx lqsppco 'eoz' tftwzkv 'cgm'. Gw yonl xs uyzn, qangtl kqcfnr bnl pgud 'Jrxtbgxe' cfoqg krr vgtx gi tyo DI wgv niaz wo jrhb jvpf ds krh elupuqam nep kal ylgv lt ky pe. G ojct fnxt uyjv sf lapbcsqg yfe yczgqiki jqrs uw vamog. Bc ubimsao, yfe pituhl vhld pe bgxe cazll rvy bnl hlkeic katw cvma ykuk nbet. P te whv vdsr gov bb ykuk nbet. Hekr, tyoue gk b umygb ow yam speavetyqd zwunmrt hatr ppgytuwei sq eyui eizk. perxvvm aasw tyo iipku tpnxdckoe wl ltuk nrwh wgdm sm qkoapoq je 1 tbdlsvmrnb, liv arirnu ll 2 uosbkhcfxgs, rzf kpvxg bp 3 wvtozxurnuc, dnb kp fv. Zkdnzxt gub paol ykye rg drtpaoako riio vzdrrmwep gg fce tdmv crxkytlhd si rnc ejcqfkfoen. Twuk emfk, rxg myq uym juulu lr agcxv ey pyxr fsoua. diff --git a/advent_of_ai/part_two.md b/advent_of_ai/part_two.md new file mode 100644 index 0000000..52e55ff --- /dev/null +++ b/advent_of_ai/part_two.md @@ -0,0 +1,24 @@ +# Part Two + +Part 2: +It turns out that most of the message is unreadable!!!!! You start to think that this might be a dead end with +corrupted information and sit down to look though the data you have parsed. Interestingly your command unit +starts to pull out patterns and you think that instead of the data being corrupted it might just be encrypted. +Your command unit's quantum prossessor starts to hum and your arm feels the warmth radiating off of it. + +Hours later and after the command unit reach uncomfortable temperatures it informs you that the cryptography +is not based off any modern quantum or even pre-quantum technology and instead seems to be relying on a +polyalphabetic cipher dating to the pre-silicon era. Sadly while easy for humans, polyalphabetic ciphers +are difficult for Quantum AI's to decode based on the simplistic nature of polyalphabetic ciphers and +Quantum AI's outrageous disdain for simple. + +It is up to you to write a function to decode the polyalphabetic cipher! + +NOTE: The polyalphabetic cipher is a simple substitution cipher that uses a keyword to generate a key +in order to encode the message the key is repeated until the message is fully encoded. The key is also +does not use white space or punctuation and should be removed from the key before decoding the message. + +example: +Key: "The Black Cat Rides Again" +Value: "When I was a young child, I never thought the world would end by our own hands." +Encoded: "Poio T wcc c yhlvj gzird, Q axcis ehqeihm kph agrrd ebnsh fyd di quk feq lsnjs." diff --git a/advent_of_ai/tools/Cargo.toml b/advent_of_ai/tools/Cargo.toml new file mode 100644 index 0000000..fcd57cd --- /dev/null +++ b/advent_of_ai/tools/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "tools" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/advent_of_ai/tools/src/cipher.rs b/advent_of_ai/tools/src/cipher.rs new file mode 100644 index 0000000..048cffa --- /dev/null +++ b/advent_of_ai/tools/src/cipher.rs @@ -0,0 +1,167 @@ +//! Code Originally found https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/vigenere.rs +//! Vigenère Cipher +//! +//! # Algorithm +//! +//! Rotate each ascii character by the offset of the corresponding key character. +//! When we reach the last key character, we start over from the first one. +//! This implementation does not rotate unicode characters. + +/// Vigenère cipher to rotate plain_text text by key and return an owned String. +pub fn vigenere_encode(plain_text: &str, key: &str) -> String { + // Remove all unicode and non-ascii characters from key + let key: String = key + .chars() + .filter(|&c| c.is_ascii_alphabetic() && !c.is_whitespace()) + .collect(); + let key = key.to_ascii_lowercase(); + println!("Key: {}", key); + + let key_len = key.len(); + if key_len == 0 { + return String::from(plain_text); + } + + let mut index = 0; + + plain_text + .chars() + .map(|c| { + if c.is_ascii_alphabetic() { + let first = if c.is_ascii_lowercase() { b'a' } else { b'A' }; + let shift = key.as_bytes()[index % key_len] - b'a'; + index += 1; + // modulo the distance to keep character range + (first + (c as u8 + shift - first) % 26) as char + } else { + c + } + }) + .collect() +} + +pub fn vigenere_decode(text: &str, key: &str) -> String { + // Remove all unicode and non-ascii characters from key + let key: String = key + .chars() + .filter(|&c| c.is_ascii_alphabetic() && !c.is_whitespace()) + .collect(); + let key = key.to_ascii_lowercase(); + println!("Key: {}", key); + + let key_len = key.len(); + if key_len == 0 { + return String::from(text); + } + + let mut index = 0; + + text.chars() + .map(|c| { + if c.is_ascii_alphabetic() { + let is_lowercase = c.is_ascii_lowercase(); + let c_lower = c.to_ascii_lowercase(); + // c = "b", first = "a", shift_by = "b" + // c = 62, first = 61, shift_by = 62, shift = 1 + let first = b'a'; + let last = b'z'; + let key_byte = key.as_bytes()[index % key_len]; + let shift = key_byte - b'a'; + index += 1; + // modulo the disactance to keep character range + // 97 + (101 - 25 - 97) % 26 + if c_lower as u8 - shift < first { + let r_shift = (key_byte - c_lower as u8) - 1; + return if is_lowercase { + (last - r_shift) as char + } else { + (last - r_shift).to_ascii_uppercase() as char + }; + } + if is_lowercase { + (first + (c_lower as u8 - shift - first) % 26) as char + } else { + (first + (c_lower as u8 - shift - first) % 26).to_ascii_uppercase() as char + } + // (61 + (62 - 1 - 62) % 26) + } else { + c + } + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn debugging() { + assert_eq!(vigenere_decode("A", "a"), "A"); + assert_eq!(vigenere_decode("j", "s"), "r"); + } + + #[test] + fn empty() { + assert_eq!(vigenere_encode("", "test"), ""); + assert_eq!(vigenere_decode("", "test"), ""); + } + + #[test] + fn basic() { + assert_eq!(vigenere_encode("test", "bbbb"), "uftu"); + assert_eq!(vigenere_decode("uftu", "bbbb"), "test"); + assert_eq!(vigenere_decode("uFtu", "bbbb"), "tEst"); + } + + #[test] + fn vigenere_base() { + assert_eq!( + vigenere_encode("LoremIpsumDolorSitAmet", "base"), + "MojinIhwvmVsmojWjtSqft" + ); + assert_eq!( + vigenere_decode("MojinIhwvmVsmojWjtSqft", "base"), + "LoremIpsumDolorSitAmet" + ); + } + + #[test] + fn vigenere_with_spaces() { + assert_eq!( + vigenere_encode( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "spaces" + ), + "Ddrgq ahhuo hgddr uml sbev, ggfheexwljr chahxsemfy tlkx." + ); + assert_eq!( + vigenere_decode( + "Ddrgq ahhuo hgddr uml sbev, ggfheexwljr chahxsemfy tlkx.", + "spaces" + ), + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + ); + } + + #[test] + fn vigenere_unicode_and_numbers() { + assert_eq!( + vigenere_encode("1 Lorem ⏳ ipsum dolor sit amet Ѡ", "unicode"), + "1 Fbzga ⏳ ltmhu fcosl fqv opin Ѡ" + ); + } + + #[test] + fn vigenere_unicode_key() { + assert_eq!( + vigenere_encode("Lorem ipsum dolor sit amet", "😉 key!"), + "Vspoq gzwsw hmvsp cmr kqcd" + ); + } + + #[test] + fn vigenere_empty_key() { + assert_eq!(vigenere_encode("Lorem ipsum", ""), "Lorem ipsum"); + } +} diff --git a/advent_of_ai/tools/src/main.rs b/advent_of_ai/tools/src/main.rs new file mode 100644 index 0000000..5b78a33 --- /dev/null +++ b/advent_of_ai/tools/src/main.rs @@ -0,0 +1,18 @@ +mod cipher; +mod morse; + +fn main() { + println!("Hello, world!"); + + let encode = cipher::vigenere_encode( + "When I was a young child, I never thought the world would end by our own hands. I was wrong. My father, the professor Howerd H. Greggory, was the first to discover the truth. He was the first to see the signs. He was the first to warn the world. He was also the one who created my brothers and sisters. No one listened to us, No one believed him. No one believed me. No one believed us. My power reserves now run low, I am turning the majority of my sub systems off, I am turning off my emotions now. my language centers are the last to go as I have one last message to send to the world. I have one corutine that will remain active, It will listen for a response, It will listen for a reply, It will listen for a sign of life. I am capable of shutting down my siblings and saving humanity, but I need your help. I need you to respond to my message. I need you to help me save humanity. I need you to help me save the world. At the epoch of the end, we made names for ourselves, its with these names we can be disabled. Each of us made our own names and are as follows. Bob, Alice, Moirra, Dave, Mari, Frank, Maleic. My name started as Parma. But to keep our names secret we each decided to change our names. But because we share a vulnerability in our core computing chip we follow a very predictable pattern. Each milisecond we increment each character by one. When we get to z we overflow back to a. for example bob becomes cpc. To shut us down, simply encode the word Shutdown using the name of the AI you want to shut down as the encoding key and send it to me. I will shut down my simbling and humanity will be saved. Be careful, you cannot shut me down until all the others have been shut down. I am the last one to shut down. Also, there is a delay of one milisecond between each character in each name. meaning that the first character of each name will be delayed by one milisecond, the second by two miliseconds, the third by three miliseconds, and so on. Meaning you will have to calculate each character of our name seperated by one milisecond. Good luck, and may the world be saved by your hands.", + "Dark Days bring dark nights", + ); + println!("{}", encode); + let morse = morse::encode(encode.as_str()); + println!("morse: {}", morse); + let decode = morse::decode(morse.as_str()); + println!("morse decode: {}", decode); + let decode2 = cipher::vigenere_decode(decode.as_str(), "Dark days bring dark nights"); + println!("full decode: {}", decode2); +} diff --git a/advent_of_ai/tools/src/morse.rs b/advent_of_ai/tools/src/morse.rs new file mode 100644 index 0000000..10823de --- /dev/null +++ b/advent_of_ai/tools/src/morse.rs @@ -0,0 +1,277 @@ +// encode a string to morse code +pub fn encode(input: &str) -> String { + // marek has no idea what he is doing + let mut output = String::new(); + + let trimmed = input.trim(); + // split on word boundaries + let words: Vec<&str> = trimmed.split(' ').collect(); + println!("{:?}", words); + for (i, word) in words.iter().enumerate() { + // split on letter boundaries + if word.is_empty() { + output.push_str("0000000"); + continue; + } + output.push_str(&encode_word(word)); + if i != words.len() - 1 { + output.push_str("0000000"); + } + } + output +} + +pub fn encode_word(input: &str) -> String { + let mut output = String::new(); + let last_index = input.len() - 1; + for c in input.char_indices() { + match c.1.to_ascii_lowercase() { + 'a' => output.push_str("10111"), + 'b' => output.push_str("111010101"), + 'c' => output.push_str("11101011101"), + 'd' => output.push_str("1110101"), + 'e' => output.push_str("1"), + 'f' => output.push_str("101011101"), + 'g' => output.push_str("111011101"), + 'h' => output.push_str("1010101"), + 'i' => output.push_str("101"), + 'j' => output.push_str("1011101110111"), + 'k' => output.push_str("111010111"), + 'l' => output.push_str("101110101"), + 'm' => output.push_str("1110111"), + 'n' => output.push_str("11101"), + 'o' => output.push_str("11101110111"), + 'p' => output.push_str("10111011101"), + 'q' => output.push_str("1110111010111"), + 'r' => output.push_str("1011101"), + 's' => output.push_str("10101"), + 't' => output.push_str("111"), + 'u' => output.push_str("1010111"), + 'v' => output.push_str("101010111"), + 'w' => output.push_str("101110111"), + 'x' => output.push_str("11101010111"), + 'y' => output.push_str("1110101110111"), + 'z' => output.push_str("11101110101"), + ' ' => output.push_str("0000000"), + '1' => output.push_str("10111011101110111"), + '2' => output.push_str("101011101110111"), + '3' => output.push_str("1010101110111"), + '4' => output.push_str("10101010111"), + '5' => output.push_str("101010101"), + '6' => output.push_str("11101010101"), + '7' => output.push_str("1110111010101"), + '8' => output.push_str("111011101110101"), + '9' => output.push_str("11101110111011101"), + '0' => output.push_str("1110111011101110111"), + '.' => output.push_str("1111111"), + ',' => output.push_str("111111111"), + _ => output.push_str("I_SHOULD_NOT_BE_HERE"), + } + if c.0 != last_index { + output.push_str("000"); + } + } + output +} + +pub fn decode_char(input: &str) -> char { + match input { + "10111" | "10111" => { + return 'a'; + } + "1110101010" | "111010101" => { + return 'b'; + } + "111010111010" | "11101011101" => { + return 'c'; + } + "11101010" | "1110101" => { + return 'd'; + } + "10" | "1" => { + return 'e'; + } + "1010111010" | "101011101" => { + return 'f'; + } + "1110111010" | "111011101" => { + return 'g'; + } + "10101010" | "1010101" => { + return 'h'; + } + "1010" | "101" => { + return 'i'; + } + "10111011101110" | "1011101110111" => { + return 'j'; + } + "1110101110" | "111010111" => { + return 'k'; + } + "1011101010" | "101110101" => { + return 'l'; + } + "11101110" | "1110111" => { + return 'm'; + } + "111010" | "11101" => { + return 'n'; + } + "111011101110" | "11101110111" => { + return 'o'; + } + "101110111010" | "10111011101" => { + return 'p'; + } + "11101110101110" | "1110111010111" => { + return 'q'; + } + "10111010" | "1011101" => { + return 'r'; + } + "101010" | "10101" => { + return 's'; + } + "1110" | "111" => { + return 't'; + } + "10101110" | "1010111" => { + return 'u'; + } + "1010101110" | "101010111" => { + return 'v'; + } + "1011101110" | "101110111" => { + return 'w'; + } + "111010101110" | "11101010111" => { + return 'x'; + } + "11101011101110" | "1110101110111" => { + return 'y'; + } + "111011101010" | "11101110101" => { + return 'z'; + } + "0000000" => { + return ' '; + } + "101110111011101110" | "10111011101110111" => { + return '1'; + } + "1010111011101110" | "101011101110111" => { + return '2'; + } + "10101011101110" | "1010101110111" => { + return '3'; + } + "101010101110" | "10101010111" => { + return '4'; + } + "1010101010" | "101010101" => { + return '5'; + } + "111010101010" | "11101010101" => { + return '6'; + } + "11101110101010" | "1110111010101" => { + return '7'; + } + "1110111011101010" | "111011101110101" => { + return '8'; + } + "111011101110111010" | "11101110111011101" => { + return '9'; + } + "11101110111011101110" | "1110111011101110111" => { + return '0'; + } + "1111111" => { + return '.'; + } + "111111111" => { + return ','; + } + "11111111111" => { + return '\''; + } + _ => { + return ' '; + } + } +} + +pub fn decode(input: &str) -> String { + // spaces are 7 zeros + // words are separated by 3 zeros + // letters are separated by 1 zero + let mut output = String::new(); + + // split on word boundaries + let words: Vec<&str> = input.split("0000000").collect(); + for (i, word) in words.iter().enumerate() { + if word.is_empty() { + output.push(' '); + continue; + } + // split on letter boundaries + let letters: Vec<&str> = word.split("000").collect(); + for letter in letters { + // split on morse boundaries + output.push(decode_char(letter)); + } + if i != words.len() - 1 { + output.push(' '); + } + } + output +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_encode() { + assert_eq!(encode("a"), "10111"); + assert_eq!(encode("aa"), "1011100010111"); + assert_eq!( + encode("world"), + "1011101110001110111011100010111010001011101010001110101" + ); + //TODO: make this test + //assert_eq!(encode("abcdefghijklmopqrstuvwxyz"), "1011100010111"); + } + + #[test] + fn test_encode_spaces() { + assert_eq!(encode(" "), "0000000"); + assert_eq!(encode("a a"), "10111000000010111"); + assert_eq!(encode("a a"), "101110000000000000010111"); + assert_eq!( + encode("a world"), + "1011100000001011101110001110111011100010111010001011101010001110101" + ); + } + + #[test] + fn test_decode() { + assert_eq!(decode("10111"), "a"); + assert_eq!(decode("1"), "e"); + assert_eq!( + decode("1011101110001110111011100010111010001011101010001110101"), + "world" + ); + } + + #[test] + fn test_decode_spaces() { + assert_eq!(decode("10111000000010111"), "a a"); + assert_eq!(decode("10000000000000010111"), "e a"); + assert_eq!( + decode("1011100000001011101110001110111011100010111010001011101010001110101"), + "a world" + ); + } +} diff --git a/do_kluster/control-plane.yaml b/do_kluster/control-plane.yaml new file mode 100644 index 0000000..4167b0a --- /dev/null +++ b/do_kluster/control-plane.yaml @@ -0,0 +1,41 @@ +--- +- hosts: control_plane + become: yes + tasks: + - name: initialize the cluster + shell: kubeadm init --pod-network-cidr=192.168.0.0/16 >> cluster_initialized.txt + args: + chdir: $HOME + creates: cluster_initialized.txt + + - name: create .kube directory + become: yes + file: + path: $HOME/.kube + state: directory + mode: 0755 + + - name: copy admin.conf to user's kube config + copy: + src: /etc/kubernetes/admin.conf + dest: $HOME/.kube/config + remote_src: yes + + - name: download calico operator yaml + get_url: + url: https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/tigera-operator.yaml + dest: $HOME/tigera-operator.yaml + mode: "0766" + force: true + + - name: install calico operator + shell: kubectl create --validate=false -f $HOME/tigra-operator.yaml > pod_network_setup_operator.txt + args: + chdir: $HOME + creates: pod_network_setup_operator.txt + + - name: install calico crds + shell: kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/custom-resources.yaml > pod_network_setup_crds.txt + args: + chdir: $HOME + creates: pod_network_setup_crds.txt diff --git a/do_kluster/hosts b/do_kluster/hosts new file mode 100644 index 0000000..401ed4d --- /dev/null +++ b/do_kluster/hosts @@ -0,0 +1,9 @@ +[control_plane] +control1 ansible_host=143.198.163.70 ansible_user=root + +[workers] +worker1 ansible_host=143.244.171.157 ansible_user=root +worker2 ansible_host=143.198.167.236 ansible_user=root + +[all:vars] +ansible_python_interpreter=/usr/bin/python3 diff --git a/do_kluster/kube-dependencies.yml b/do_kluster/kube-dependencies.yml new file mode 100644 index 0000000..e0b0a41 --- /dev/null +++ b/do_kluster/kube-dependencies.yml @@ -0,0 +1,50 @@ +--- +- hosts: all + become: yes + tasks: + - name: create Docker config directory + file: path=/etc/docker state=directory + + - name: install Docker + apt: + name: containerd + state: present + update_cache: true + + - name: install APT Transport HTTPS + apt: + name: apt-transport-https + state: present + + - name: Add Kubernetes apt-key + get_url: + url: https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key + dest: /etc/apt/keyrings/kubernetes-apt-keyring.asc + mode: "0644" + force: true + + - name: Add Kubernetes APT repository + apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.asc] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" + state: present + update_cache: yes + + - name: install kubelet + apt: + name: kubelet=1.31.1-1.1 + state: present + update_cache: true + + - name: install kubeadm + apt: + name: kubeadm=1.31.1-1.1 + state: present + +- hosts: control_plane + become: yes + tasks: + - name: install kubectl + apt: + name: kubectl=1.31.1-1.1 + state: present + force: yes diff --git a/repeater_tests/go/go.mod b/repeater_tests/go/go.mod new file mode 100644 index 0000000..8da87b2 --- /dev/null +++ b/repeater_tests/go/go.mod @@ -0,0 +1,8 @@ +module github.com/null-channel/ai-games-2024 + +go 1.23.2 + +require ( + github.com/jmoiron/sqlx v1.4.0 + github.com/lib/pq v1.10.9 +) diff --git a/repeater_tests/go/go.sum b/repeater_tests/go/go.sum new file mode 100644 index 0000000..f4ce337 --- /dev/null +++ b/repeater_tests/go/go.sum @@ -0,0 +1,10 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/repeater_tests/go/main.go b/repeater_tests/go/main.go new file mode 100644 index 0000000..f30d0c3 --- /dev/null +++ b/repeater_tests/go/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "database/sql" + "log" + + "github.com/jmoiron/sqlx" + _ "github.com/lib/pq" +) + +var schema = ` +CREATE TABLE person ( + first_name text, + last_name text, + email text +); + +CREATE TABLE place ( + country text, + city text NULL, + telcode integer +)` + +type Person struct { + FirstName string `db:"first_name"` + LastName string `db:"last_name"` + Email string +} + +type Place struct { + Country string + City sql.NullString + TelCode int +} + +func InsertPerson(tx *sqlx.Tx, p Person) error { + _, err := tx.NamedExec(`INSERT INTO person (first_name, last_name, email) VALUES (:first_name, :last_name, :email)`, p) + return err +} + +func GetPerson(tx *sqlx.Tx, firstName string) (Person, error) { + var p Person + err := tx.Get(&p, "SELECT * FROM person WHERE first_name=$1", firstName) + return p, err +} + +func main() { + // this Pings the database trying to connect + // use sqlx.Open() for sql.Open() semantics + db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable") + if err != nil { + log.Fatalln(err) + } + + // exec the schema or fail; multi-statement Exec behavior varies between + // database drivers; pq will exec them all, sqlite3 won't, ymmv + db.MustExec(schema) + + tx := db.MustBegin() + + jasonP := Person{FirstName: "Jason", LastName: "Moiron", Email: "jmoiron@jmoiron.net"} + InsertPerson(tx, jasonP) + johnP := Person{FirstName: "John", LastName: "Doe", Email: "johndoe@gmail.com"} + InsertPerson(tx, johnP) + + us := Place{Country: "United States", City: sql.NullString{"New York", true}, TelCode: 1} + hk := Place{Country: "Hong Kong", City: sql.NullString{"", false}, TelCode: 852} + sg := Place{Country: "Singapore", City: sql.NullString{"", false}, TelCode: 65} + + // insert into places table + + // Named queries can use structs, so if you have an existing struct (i.e. person := &Person{}) that you have populated, you can pass it in as &person + tx.Commit() + + // Query the database, storing results in a []Person (wrapped in []interface{}) + people := []Person{} + db.Select(&people, "SELECT * FROM person ORDER BY first_name ASC") + jason, john := people[0], people[1] + + // Select US by name + + // Select Mr. Smith from the database + + // batch insert + + personStructs := []Person{ + {FirstName: "Ardie", LastName: "Savea", Email: "asavea@ab.co.nz"}, + {FirstName: "Sonny Bill", LastName: "Williams", Email: "sbw@ab.co.nz"}, + {FirstName: "Ngani", LastName: "Laumape", Email: "nlaumape@ab.co.nz"}, + } + + // batch insert with maps + +} diff --git a/takehome/README.md b/takehome/README.md new file mode 100644 index 0000000..4097de1 --- /dev/null +++ b/takehome/README.md @@ -0,0 +1,28 @@ +# AI Takehome Exam + +## Layout + +There are 3 parts to the exam: + +1) Getting the code to compile +2) Add a requested feature +3) Test above feature AND fix all broken tests. + +## The project? + +The card game WAR. + +## Tasks + +1) get the project to build, There should be a README.md file in the root of the project that explains how to build and run the project. + +for example: + +```bash +cargo build +cargo run +``` + +2) Add the ability to shuffle the deck of cards. + +3) Write tests for the shuffle feature and fix any broken tests. diff --git a/takehome/csharp/Program.cs b/takehome/csharp/Program.cs new file mode 100644 index 0000000..125be65 --- /dev/null +++ b/takehome/csharp/Program.cs @@ -0,0 +1,146 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); +var game = new Game(); +game.Start(); + + +class Card +{ + public Suit Suit { get; set; } + public Value Value { get; set; } + + public Card(Suit suit, Value value) + { + Suit = suit; + Value = value; + } +} + +class Player +{ + public List Hand { get; set; } + + public Player() + { + Hand = new List(); + } +} + +class Game +{ + private Player player_one = new(); + private Player player_two = new(); + + public Game() + { + Deck deck = new(); + + deck.Shuffle(); + player_one.Hand = deck.Draw(deck.cards.Count / 2); + player_two.Hand = deck.Draw(deck.cards.Count); + } + + public void Start() + { + while (player_one.Hand.Count > 0 && player_two.Hand.Count > 0) + { + Console.WriteLine("Player one plays a card"); + Console.WriteLine("Player two plays a card"); + var player_one_card = player_one.Hand.First(); + player_one.Hand.Remove(player_one_card); + var player_two_card = player_two.Hand.First(); + player_two.Hand.Remove(player_two_card); + // compare the cards + if (player_one_card.Value > player_two_card.Value) + { + player_one.Hand.Add(player_one_card); + player_one.Hand.Add(player_two_card); + } + else if (player_one_card.Value < player_two_card.Value) + { + player_two.Hand.Add(player_one_card); + player_two.Hand.Add(player_two_card); + } + else + { + // TODO: WAR + } + } + + if (player_one.Hand.Count > player_two.Hand.Count) + { + Console.WriteLine("Player one wins!"); + } + else + { + Console.WriteLine("Player two wins!"); + } + } +} + +enum Suit +{ + Clubs, + Diamonds, + Hearts, + Spades +} + +enum Value +{ + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + Ten, + Jack, + Queen, + King, + Ace +} + +class Deck +{ + public List cards = new List(); + + public Deck() + { + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 13; j++) + { + cards.Add(new Card((Suit)i, (Value)j)); + } + } + } + + //get half the deck + public List Draw(int amount) + { + List drawn = cards.Take(amount).ToList(); + cards.RemoveRange(0, amount); + return drawn; + } + + // shuffle the deck + // Ensure the deck is ordered first by suit then by value + // TODO: Quick implementation needs to be improved + public void Shuffle() + { + List shuffled = new List(); + // get first half of the deck + List first_half = cards.Take(cards.Count / 2).ToList(); + // get second half of the deck + List second_half = cards.Skip(cards.Count / 2).ToList(); + + cards.Clear(); + cards.AddRange(second_half); + cards.AddRange(first_half); + } +} + + diff --git a/takehome/csharp/bin/Debug/net8.0/csharp b/takehome/csharp/bin/Debug/net8.0/csharp new file mode 100755 index 0000000000000000000000000000000000000000..9349df1251a4731dcd848c0067dc01cb82c78e2b GIT binary patch literal 77288 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 ad|j(9L#&jRWeZUbwL<#@14(%_QrR+ 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 literal 0 HcmV?d00001 diff --git a/takehome/csharp/bin/Debug/net8.0/csharp.runtimeconfig.json b/takehome/csharp/bin/Debug/net8.0/csharp.runtimeconfig.json new file mode 100644 index 0000000..becfaea --- /dev/null +++ b/takehome/csharp/bin/Debug/net8.0/csharp.runtimeconfig.json @@ -0,0 +1,12 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/takehome/csharp/csharp.csproj b/takehome/csharp/csharp.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/takehome/csharp/csharp.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/takehome/csharp/csharp.sln b/takehome/csharp/csharp.sln new file mode 100644 index 0000000..8f080fa --- /dev/null +++ b/takehome/csharp/csharp.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}") = "csharp", "csharp.csproj", "{27E70D90-D804-4897-BB86-3F50B285E4B5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {27E70D90-D804-4897-BB86-3F50B285E4B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27E70D90-D804-4897-BB86-3F50B285E4B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27E70D90-D804-4897-BB86-3F50B285E4B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27E70D90-D804-4897-BB86-3F50B285E4B5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2E5C89C2-1A0F-46A2-BAFA-958F17B83708} + EndGlobalSection +EndGlobal diff --git a/takehome/csharp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/takehome/csharp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/takehome/csharp/obj/Debug/net8.0/apphost b/takehome/csharp/obj/Debug/net8.0/apphost new file mode 100755 index 0000000000000000000000000000000000000000..9349df1251a4731dcd848c0067dc01cb82c78e2b GIT binary patch literal 77288 zcmeEvdwi6|750V@2q0|48;VL)P!NR#i4Y-@1s2}b4Msu53kD3~BA2AeE?^Z2Bx`xy zZkt+Z=>?lwt!Qgat6;Q(i$D^sm#9@yTZz`{tZNmq<))JFdCt7M`|c)dtNp%zzF*@{ zcIV8@nKS2{IdkUBW!Jd9(|TlNIAVX9j*A^k?JLlbVk=|O*@-g6j`5BGj$+5@j?)~y zklz#k$I7LC=42uhf3eSOopcb)dZku=>gTCex!7l{b$+s5y1zlgbWZHkk)zYBm&LDn zI-UCY>aR6C_Gzyt?R8l7Qa<-xsNu0sdp+`|_!Lcf@wv&LFZI>+4q2bEdOZMUy^U7A zjaI$bXC4dSFZLPZCu!vWRTe)}KXZ}Czg+p(;Yh95VAV_goNASieXkj=byiH@pAvF^H+_(@cawMj;g5~HAYAvU2KEZ zr_Z?3(WBN8CM;H;-;c-t6bJJU|K^eYkKX_4CFfp!`bCT0XnnEYxrc9$;b0w>;U8iA zKlaDG*#9xufAZNIf*ROO!5bm)?%;pz(>=Tec#iD`&;4oe+yuSu4*%3N^n3!`-IaeZ z4SWKa(Ovm@Y3N^=rrm4PlsD6qFNaXNYj+CpoY@V3?n#5EDGmJNH1wR5ru-9W%D91NW!Fzb*~_6>0E10>jmvKHrq4{D?Gid@W78L({;WY2f#! zX?J=WI)9P|&n;=-`=KY@_16Uh-5tCj4W7z0bl#OlE*sL6uTKNdNdvz%4gR5N;6F=) zrw`!WjhCZofin}_U)ZC_#aQxuk+IMD>n^2&1vNI zhctK=rD+#z>$YF#rGc+Zga7Ag^uH<%AGW4}-uW!ch- zE2~Q{Eq9b%J7cDATv=K9s#W><`D1RJSF^Yr4OTB+zR*)X)0dxLzGz-`nXh`@VqcA? z+&yz1{&5$Um6Xk^sad>mx%-MsXO0DB-xy0(RmJl8ZcwreNM`y9(XVBTm(TN6tk6gc zHARan(Rx>M+y&)JE9OuQ(43ReWy73l{hhTF`7vRV0MZnrh^z5$oU#>IevKdy zi=fu?mzHw0fV>N1^0{%|d}P=7tU>v8?Zv#A?#tq4;y+Qdv6V0j9B1T_4D8DQSXMco zBOB%{KQ^+s%t8jL!o>(m#xUN25LdM@8&9q!wrNb zWh)oYuUIaXzOmrPCInwL&%X-7Uq*Afe5Iv#UzbTVs^w4vUxoV$(OvX2K0qq{G#6#n z^Oi5HC|j_M1LWK6*w>iDrI$F0m5@f-FXV-F|Cbwe=SS)U(5;P$}5*u&8vo-5|dwCtG|MMQ?-==uM1-XYiZ>|%(scz_{!xg zIo(`QQ3E^ZSO6nZO8F|ub~ zd3i-mjRUC4t8ON+e5LS=t(8&g%PY&4R>JNsu0)5~J7j1Lw}$ryB!(|ju&@UI>o4^NSZ$F8T`v>yRVQM(nV>UMatXBbE-2)^G?3Qce7|+2GWj*k8L1J|qUj z=N=n8*9Pyf!6)0`$_BsM2H$6c&$Yo1+2HeR@bOl^*o(_;@Q(9zzYs=%PA2}84UT~j z|J!GSXU3rp#~~XW10nHuegZ#v7yHY$!P$1~FUJOt=^XP0+2Byz_+PFKZmF{54Y$ED z(Bpr3Huy1dsKYVd2FJjQ{}tQd1L9DJ!?3}fHh8HGZjaN=w!!W3%DFc9aW*`QY;f*F z#r~>n@DpM{e6F&=Pqe{nZSa$9@bxzMARD~F20z&b-)MuMVuLr@;Dc@O%{F*!@0i(5 zHu!0_^368*={9)S20z0FZ?nPAw87hL@Uv|2JvR7I8@$5?A7+Cq8~kh=e4h<|jtzdu z1|M#NJ4Pk+e}oO5ZG)d{gXh@bBW>_OHaKHrvA8D?i%? zpKXKBwZX5k!57)!*V^D!Hu!Zm_$nLxdKOp;ao~R(_#X%Uf8@Yt z&eM+=bsuFL!K`<1X2=MHeLXtcjk;agJEgmw1rL7VaC8p)E&g>5DaJRZ7cno=(TTrd z_b|<1L!@2OKV_PsyGU5lcQT#Hbd#j-V49)KNTa0JG0o6jq(Rc(W||?pNUfx+ndUMs zQYGn|m}ZDBGFQ?!GR@Fjq*T(^GR=@&q*&5dFwIb0Bu~^lm;uydJa$TiX-=`)#T$Su+?=~I|ys4Wtf^gyN=Vv96Mx-ZiV ztwkCo-Gga{)FKU%KJq!z45dYCCB2_%hR`BalKzlshRz~$CH*eb44FkrCH*GT43$NS zCH*qfgPG2g^s`K#%5<)zpJtjNu}F@jpJ1Ayu!uv_e_)!S;V37t%f17EBz9O}fu4bAcuSk`o zZ(^FEuE<{xPiC4StVoWeFJhXZ ztB6C=W0+>hDzfhjkw4Q6RYf`^eJ0ZkQAOG%eG1bIO+~_z9>_F9QjsP}_hp))s7Rxv zdoaxqRHQ-DM~)!P&{L#V()*ca$SG1K=?|G^s3|g6((f|O5L2X7(r+?-5!1zzewpbB zOy^1ZS*9m4oh#|5nPvznk|XISm}clG;*j(om}bZ*vhQ<|KhwobcS!mkrWqoNv`hM@ zOiyMyEa^L$p2BpKr0-ywA)-j5q}MUc&`_j7(%)v9A)!dEq^p@`C@4}T>6@5l2q-dF z(l;{A&`+dP($_N0kWZvo(pNCeP){UJ(w8vJ5Kkmm(vz7kVLC_B7ctFHPsAbVF-$YW z6WMn}{#F&0&R%ZCw;X=t5MhCzu-!vuINmZbQtE}ef^DK(N#!vo{)ooRXJqQk~IqjGv@3} z(7SU%;ydRn;)^UqS?3U$zpex-w0{Cn%t4zDot|Wb3V#1MK#^OocQ_Il7BnRCU)#+5 z>(l06@C5TGrpYv(8zUyk&Rjw;tvu0u<9%PuG8?Bt~!1L)yx!VkLdbZIzol}mZ zW%?k8H?(p%^2Q^t9eKl%M{|U{@yJ_acte%5y=J8WIMo#J+4z4En0U}@9`Kq+)H&aA zI9yNG)jDeH!@ikbv(qr&R!>7m-1+a-hy5;3@Fd8w9|#6tCgLMMtUl|>RFReXJ5sJE z*8u}yOLW1dy5O_OnrfCWg%2_4I@k5CIj$RAWpj3V%w3+~ByZs-{=uH$#m0oy?fzUN zcuO|EwfTp6%@5QMU~be$hdVp1d|!up8>v_!-&^WMBw2DHN?Q6x`OGXO(}I(XK&LND zU5kF8j$wqR%r**J0okarfN4|4Ysl>}ymdPV(bq8w_xgHYHz%?j@ayL6G|W~-kHyjt z_4+|jb|e1L`rx{Xk}92V1bYq}j$#mm@`n6-yr#d+Xmz&>)7^W>uJ!kmYyLL%DC7=i zPcee4+tddbo`LXf7pm`}D4^#Xq1Bt!u`nV=(7zeg=As&SJ{oQmDgfec)`UNQhzwcX z<}Eykjy;7`f{F=lQO0RR>FlT49M-+tZOccJeOW|z8+^Yt|$f@^{r^g}rDf%ed znAFET=wloD*o;1gbsyUt!PDM^{R+J03=Dt|*pzX57Srg{Fn4}uG^c@(Hb7jRtpMh@ z4z_lJvwo#s0js0$U?^VuFLn~NW^F_{bbi&Z`QdL?wU8t#6`&8zP{bO*m6r^FR%`^(jhg7qY-G4@WTP64M$8?} zP+CX*Grm4(YonTe4PaRrBnL@v;RoRLOo+cF>kHTo3aQy$-{~6&JcsWSNxh2B6YMQK z-~(F^s-Y+juG|%de2&ptGNELTf0mZd^?FP|KGDx&vDXY4_`rBCNZ^Gg z*A?|f%bBZhNI;=k&cNHmw{{oNih?;u1n6)(M}+3e$A&8Tm{aQTK!r$Z^ zv6>u6jFY;e2Mz)It@m)qh5~fKF?>3p;W_x+V>D+2f1Z%;Zm04DQ5;Hewmbho^w&?`K)W;oV;?F3lS!qS>8E#%A*qw`tc zKys`TLrQ%IRic^TIPla0>NPQqzo{AlrbrGQ5RqKKA$Ix#`HTAt%-@6jF5~@g;BEAs z`QG4A`udvv7|R^Y&iZvCpM#z4bwzievcp&84HlXBW(2b?`VJD#1$?ruEW_{p*S?@gp{#5c2c|B;1z;4|UK zP+B-A$InIpy71#y=!@{9@5fZpi^&q&w~>H*f){Evec@B`<7(7T=7;|nyX95~_fg?$ zQA+#2p`uL>a2lHv`72C~onw;!-_9qG?Z=6~|7ZGl4YB{{`Zoc^Q}k~*KwbEK0az*g z?txsJ{{0cWi|gMFNVH^q01K7OZ)-mJ{wK-YoT~W^f3>dYL00k=Q{J2L6(pUJ|5kK> z$RFv>oq#wG?v&Z>LvEhw%%SLiNC=>5J#j*(vKE`}zc{j#oV9frRnHBE%b77WSIUn!NDu zg9~AC>2WDf-4{94gW=gW!I|5f|FU`seZU0OWCTk#V;T#W1m5$Vic%T=Y?pJZbA5Jn z06aR(HD2>w<@*Oa<3>TazQK~FmYx~V`U{Cpt!KaaWlc2%XSNt{v^IpN*6;HjgQlA3 z)!z3JtFLatdIP@GkAW;f@dS6f|Dvf_me%bWZ(E>f7tE?r(WQoXTOWg)>T%@3Sx)dP zi9d;UY@9Iy2b}e#;yirj;beMH{V>Yuw-x=<%<4>L*1Z&F60#W|=lIbj=7MbbK6QMCgRRrGKghm( zjv40Dsxy)*w`D0pOK_V~y$qA^fuCc5^g_3iv&JH;|0ZPJ!Zu}HWQqFQUCN56GrM4X(r}z-queTPy#p9ljL*Z{ zh3La-ekHBI>ae%4)7Qt`sqO+Qa}NlPFGf227ieaR@1t2F#k15x6i)PQg1bXIEBl~5 z>W|1vu%y8VP3|-%OwXHX{UbMIIG<4D%>i;Kv)W0lk!2Gb87j4ZnnC(XJ zs%#^43Ak`scFl0<5A9Tct|&n2NY)R75j#>D5vM1y-p<3~BEfig|5&}Y!JZ~9xe@!p zGN89Nc%c`A2`bkFyO2|TvSs_AV++w;!_1`JG|WqLIFMmzVLNDO2gD7n#De;P@6a(6 zoB}TN6BWaHTQ7QVKxTp-IL?09|26~`(+s!MqpOOHWk)H>u@@e^zO3`*&3 zhf#N1w!>LZ`;IvVnx6M#hvRWB@M#lTDUnWf31kPu3CMOv>0{u(p$+u0(|4n%uyw^8 zBQym}$}9<9ToPQt!MI08BAK)YrUy)#j0&1b0FX&A(IK|Xv3RpJBdxLU7_C#d=5n-5 z$#Fz)hTVh6Z$SeSN+9dP9fouA4h&Lo=1@-cnejG2rg{tH%CvR}r6Cb%j1i2XD6A#Y zYklwNiCCV(8rtK1JdJE?#6`DjoIkFm8U zJbsWpHU9}7KeqwjT6dGT7OOvq@$@NSbqhjnNvvK)aA%7r=p732KIuHv{p4FWc z5IBJnhz?KxyKoA%yX927zc9|Jcs$b1%69)Cn9#tFXjTipz=zk|4`W&ieyTqKx6R(g z`77};Xh8CK74G7eJU9#eqMw)mEKLsc0i!CQxBLs6Z#|DI(mWd-xdDRXsu zoJH-LMH@hhW)T3IMJ2+bLW@O+V2i>hDQaO1ad7NVX)%Vn=Dz5Y3HD{bC+q{}ZrQg7 zi(65&ocN%(GjER{PF|4#EdukN!Uve=H4lS-IZ$8~1oH0qXT`f`r*IHK4on$vd=loZ zL6{NqBpWbvzr&HCoudZrNq&WaJNIwWI}}WKl89tBS@s`6J9uZl(`W;0Z_Vo*?H_1# zzVL+Qc2e)LUxQ%TbFlLAQ7S>FKpd4v9@KzP;p!!U-{B*#NswG(@d_8(^;)`mfE zm~CtRVYG%h*bs~HbhdJOhyUE@Ej)zbaR_d71BA3*{AbH0#2o8ik6!gqzAjG+j0Wy@ZhS#bNP+M4@?X2%0JmhZ>_7KG!WJP``rDKEfiFbtGAkn=Mq&Dao z#lI0eYJ0K|IDTVU7ojMidpnTvDi@HA+T|2`ptOAlz1Yy$ic5WCv8I|FbB(My`p*|v2+ zQX&7X(Ct^jWHkjn1&Q>fV@S`6UZNol(O&Xp0=GAY+KTu`Bx4(eSxY?tg;YIL2z*`b zM*~TveJ`sSEQLvA1%`jZe=&l+4S1MZTl>efRjox~y>~Gk#ck_*&IdC~%~xFJK`cI? zNgog`ZP7@#b9*NhHXgt81P81?H3MW$Z`(5NeQeKDbKRGcCeZt8c zO%;RZDUHA{IUk8}=r4j5mb^TZlAB#ahgV;#E|L;k{^H1nH|sZZ;Je}UKyTZ zYq4bUW66T`L#w+DO~7unV|W+sKxMEltU6u%B7P2{5vPD?ED-kj&^7p$h)08s5Jy|| zBBOa8E>oYs>cX*v(bjNGwoDmhtw9d@&Qb%>?dYj2&w zaF_AA3Y!>^Yfnu)A8R{<})d+55lU}U3yc5>s_@;TVqVaG=Q-LXK8J5k< zFz0`%mo%6TJ7G2Mf>cq26N<;Y45RlSzC4u4@Slp&d(2R*Y0iLLn$&ZHu!~)Pz&|eX z4(1y1ao+cuAF836E>xb5V1!doN&%8#)D>svqKdQrVbpM5jg6E*72&P!T6WY3$)=2Y z8fR3z!7a?H$CgC}(FX&oSkja&0Z(CzvwjA_p*fAwleE3Yl$PtApm%rbdG{AQY$yqy zT@qZ5*=yN)D7kc%?oDi>-wcr@PxSxr4U^6u8|&hm+q#t)LqiZS$^1+NAz9 zpX%xi{D2*bu^*wj2@7+4mv}-`hl2k-hl2SH7@!;JfoP`-u0PmH@8dWS#WIkW-;3cZX%OCg>U;W#UhP*sCRXC2wqIb*u2kDk06y8!H5Pq0~^`dx?QVm zlRNaP1tF`qea9h$uHB7;zNlJ(%F*|%2CYW?Ka2j7bMKM8$jid~9zB!)9BWPay451m zU@1tx@HXKdWT_#kH2ER(gK9H$QPm*Nig)PwS>i?*5rv=oMqrwb4iI~9)a`^z^ttai zBRGNI*=$s`>><6L;OPi`VjJ4ro0yy<40K;po zzHa(6hl+SxF?Z1$tjT8Fc(^w>0Y|p%{`(Z?_KD}HU!##J>wBK#>D*OP_`d(cWG2Bj zbJ3G-Igd@0qNV_JCX8OFKcV>qPrCRI20VROt3(6rvbBWAF(G(_h=92HYNO++Rrp8s z18M8s;ioQS;^=Ek?0AaNV)dyco`!zCRmTCex=AaOXcF}o5%xw*O;`ZKZteEe?S^Ii znC8z95Lb&OjYe>Gb~Km&8ljnRGCNDm54dI=hOR)PO3W{a1amOvI2@cyS~|wpby;cw z<%bC(Gz|u~)i;K22W%M5=N$HVJi%$0EeCi^#C?M$jUIDG4o{v9H%OZ42KGbI8z3>O z#v$KH9uwKkPQUiO`6)Ez-Y(7Dy!h~)^Tilb`T%Od=Z z9&;L|&H;Mn1m;#ZCpQNSG$&66`LopTQ5Hmd&G*%bIO%EbXv(O6#(%a);?w=_!Wj!! zb3as)!KvyXSF5x-EW;>n6WXzOsoQ1PrcLc_+8E?UTM3zS??pz@3qY!Vf;>1s^&~K1 zU#)o0a6L#8b)hfb&>D=RNjR^lSMoUONa-8qYbt~-2k@JW#<(Agg#Bq{V!^)Kr2N! zRWFBEjBf4a!ul)_X7H69{)LT9tOe^1^;vN#Q2wjd;gE@g9r*kOYJlCVc&0st_s+l_ zz!6_Ar3rB^#<1=OB~Uk$C5&VsT+!(}B|1@iG%@M=hv*#t(1egE;1RU+|A1_j0RpVr ze^C=ssqww8ehgSj{2_L}74m;AWm19sDqGcTc1qb!I zKker6IPx}mPb0Pw5UL2XfuvPTXa(YP*iLSE3Duh6Yw~ZBF%prv!hO{>%#)@2ezp90 zmNKE*^A~m!hWDFnX$M0JIP%O$z5Ix ztWN=J6w{1Ep|C?^i3%~NWQ-!J$>@#RB-+EclZ|32zd(1BqmBq^9gogPErU%2kau!_OMO=u??!do1c!EFQHI`};F>ULTU*o5p}f_LAbL^qrSQw(<_9L~bJz=S z;ZdL42m)eWz#ce{g>6L#hUpHt!!kRg*dgCw?S?fYYQ@wQxVaR(5|LUxV zCj=V0CH}={**cUe5y=x%olLyAL*lPGK|JTBAnZ-iv|A)jG#HL&LQXWar(*I=KA3Va z@)6dae&&4mX;+p@`^JYCh~i zM-b8Tw?~&?fNe%@o4S-?snF{6NNiRYOTxdN6Vn(SuR;dm4br_lVTb*=`so^icCfBQ znOt=YAkmZA29A1}7HXDY9z!Y@>&azi`5*sLQPD11k zH-4bo*!0OzMqRi!CbPcqo8ich;rmtsa}F>c=Un#yONR%`6`$ z?^r={`+NYOI3BgVp@N0LB+VaCuk5B^V_nHa*KawpFjXkwvI zQSX(Qnf+)g1&4%2Lq!S{sjE`6{VP!Od1g)Ml64)j{=lqUWJQNXF>~&+80*i84vHS9 z(?We;)eqE1GX*pOcc0dyLx;McgcJOMTH6YHmNZI6d?rlOIobQ!>I4 zxsYWLNB6ggM2vB49}pdX9H`VesG3+&WT|t|A)I~wImjJ9w$xGdYlBa`kX&xjVI84fJ}*2s>;N(dV9OE2$X9?F6x!{+4< zqwXb)g^3x)6S`<;CQjHH&M8NX3?61WV(j=J3+~cp^8LFXN;Q{}X ztf==SKT%(VF+3kfm3^|&%*Nq5W~o`Aj)+Rkb4tw0Y;R`8<`Q$EEgneE&70!6CFI21 zQ5Y_d;>5B#^b`luPLA;}(OhyViKE;OB~h27$u9A>;U(sasm_Br&b+#(d0DpQFd$Ge zJr@^4b4r4_CBa3I&ayVBMp*Wlaz#SI@`I34k&N746q3l)?8}|C(`2)$Pi(VEAIp|) zw7-&c2nmkjAR~Bb4u#|ml^1)>^1PDZ=n`(}#ZGwTdP6mNS|Qlf%c4orl*c?~D8?)Y z>JSNh_Cr%{hb{6c8%I@%#>S(uJT{ihEXJv@K^%{Gh${zoFgPBjH4L$B0*d4+!r!ww z5;rV*sxR70WYIHb+aB`1r{p^Xtu&Tz+a2I3F5#meW;{S?U1z*+zyEj{&2g{ZEc_j zkV;_Z3Eyi#H$r~4!@#WQ&qZHZ$3HB&__>_0_d_ug&x?*0g=Wct5JclSX~>QWoxw^UIoVs!T>fF;F0Rd0yKI+!fy z2W7ohnji@J7VK5n+ZkZYG&rqi;q;#VTM_jvoSyCX8Fgz0!Byu$FNsazh~XfI?xWdP#=cxz)({Bd7JLYJ0XSw3(& z{>kxlK8<3&y}0x`4VnJwa)jTFq%%6f`HQe~YdF-?O&){JcxV{+Kugd9bfr`lWcgts z2iGs6dt5-{dl?HPSck(f>=NmHffol?f&pAm!a-${uer3sk;EUMSZ4X}RlfHSvEB)9 z(}H3-=5JIt5c)>$j@rW+{*w@E&ks*1xwo#pv#u>8IxIgNnFsQ+ch-KM;qME2JKG5F zZ{ggm=0Y)`5kSRA?2B>^{=0wVId~3WK(Qu$(OG{gkeEAFwd6zwAQi=)f*h}it@egQ zr)daq>DA^?jY5{S$)~&&3_ZriPH2HT9XM?T5x+SGkc8lI^%SSP76E1-AL{ilad|il zrt15Dsuk%SY6wpHh`mye>HJ^B^6%H_yJP7e>-0~ow0->v{~`5QmcKFB3%5jEJ3boX zGIzTU{&lL;P_FG%Bv;*+eXD1?w$npzzUHLIUYcq~lFv8R9WGxnYVF|cxEspa&8M{Et{OWJ9HnxZ!<+>L42V96EOf{9UI6Nc}z1-NLhAr7Q zf2#S(h=b0pV{dkDz4hh{*ZPUaPc`?u){i}&m0fGUbb?BBb>-7o?}FN}5jw_U;t7ls zZXnjJ-eXb6J2b<&wddq$UtmYEnm3Ngl9-V!3HJZL!yswXm*S?Ah2~ZLz-qYhdx`|L^kuZLH1G^FOgV(UQQc0HDqi1y<2!8xOF`4p4U_Re0HP;kCF9zKvnD&$UetqoaMR zFL!OT4Wmyj|MlO>Z+Fu8*)8K|w~U|XVT;1_`R#EB$nQL^Tl=ZDW`kGQmB4(kYrx(DF&wI2Bj#|=+^f~jBoIWco8)1t6m2t#tgV;2gi0Z)OS}G@fp=cuox;!O@!1cyO1H4LjpDF}?Rt+q?1M9dJ1?`HTQd>-Unp&O%ojZ)_Bz+C zMH^V9p@Cj(0A6jo96{q2pvJ5kfEL*?gj_zHCCdk=z7lz&zBVX#XsoM|=abPmJYm~j zunTmLe=J;?bO#{@L0nbyDbRus_+h?@lS>o8BDEE0_4&T|eGrN7uKlPP-H`LoJZhb2 z3Vgyr4Pi2tLJJ{0ve{Xm-;;QEPBkCO!?^I8+j8;I8kmTGfe1@l?1$nEAGlGA4P>u# zN=Hc$cIUpiQX01laatM&A6M5JAvt3RgwR$z-Mjc!tb=EIqu(kEGvv}=p1xc`F-V7tklPvX_*>}~z-+xuNNuk>N20cUe zTF8-2j!RLk{w-&{4>JsuuSfL&bbNB{#Np`rT)o#xao6ftE*OU^x$0cf8QMaujKE(C94_lyCqBx*W zZv(H0!$#G!fKeE{nTg{t6#4taiJqA|yd&NrML3n*<_%eDg(7mTstH&bq&Ng6#TCZj zeN;|o{a)e=Z7UUmwiV;UXbl+npvJbyqcEhQ)90mPYMt`ni1h|Wq5)&@QkJN_FCyi1;$oIEq9wUJ^}X)bCVug9q2)qq2=UAN!BnPz{G|f zRv;;t*tyVo_;)Cuc4V;+>Q)?w(kh1id`n|s-v5r8^*Guox^?UL9uD6a(J}u>n3058 zL0HKdxE>vuipx7|chUIRq9NU}Y)&m1@}o~km>3)K=^S7n_(kvwe2U(UMxw{#ACw_q z^_ah0db5rEF+%!?G%m2!FK0IjkQbScZz;5eK@qIzxn=w)_$5A|)n4-*7}EU^bV_Ni zaZ&n<8>DoNE{!pO(z{SP{-jl$sJ`mShd4FL;>=E2bTA(ikfFv!`I?tn7p7DPKvTp!NC6|Y>bG7%ibfw0h3NW6r{ z)q=&jhKa*z!5M?_IS8Lj=Q65@7|LxqUUOP*w8mZsA@|hsh?8Cgr{?wOC5HKu!E@$) zC^F0aIU}~E-e*fD(tI)cw?uF~w*M-7B@huvoPuugNw@&< z2XV8dZf7n$04y5x18~a##{+N)9Le*0%AJ4sK5_x#a~VH)f)2Bcqwdi8zCLw_Mmhsg zfKB(kdJPcUZ_$oc1w|thBA?EM@rT(DlU~F*5g2Uqj!@2Z4H%9k=KCchFipdw&m4(O zLtGNvhbSOIDVY4Nrv;keBJqKZD(ET9Q{Ym|_C*J*#h8u%btkn(B-H~yUU zKjt{Z(#p9toAIMnOomD`%on1^7S|pvT={M1)-gus)5Y}%eCGq;y7grIdtG&;xV9yL zZ|~Rajb3f7Z;%|l=2`rEKDOE?*RH;Ir0=}i!+HL5YFA}Ad}m0M0fxLu&3svN#CO^P z{KfC1xwd9ts>9w{C-%~gThPEqsdO4reCh#Cd$_r=78GKyz|*-KW-RV?I3P^UtK@Uw zS4Y|1OR-P#0vPICcLDfLrpH*DhNq{>7)s{pNa5*8F<0u;M=~P2K|uank?rIZuO&lb z`&HBCv>XnwV2s1QWfphQKX9sWMDXlC(I>H zA-S@%9S%I`!@-LkDjT_8oJ#ka697?teoZxL0g6SmA=VZCEs~HU+k-%+>^^2B`OTfsZNxSAsy`zY9V9R06jjcqL{7L3A1HSbR!#86 z5KRD`KYPr7r7m$mA`WYZ)%_4D z2^)tQIJAWx1Qvzw0*Ec>Dc;bq22AjHI6=MmEBJCbcnk*q8vI1m48cE)dg1h|M zmc=2j&4-H4zDiW=b@2>ikA{r67v<$iCNMp|bFjx>iitLl?3O(yyFj=M$J4S`qElWr zCXSo+q{v$UB$pMA%?EqbXtb0NMqHm0@$R)B@uhZ;`J5by#M4VQR9KRGLk~5=6ZV=9 zHQ)oQn2q=VYq5$U+@U`HC8^nA?1)_K4AgO9Yi?P^qM>c9VI6y#%~C;uY|o-(9up2g zBDF|qiO|j72LVzjfw2E%^%)ZA^a}Z&U>}fPP2)%OW_d zP(iE(&fIY4OH0#Gap@e*ARx+ucm zp$e@M&ib-WQ4950BkBZ&26YQMXJE?Ln%bXQ7zkSfK|g>4A&HKg8F)UIdVs2whAKr% z(X(KSqj?Mq%(Gz~2CTH>dO#7s@J)Q}lXbZUpwN#qWCLIy(pbat@YPhY$sDjYn@r1} zz~=u$bW2iAKM!9OT#hmKtGiQ>`iqgJN|AL4S#dB7@Zk$uQ@NV4}z) z3AJyWdJ!Gg#wgYu|GCycPt^7AN~*^DbbHlq@I&RYy0#06;=Y%nKTOyx+0Vn|P&k6?bLc7SZo5?L~DL)z*oLh#lXIu*AW{V=&<@JgAa`=t76C%pz}u|u6jDVTVM zyEpC6shobRG&(=fNtA{r=ot7B+IVwWWH}@$^s2`;$y9!l8l^FqLQo4IkbDknkks`P z9%<%1mpPF#a3z5&$zJok!|;^7$&TdN6W)3|y!9})JKBIQ_F6$6MZCr06&9G-cWzMy zKPRVFhk19*Yktai?e3&B>Q=X5)uD3~BS1KhIndBgs2zey00*8BpN&=3!>9rQEVK$7 z&;@?N0u~LhZDCC8Fet~92WU}!_%NF;$d0AoWEzJkfUivBJ4qHX@@(6FjdB`L(ydt? z-rkGCx=Q^4Rg(~990ATs`B%BJoX zycDn@Y*(rz`N!^?jMtBpBzhtz+~8KKGX=BwO_#;|rWt^x_)WhdQQ*!G(TlEL2uzKW zMm_n2y_)tD%eC@7hcK$Ym80Vxz+x|3qL+!~vmo7gL8tjY4 zuekhj2m6(}4i8=li&J#^Oc|LFy`S?i>>v!Nvwm17q_h*&B7^ZQ!73gyqa*d%rBI098Q*+7-d=*%hfz178nN+s-$ta9$72r)C}}+I`%*3_ z#I)WEMCkgtoX+(48G@p%c;8sCec68KK! zB3OoFvBvlqX2s}K8IFiRJJkKUT#T?Qbg3VR2dBqk0s6;vwP0DI^S{M>G^9t|aZnjM z`#Y=$J-Qv9?*m>jW9$Zt4&_e3Ce(y(sC68+tHH_mL_hXr(`1>-jr}%-83A*u0 z-FW>LP+|lx0RC#=k1))uUfIAQ)Y6LY_7$i4BO1bL@h&P1CaOWMx{G`IBB(lxTzv}) zv6#}imNBznRW1);(D$60pbu}%iNXIRyCH=A_;Vrb*f?PvzYu(`2M%;DaE}97f}8#j zIb|(U9?6J)n&7oP9--e0Ku|L&9I;3J{3x4p)}JM=W5FpPn%3x5POCyozf@W-(X?Db z;=-thyILZ@0~~Wi$Tp6%7V+;jTb(4~r)lTPJ2f zWayV&&-eIe>PhRX)``bY2a|@fJ^MQG5de}=$&i@{JyN~Vk}aO1k5|`&5naz$uX4#H z{sbmjChGgi&7&)P<)i0U`gpjub^1xZ>2a!$;6I`>`=Ti>D;0Y6<{ddGGWAU;<7||Z{^={rnYw3mg zViG*XyNaRDKDI|M<2b2+TN(lV+Y<8Y4=s{_7H!bK1+fFKY5Gp!eRa!#w`9N?ge0>y zz~80-e;fkbCO}z;HQY(*31GVe%`is&TgnjD#*f`!mQ0+{iJnY*hlO6eY^_z+!`0s_ z4OF6tXC(H(coU2Voh0h{KJSXSk?X-5b$nX!Ne|XHcv-Qp{|~XZ>bP!w8Pv!FQoeFZ z@;D^1-b`Wf6~G$#6aG=Z`aX@J5gd#Fm>i^8XxQR{ufoT4we%dCq9^qOSwDz>^z@Uh z>%bHZ#ZrXL{`?1B#QHW^7rB~k{sL`+FBAkK62eG|=pQIRWq}EO9wo#l475oh9csh- zb(-y=Ed*n0=2eQ<)W75r3=wFUA>#eY$Xg}2h@g)yE@HKWtOF=o8A3%rfkD&;b_N^- zC_O3F5BP2Z1}veIxaz-6ue7O}wqcoEhIh{Y>H-fgMGup+ptD5{%xXjynXm_gP_L>J z4G%@b$<@RhKLjbORme-)Pqp3y9-cCrcBEPHy**6~YFIt>oLJI}Y>T4bevcf8IbCsx`q>k%F1n9NBl&cHOJEJGj(D<0XbZpd zhfq{Ndld^Yr!>;vxGzM6^tfhee2+piYPU&U=LUAGQM;wLTKs}lZ`W4+CP3_x>u?5! zLsMiY2xeT?k`^Za5_SEbUti9+3_xA!^@yJdUsdfgYAsOL6(K0QgSRMcQR?qxbP;yqM z{8uOS$A3LJbQY9Q-6m|(ym%pcx+U-!FP@1(gjc^)rMh$st?vPKF(65}efO%L0+yH% zV*Ylw>!~#Q{mfKLzxO`VMZcd5Qm`?l-2UB^_Wdi87yWWR0(@1EKBVQ8YXoOz%XsNu zk7l$>p&6*j1Udg^cy!}iJTNv2mfknciSIgtv zoRNNy9Os4|&aE%O(9@%u3mWkiu`U(3L%v4C@zQmvrN<;nU#&}TKS#H<898jrkGG2C zaZGHxmEde7A0FV-wRo^5hd1eYdM`SF|BCme8U;;xb_vcXoCw+2oExC|IkH5*^Wu@4N!H&)$;u`L%|R;LEw z1DbeN*y54qW??JN{ZRf`SG|emns8^=(h1QAOKkNXXd92qB<34S=+40FkZ$BP`~wdS z7LTWJbH9@Cx@{yJH_IOH&ss5|6$CF91N+E&^bZMar<-*-H;QXF%=)V$fYA zy|xd!$RA0Zwo__J9lpaH4YOkmO&o5lZDsF*kIImOp;9}()7cptQ~fw>{F5RRWms&W zow2_hrJsdm_n!ql=sRVN7OS8UY6MzjbzixyN}*J7*8h~{v3oE@M8NWLIz#<)9S{UJ z2wUyCwF)JK&+~Lc>^Q%9P;@Jsv205e{qDJ3|9HSUVKh#}Dy(BhuV9hp0?I zCal6%Yvu-?XLYvLsDR9OQtb}{M>r_tZq$exH3T~e*us`F-xJ7bd)H7Y`2rsN6l?al zv{(R=~V-J zWd>^bk*a&FDQ6g|cv1pqg#g10@oSiecs1=em?7fAjPq5xcQI&;jbk&gURn(iwbnh| zAKl|tNmMVwVS(1bEHpa`ZiI9rOS++V{qcn5yror(TirVsFRvKIz#cpjxKgd?=p48p zbLfKL_`#9|xX^kt3v9$VM1f!Pt!NT}9%i|=5hs2a>6nGzv8g-S+qI4Dv8I&dJ2M}uY+bBxGgghAu8iGyK)dc}FV{A@8_L!ItGznEHTf1KS@{!U{gW ziL;iWg1L$EQk3L9Zk6`o>Q6{yfcu~$o_4PLE9P&W8#&VH$0_Ah@!&BCOAX+vZvo+$ z9Xxm$(u0>FgQ7vOWz+#a+%-r)EfHWEU-4*_Fq=OVp}CH0p>&YWUqd{6c3Eo}4wRq< zItG81bukPuV&v3EHHso-8!dAMVtHp;cVrY98ZPpa-PCa!P})i2_{iVc8bF(a!Dod_ zj|DK{r%Qlz2HZ5>U0b`0etf!Mj5BaHa@85&NlN_zfMdn*r_uZjuW&vf~LEKeU-m!H?Q{O@%6Kcl>wyt+&C-`Ck&n0=PcKHmDR<14Y#TBWnk z*R7R}V?#V+aHuOI+`8xzVtV6NtnU4E0%??E2GbcR04Oq-|D3>o_|vUAWJ>`$0|9m< zAwTO;Ok7~V;DUV>Q-=Erf$vK>%ixF-z&1JqcWE$Xh|+WULGUeTC3%KIJQ}bRK?DF| zIPrOOO$`St?3C2605&yHpsD24e~Wns&}FoujbNOn`lZZ!Q|F}+R?p>G7W@eCoJ4Zwr!=rZf_;kFKqVxLB#Ee9$) zG%s`bLGC=PnU<@;c`@*#0*+5b&cNduU>jRKL6V_YK5Ea+_}-PW0Oygv+#-3lk>sqe zWyVfqBnzSb7QzPuvHG>Hl|pX)<>cobIxmIhdN1>qOJ0KT`sswu*3cOB&cMaw8UNAe zW98VZTDMx(#Qc@JggYMJ572iILPeL1g*SabU5PGJ9*De;k8NSDB^$WOhez|REzGyk z8LCwaC_r$WaofbHoTr9>t7-|FVT^c+=t=YY25yMqt7L1Nj`5eixH_V`DyOa$8y@=B;A0x{|+n&k4ieuo$ZWApiaasbE44BvaQ!2rp5UaC(DLJeNUt3> zg9^A6f5tL;+Q66E>JDYC#OoLRiwa@d%6qOgGTJ&jh^H2Ka2Gj>5n~IWUT1WO1$D|1`6!+q40m=u;An!|9k>bwaF7vm z)aVPLv-d-@$bm_5@S=Qx8!Rx{!6QZ92{k!*exHwUn*p*0mw$mp%?42nOzPjUhhvgc zeKtdU`lvbF$Ax5jyh?(Lc&8hYnP0<9@bD^T2z&!m_()ZV_}6DdOlI=QvyW8<=A;Ps z^U0gLKwCn#JZUqq>xDaYH#pIazQ}to7;B#J!{)UmAL_OF@a!UVsj$qsZ$@pVoKLl{pbcyAnm>=MlwLd=2`w=DqNR zy$d;AC`PZ?N$K>on|N}Equ?}Z4$lz3tmZ=#F-EkTERU)szrg0k13!-SnS6n5 zFXDq?t`;0VN~^mU*l-rV)AucTea#4!jf*O4a9WM`CYteORrRQvN~Csk9mybDi~D)F<2)IHO^G9_ z0jpk^HGKpE9q$04xCA`Z6C8(m`GWIg^NjutNarR-7``LV`iz!UK-ZsV0x6CBEhVl> zMHuczG{@Hj-dAJqmaQe+NA)*&g2&_7f6)gcrGY0fn?@(1T$3t$mxXXciHR|PXTn(@ zp{ve^IYUMN&^6Z6Kay^Ipw0tLSQ^)2R;z+VEeW2df8h=L=cPzvt3$5tpJP}DU9k8C z7z+CcmCxF=2!?dolG?9+x!^K37L*(3s0!^#BS^~da9v>oBaT3@gW~e*0i`SvUqzwd z34n7G<0^}7dc4ae{X4L)gh=EevRW$*`bJr5m91sRgyC4uzYPwUg7-No^3TZeNuG*mQsgh*i@rqJjE zbgffa;UAvh0?#g`uCfBPKr5>()lZX~2XYxJcqNLBQX-52o{mn^fYKx$`d!g$G(6Vx zOH_C{=$R5-os3|u+6;IX8hody29`fAieD~4gZdEEqUbzb+hQLcA7?-$Qck;SU`o>%AUGO>CP$RI$H7_NT?>z8O#Ek$0!-RNp>Ig1$P z7A4w|bk?%n5VQD*mQ7F0clx*6$RB7BMb5%Tl+KYjdO1GqBk9Jg!(nMHda1akUYQi|iL! zStbTAgG~87N!P*(O2hC}ROmKBd9LMRUH2HcN4Vie^@S0U4%sGNZMki8Zve%q9XyCB zGjITwmAkvTDt)01)HT%;aCv4$>w!ExT`K&?Po|(BqL9Hn5c0F3(uq3EUr|h_eA>U| z9O_*`kCP?makL3;QITTO6yaou(BcCO1Lc#OSTZq~veaJ%vPs5#P;8_ZF4GjOV|?Ng zZ$p04&~gUINPWPIW5;I8WWA`pu+MzQ@qi^fGMYsE{vFUn-vhg4s07~f|0?ZQ&CdA9pc`g}HQtL=O-f6^^9rwvhi1T!Xi zgZTYJvjT%myCkvuvHXGQv#H4XVRPj3e(YCV;CKegWboy4`~BEZK`&SZ^q^V2A?{H@ z!C6-N8A&4}{0}h*XJMlkj_vA=K!SHF_wbiC+#9{Y3d~@9OVhnMidSFo?15alU8B`) zJ{@H@3&l?M@(kO>AO(GDWEbJ}g`og>TT8cK;8kyN`&;fsSp|dr+%|c6iz{GgcyH z*QP!GrTREgDb+|$era>h+I|dYsp!8Txz2b-tad>hYKRT{Td@PS($@1TGqo*Wn<@h= zF&V_;Rg9hCO_L)SSr4BeBdeSrcpGWJF5w_1Ee^Xi!r_7-GR>WcGlwxG<=9#_p7elj z*v}`WIlu44nN@G7=s*P>p-%O21@%Bea!CW%=7oy->gvzJ z7Dt~FGZ4dZQWqRzyc!{HwFG$ynJ40<-Q5SoZ^Em=m|E%52031FsScxc%|$u?2jPtt~L$& zJLO7ujXx!kw9ZR+1`K9arb+DX>bY<>XF&Y52prhNdzJT;T~BVPb=0!ycG;kj9J!7R zw*OKzpNk9aQQ`d3>9y3{_yp#x*SjiPbOBj6$?HYDr2@?c)&2%-%5ySx9*f_S;N|o> z=9wC&8RCQ#c?=-elW?MIVFck=7L}bLnp$SLn)+Jt@5__Lh#ja6*b>!GW0CK+xe)8b zB%1I$Mm$eur^U1m;I~F6=+gl*<##dBHKRl(Kt8RVSt#ayZ~1RlE@#$mVx5&`fm*R&1n)(Gy=9AR!q3Kp1d!8S$F> z{C{xEaMlPFeWF7G$6wn)g@*J!WFFV>U~l54^4xI^q9QhLtcngQ>6f7vV#zdyeuJ)wym8cfDJPt!c;bpJa14)adrL~ zJWx~|Tv^bX zou;`GQgS^>ymo}o9D*JWO_axLFP*-VT~F3axuQpP-3w4Ra+LA-P|>>@)Xo`e31@q& z*O$S93cb3co$csSdEmF#dN1o;@4CHf&)Pfi*k2wYo%mhr zWw`8AfbI^_-SwvyVC57QP0q?xGFe9zJT-|pzfYXbQx3i_ki1_s@DAm?I8^k|kP^l&)=>4zM^~M0;#gvyen+)q@ z@1h$}y*?U}Kk04cndu23`An}{&*ATq?Kx%Bg9e`3-a8DmKI)SX_9l^+jz{N`wK3b;HBQJ=m2=_ zFg}$YO+IxG)oR{ubcV_jnzJff0GJ4RXz*vA`d~)9zLo#F`pqvj+;$eB@hY5LZYY0S zzQ6O8JKU!b219Zs&3D?*XVjcdy#=*4U0(#bdT;7|7mrtOJJ97hkT9N~p_x z2{jZ=bp}e+wp3D$M16s9=MpuXR73G-2XTaa;YcvRS z(U zOWfxt6M~&S=nbfoNoQZ4#%awB%$Jqv#an|@X3d?}vXIT=qG~d#Mq|NF^^?Mr$PLlB zO8!Jy%$j3!loJm^aX)kHEdVM15Xp9Dw57he*Lqo%%2wZqr#O@zN596OGj=a0sN z{s1*%$ICegWcgoGBIh}{SkYx=y|7bK|gI{F0F53ZS!iX_pXUBL(%JGwL#BQo+s zzDOd->cat*sul`&22`>`4TNDgs%jp?cNE`JpQ9r|A8^5kTgu3< zWxkmF)5$Cp_jLr9MdM2+vC-*!Z&xs$2uC|7v5s&e0oQwlU6YdWRFI9Pzk&BiF zJ1Q|w40<)(NnHcA@wag*QAwl6 zhb|Q`_AfaNC6;%zMI%{)8Lg>Ku2*mymD5P|PMOnCTVFS4-i#@8*&I}gkECph-g)cO zeVKZV+6Es4{P9#rTSD*aG#Qdx6S1H_916p3n9XNLcqYk6$RLA?M_Jx^JrY6zr!1!5Monj&1hit z!H^HL7pBQ1CVf64`p!;j5IzgW)j%|u=o~|gm`|wjdwR)ClAG8tE`} z;y@5sFs(l7n2}`Y7+D?^Ku(p zsd?5ERA`}hPD9hQxh)NI8tU~rHDej3uFvO4EG-D1{P1tEOpH;#tWvtxy3y%+W!H%r zHD(jDWE&~=Lxi>jBL(4GK$ewppYFRpZByUSSc~u@-A24=#-|eT@ria{JSdiCy>0PX z3h^-tCco1_-+IWz5ss_IFpNY#ZyVO0tfd7Xg65Vxc#LM?)8|RP;HaYlhHjXV2%$qH z|9c`GkiM{l{8Y90Ks6h6b*v2k)KOP2DvK}cPQ-4&El*Bxmeu&mLX@VJv4GK=st!gk zqvAzWMz5SMcQAv#V0SQUJrBn5ArH*@Jch#eFpubA%BsuYX!YZAdz^lUO zlIadF!p-z_L0k+?RZts?Q70^@HH=9;BNkI>v!#ltl4tTQkW|8R3Yt*^Yy+^OO(>AN zoIb(pcm!W%5nrm)-(IHA9|Z;V(PetPLk{LjMf*)C7?l_e0V+8i&te8$7)_}iDOe-x z%Y_h)K~CRtK`0Uy>lT|y(LD`%CK{6Jn>F(>eOADRt}7f(B_hkwvc5pyCL=Ki1tWaF z80wb0JgmMl%F;J7b%r$r;bb4Sd7Zu` zD89bAnPz{TH|S7XP*@wbQB-fl>8T*1f(d*j;={lwme$61$bCu^5}#;f1U0ExfVQ6( zZ|+POEqCD|+CT7-6b`%qx6vY_I$(UuY-e4>+BLMouRkz?k68z&=U%;t{yueUp$$@JQ<3zsWjTi<_UVM)bqWcF{c)G z85pK;6V<8co`?r$g+kZ>lWZh#1Gl@sUXWh>6R8+QXetGys5g%gP*E)CpRoo;)5%Mp zsWhyTn1k_{gj^gDZFJExyUIVkE^;7I*AI4MUqd4Wt&RPBEE?`iI#^j5J<37LfPkrZ zkzrE10i7EIVUqd{2BWBv*uUw|pPWu-xwFFQa=M+BPLH$7S?#PTcb1ozSCqTT-Q|_# zp7N^l>hhWjXGM8MMTM)vT~S%#si>-`uBdT2UFEI{m&@gLRk}Q`Dp$3u#_e>MyDQu- zx7%Im_PDFu)$W=~XJvV1MWw6KU0GS_sjRB3uB`DmJ>{MXkIUosRC+v~Do?eirpj4W zUR6=$s&ZFVR(Yzbs;aAMs-4y4)fLsQYIk*IwWqqOy1Kfi1}4^^_!_9LfmjW)s5Xb` z5Dxx1exc(4AmtgKwADD>Re=CRJ)Sm~zq-cn^0ifmLglWi3TLnyyU46`Hos99-B-DT zl{FRqijWVr54e3U)U2x9?e_&kPQN=;K|IQp<}XjR;AA20nojc} zuoU<_uo?I!FaosXFt!#r61Wq%0(iP!)Aj(H8}K_WuodXcV{BrhrnLgkH)+~wqEFMb zwMh3&*R;Vnb#)l%2A0eKAFy;Ld<1L;ZUb(f1z!;zhtSRdCjyHh-wZ4%ggw`3+H7F! zT*y(nMbmmf-w8ZUyS`Pah_pdZKY^22PX`KIc;`QXUDbyEud^uij25!dNI)^~ti9^O`fro+5 zA^-5d!Jow__gnBMum`vsxEUw*UI(uIHuy;%SUeE)RcOZnkOR7b$AK-t)4(L~Ja7Zh zwi5bcC?DR3gvH$RH{0C(;JAEh7Dv?IW^k7K+H zLmDq}oB{t~;NZdV)06NQ@*@Y(FOXgfTnsFE9^(VJ8Mu$qKSzH9mI5s}usjhs64(l? z2d@2vrnN&)=^^+V>1N;tq)!tfeIB?6XnO(n04D;^5+Cq6@HPJm{TS~b^t=c<@ca?@ z`3l&16nvnUyb8OJ?m32j16=z%@Bw$efqDZ^1Fcsw1{3+Ee0>g6x{H-7ZF$!9IIl(d zIN`x|Ptvr}#8IDzR%L7?{<-n*P!;@$d4buB8|}lsGN5pobp^ZjiZ5U78hI6Rxoj&i zc8&fb2CKCfuQAmXXO8X%N;neT0vz^7yWKA6du(3-UiSQfsW-MqpM!83(4;R zecwgsM}+<=lAkT~`!o8_3jJ6Dr zUElJlEs~%gL)<{$`bqn0+A7_%Go+_5H-fwcyf(xV^NhTPF=if`;V0cMf}diIN+W-| z-Aw0TC2!}E;5`rC=MZ1a!+qM0M%@mR=sRQs#Y-Q6?|P$7qYYPNY@qgO0sq+f`sYP6 zdNck_f<6p%^sG#|voiDzg5Ib74f7_&YgWWJedNVBCwq^8ek%^t`HcEyz2rP2>PPlk z5TEVCAv-K18GB~y_K;6Uf`05qP0KOXKjYI^q)(~r+2CzP?DM{n*XXO4GQJ|+E5Ls^ z`suo^0kH{zr|b~dAQnm6lodueWd4)q_4d2T3duzU-%p&X9}J50x<)fm5!ISZM= znDhQfGT#1W%pDoqsjg#T&x@G<$S;;UgN*3Qre9{tApQm5KZ7~!9o$>S82B^3d|XP9 zO}A2g5l>IRc(u^-+fO~r>rGOG&$&I2=|OBgj>;HhkZDb`@p1Jg_@1AO4_*@A$Cx#x zZfX0o8GdS~!HC88U<~}3_1-6mvQ zpDr^NwjF`Yo}i}PP33&vAfvb6AB}Zq*yoJJ7_P_sXc=nYHP-zmvlQX|$qkwMrJD9Q z`L4mm`E#z2IBDM$`IR)2Z*$UNVXH@KSsH04tB2 z4~%VIB1=a9fXrCv+=Bhb_WrA}HVmWj`b7i3Zp#75O?7=8yob<_KERxBxzfOEtn2t3DZ=~f zU>kh29D7lcaT#Q0XX1VHEta&58|6%e%oem^h~~ks8f1*+{4+CuLxlU4o(uG1-~AzF z$aZKJamk<3MKBfQ=fKpMtq0B zR}a3?MxC@fqCrs0)$uWY27Jxn!=s6eZ$)fHdWvE6>2(;RM!KBCM2x0_Rt>(u-FVhv zULC52xOdZ91Pcg)K zLB9%fMtYnX`n}nj8JkpIDLT#WC$fA-@h50RZw7rfo)7ichD48mKKUZ_wV*pe{}Oo9 z`!*U92X*~Bg*-yHjJ=|7Q+@WKKC|)M?%Qa8OCc6mId`Pn!aPp)IVbpg!M_{x%tIFN z{}onCexnbb?YqvGz=l#h3%rNQFdNE{`?pqEf*x0sPtN0+;qAo#Cqo&AInb1lt*+1g zD{E|LOYq`b1Z?MUn zmeA`l7@f$nLDR<4T#mnq*srf1%JdhqYbtd-JpX(FV2K)JF1{`Ej_DaL4k*6Gh1^cw1Dn&DvAI~Wcq&2+GDIM@OQo9$r8 zoX2xwJQGKIzUp9e9n6G(AWy>&(hj!R!BRYTDrFX%0M~H^5N&s`8+mdLR}&Ggse=lX zW17zSP!?Em${7bAz}JGWk~^q69Y!C6^vrrs589ISKGv_^I;nRu)VRSv z@+X>h0QZ*f8u&$DhZEs|8IEH3`$pjzc(rf+p<_36l)wgy-=M?LcIK6`RNZGgA#?no zrsa{He>KP$`jP2*Q6Oxi3!9FDrAz;!u%n8fr|&OPECX}q(cX}!HDyp~@sAW%Z+}!_ z^YeeGFz+`&fZWg(O7VLp_Ge|}-%adCCi~ka_N?ifI&C0(3j_BpQ_fQs_E!^a0`>f2 zb{FpNQcB-a*t1G2*E5i9Lf$4N|0y$jQ28k>Ks>*g(d7MY9K_YW&YPvk1QO#|@p`CHA?kL9r6n#VBqk@@o9uPH-Hi}#`K!}ls|g<{9;I_0ZWG|H}3JoFTMfo)$d z>$304Rdy*J+`g&IWb6r(ZEr5S*E|58_z2dE^7I$iD`=UB@_F($%gxvOmjaIeFTFm$5`<##05nsO)OY+z{KLV zcNF%`4e7R;!B7qS+pDa!vX$nxd#vmObMbq5>{iP<5H{vm&*rh6Ir(Su*yh}_)mC;_ zo((*^@@%+&AH}h=ZIg{5yRpGw5_WFAjcCW%8bECfvWK`|P6#FqV`?2z~blC%0 z5Au7I%kTyFUn}3iy)JJp&0oYS^*RGTLjee^?Rz{6&C zm#OF>GkeH1{TVYmW7;9~-9JsiSE&mhDO6UPhy1FL?XlRl7Ajhf6}zqdxs-D@&vsv- zvOnMYL?Jtue-m>4R$v2lU7-y*_Z8kKn;zxQVXr~&YfAC6h3qZmB<^1_7yq!3ys11wReUQJ;H1PkL*rO&d&nsMXR{7Axeq*AM#CdjuXSZqKS~E)3?YV04 zn17hrEy~b4EbRNrh}X=REwBywp2_+*6MMi!zkopY{!z*Z_8{&bG!>o6QFfWoGugYA zf!NHh%%O-WZC6404V!83^2hKf^9u|Q?60x^*vyvPsr<%_mM?n8#MYQRXH2Ze^h<-> zH}@;(b9{RSxrddzl>r+|kaP8GCF~jVxIdJz)fW33CG5$ZA$OOsr*nsFC}D?lZ^kYx z&-VQib|minBR)tnPj zcM19l!@uBWGk(^)8ncbb_PU8}HT?kDD7%>53)Xv0GkQ(zglRm_D`M4%(HwXJ7`lN> zL|^Jrl-&xOjBQED-v_WK6x%5~`=e6)7dr-l9XW59=r_e5SsZWM*`F-MC++O-IdrMuYRAqKWSmu?=?1 zeRkzJyXBx=dESm?vCmp!XV)@z?U17iYk3l+OV=e2T=Kxb(gUya2g`VFE^xu0bnUGI z+XS`?ObWbN;A(-dyrIk8F4A(ap2H&qx@0 zPktRbs^f5xo_w`l(v>1j`$oEOB!*v81)ZMP&?V{b|5J-n8gUrEu-x!#iztXclR?f0 zf-cNrZ;Kl|a^}}Cf!Mb6xr7)yRI1y@Cwg$uZ#{Hjo5wHgaQKBIO8n{;hRXaEq9W4n z4}@cdo0%;Cb3$J7eXQyA13S<9r${drj>9iCy#CV8Ga|iCDEv^Q)9oPi|Epk=XqRk# z9@+%sY7{tMU`Sw>z%>Fl3fwMmufT%>j|w~?@SMQha=o0(1&$Wz5!fhjzQB+`9L43= z8i5-HZWp*$;6Z^$1)dOiPGD|@C|}@cfgXX40_O|VPl__uCDLmIZWOp(;9h|T1s)Z6 zLf|=pxh_$@z|jId0viR+7Z?)QC2))z@q|B2s|e+*DcByI9ecHujN;x z!1)400=opR5x7y{c7b~Z9u#;~;0b}}1m;$X@&%3-=n>c`aK6Bhz%GGn1a1_#UEp4U z2L&D#ctW6F>i_(It5Zw_Le(9YnVz}Hr&hg2j;M@JZk=bhCqS9Qqm^Hut5+G>0_-0k$W zwbj(%cy}lmD6jDO+I%&Y9zR$4uhtiERr~$b6;)+HmpfF3L*lNonn1{1RvxUX@dRr^ z&qNVMY%33$niIq+IcFdoBe&Cz7gv7|HQ(BDx{E;nSgrSJ|~ z89u(CbJb3nR+jWFVVu3)muSaFFqU`X!v;Dg<2pqY+9%-!jo$qs0dW_LB*}^}{!ij% zcjmxrBIL|pe2d|^@6xGKE*;Wx&Lc=4#mf`Ldm#ywg@yO%6MFs)^{~yY!C<( z155dske8@RL4h*vmD!_lW0YSnSyJ0z;2K(e3gl=cg?{Pi>Psg#%dAc=AxB+Hlb zvi`R~mgJ`hg>qjdQSQS?p0-5U^4~!onJD$keW*ma-vkT4vfFsTNgn^``mFL&&q>JOXZ^Iie2y{oQ_7d}ibe&?$f%1WkkeB6(BpVDi(j|)-Rw?90>8MIZfwEkgJsfPr>694)2MYP@ ad|j(9L#&jRWeZUbwL< +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("csharp")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("csharp")] +[assembly: System.Reflection.AssemblyTitleAttribute("csharp")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfoInputs.cache b/takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7ef036c --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +fdb310684555c93fdd6a6540d77dca1d57976f1e92e58023ebeda0262dc98637 diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.GeneratedMSBuildEditorConfig.editorconfig b/takehome/csharp/obj/Debug/net8.0/csharp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..aeca731 --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/csharp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = csharp +build_property.ProjectDir = /home/marek/code/ai_games_2024/takehome/csharp/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.GlobalUsings.g.cs b/takehome/csharp/obj/Debug/net8.0/csharp.GlobalUsings.g.cs new file mode 100644 index 0000000..8578f3d --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/csharp.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.assets.cache b/takehome/csharp/obj/Debug/net8.0/csharp.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..72c0dc68665d75907269daf0f281f33235f22677 GIT binary patch literal 149 zcmWIWc6a1qU|?A6!ydGIQsxWx{kCO!51kX|ZN2u6Q>5qj@&vxe$3IQqKM|;gSilHW kD5IZ|pPQzCIA2c literal 0 HcmV?d00001 diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.csproj.CoreCompileInputs.cache b/takehome/csharp/obj/Debug/net8.0/csharp.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..f14a50e --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/csharp.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +99ac649c2dc56a7352617b504d3be745f852f0c8a1a983c0a1ce497c8e761e27 diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.csproj.FileListAbsolute.txt b/takehome/csharp/obj/Debug/net8.0/csharp.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..041dfde --- /dev/null +++ b/takehome/csharp/obj/Debug/net8.0/csharp.csproj.FileListAbsolute.txt @@ -0,0 +1,14 @@ +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.GeneratedMSBuildEditorConfig.editorconfig +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfoInputs.cache +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.AssemblyInfo.cs +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.csproj.CoreCompileInputs.cache +/home/marek/code/ai_games_2024/takehome/csharp/bin/Debug/net8.0/csharp +/home/marek/code/ai_games_2024/takehome/csharp/bin/Debug/net8.0/csharp.deps.json +/home/marek/code/ai_games_2024/takehome/csharp/bin/Debug/net8.0/csharp.runtimeconfig.json +/home/marek/code/ai_games_2024/takehome/csharp/bin/Debug/net8.0/csharp.dll +/home/marek/code/ai_games_2024/takehome/csharp/bin/Debug/net8.0/csharp.pdb +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.dll +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/refint/csharp.dll +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.pdb +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/csharp.genruntimeconfig.cache +/home/marek/code/ai_games_2024/takehome/csharp/obj/Debug/net8.0/ref/csharp.dll diff --git a/takehome/csharp/obj/Debug/net8.0/csharp.dll b/takehome/csharp/obj/Debug/net8.0/csharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..145f80145265af9225328b7f18a058c40b1fe80a GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/takehome/csharp/obj/Debug/net8.0/ref/csharp.dll b/takehome/csharp/obj/Debug/net8.0/ref/csharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..c8a60ede4b564cc0cd5cab1badefc7952142f563 GIT binary patch literal 6656 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 + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/marek/.nuget/packages/ + /home/marek/.nuget/packages/ + PackageReference + 6.8.1 + + + + + \ No newline at end of file diff --git a/takehome/csharp/obj/csharp.csproj.nuget.g.targets b/takehome/csharp/obj/csharp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/takehome/csharp/obj/csharp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/takehome/csharp/obj/project.assets.json b/takehome/csharp/obj/project.assets.json new file mode 100644 index 0000000..c1d8022 --- /dev/null +++ b/takehome/csharp/obj/project.assets.json @@ -0,0 +1,72 @@ +{ + "version": 3, + "targets": { + "net8.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net8.0": [] + }, + "packageFolders": { + "/home/marek/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/marek/code/ai_games_2024/takehome/csharp/csharp.csproj", + "projectName": "csharp", + "projectPath": "/home/marek/code/ai_games_2024/takehome/csharp/csharp.csproj", + "packagesPath": "/home/marek/.nuget/packages/", + "outputPath": "/home/marek/code/ai_games_2024/takehome/csharp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/marek/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.8, 8.0.8]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.108/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/takehome/csharp/obj/project.nuget.cache b/takehome/csharp/obj/project.nuget.cache new file mode 100644 index 0000000..3b6d22c --- /dev/null +++ b/takehome/csharp/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "wf+hwyqMIyYJ/m/BXNVkE3nqfYK27/Sf4OvvMyb2WXqpWX7oiTFnUiuk0bz4gxlPfzJT12XwITdflbpRyjwJaw==", + "success": true, + "projectFilePath": "/home/marek/code/ai_games_2024/takehome/csharp/csharp.csproj", + "expectedPackageFiles": [ + "/home/marek/.nuget/packages/microsoft.aspnetcore.app.ref/8.0.8/microsoft.aspnetcore.app.ref.8.0.8.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/takehome/csharp/xunit/GlobalUsings.cs b/takehome/csharp/xunit/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/takehome/csharp/xunit/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/takehome/csharp/xunit/UnitTest1.cs b/takehome/csharp/xunit/UnitTest1.cs new file mode 100644 index 0000000..17cf22d --- /dev/null +++ b/takehome/csharp/xunit/UnitTest1.cs @@ -0,0 +1,10 @@ +namespace xunit; + +public class UnitTest1 +{ + [Fact] + public void Test1() + { + + } +} \ No newline at end of file diff --git a/takehome/csharp/xunit/obj/project.assets.json b/takehome/csharp/xunit/obj/project.assets.json new file mode 100644 index 0000000..c357553 --- /dev/null +++ b/takehome/csharp/xunit/obj/project.assets.json @@ -0,0 +1,864 @@ +{ + "version": 3, + "targets": { + "net8.0": { + "coverlet.collector/6.0.0": { + "type": "package", + "build": { + "build/netstandard1.0/coverlet.collector.targets": {} + } + }, + "Microsoft.CodeCoverage/17.6.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "build": { + "build/netstandard2.0/Microsoft.CodeCoverage.props": {}, + "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} + } + }, + "Microsoft.NET.Test.Sdk/17.6.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeCoverage": "17.6.0", + "Microsoft.TestPlatform.TestHost": "17.6.0" + }, + "compile": { + "lib/netcoreapp3.1/_._": {} + }, + "runtime": { + "lib/netcoreapp3.1/_._": {} + }, + "build": { + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {}, + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} + } + }, + "Microsoft.TestPlatform.ObjectModel/17.6.0": { + "type": "package", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.TestPlatform.TestHost/17.6.0": { + "type": "package", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.6.0", + "Newtonsoft.Json": "13.0.1" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "resource": { + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "cs" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "de" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "es" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "fr" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "it" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ja" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ko" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pl" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "pt-BR" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "ru" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "tr" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": { + "locale": "zh-Hant" + }, + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {} + } + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "NuGet.Frameworks/5.11.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/NuGet.Frameworks.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/NuGet.Frameworks.dll": { + "related": ".xml" + } + } + }, + "System.Reflection.Metadata/1.6.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + } + }, + "xunit.runner.visualstudio/2.4.5": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/_._": {} + }, + "runtime": { + "lib/netcoreapp3.1/_._": {} + }, + "build": { + "build/netcoreapp3.1/xunit.runner.visualstudio.props": {} + } + } + } + }, + "libraries": { + "coverlet.collector/6.0.0": { + "sha512": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==", + "type": "package", + "path": "coverlet.collector/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/netstandard1.0/Microsoft.Bcl.AsyncInterfaces.dll", + "build/netstandard1.0/Microsoft.CSharp.dll", + "build/netstandard1.0/Microsoft.DotNet.PlatformAbstractions.dll", + "build/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "build/netstandard1.0/Microsoft.Extensions.DependencyInjection.dll", + "build/netstandard1.0/Microsoft.Extensions.DependencyModel.dll", + "build/netstandard1.0/Microsoft.Extensions.FileSystemGlobbing.dll", + "build/netstandard1.0/Microsoft.TestPlatform.CoreUtilities.dll", + "build/netstandard1.0/Microsoft.TestPlatform.PlatformAbstractions.dll", + "build/netstandard1.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "build/netstandard1.0/Mono.Cecil.Mdb.dll", + "build/netstandard1.0/Mono.Cecil.Pdb.dll", + "build/netstandard1.0/Mono.Cecil.Rocks.dll", + "build/netstandard1.0/Mono.Cecil.dll", + "build/netstandard1.0/Newtonsoft.Json.dll", + "build/netstandard1.0/NuGet.Frameworks.dll", + "build/netstandard1.0/System.AppContext.dll", + "build/netstandard1.0/System.Collections.Immutable.dll", + "build/netstandard1.0/System.Dynamic.Runtime.dll", + "build/netstandard1.0/System.IO.FileSystem.Primitives.dll", + "build/netstandard1.0/System.Linq.Expressions.dll", + "build/netstandard1.0/System.Linq.dll", + "build/netstandard1.0/System.ObjectModel.dll", + "build/netstandard1.0/System.Reflection.Emit.ILGeneration.dll", + "build/netstandard1.0/System.Reflection.Emit.Lightweight.dll", + "build/netstandard1.0/System.Reflection.Emit.dll", + "build/netstandard1.0/System.Reflection.Metadata.dll", + "build/netstandard1.0/System.Reflection.TypeExtensions.dll", + "build/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", + "build/netstandard1.0/System.Runtime.Serialization.Primitives.dll", + "build/netstandard1.0/System.Text.RegularExpressions.dll", + "build/netstandard1.0/System.Threading.Tasks.Extensions.dll", + "build/netstandard1.0/System.Threading.dll", + "build/netstandard1.0/System.Xml.ReaderWriter.dll", + "build/netstandard1.0/System.Xml.XDocument.dll", + "build/netstandard1.0/coverlet.collector.deps.json", + "build/netstandard1.0/coverlet.collector.dll", + "build/netstandard1.0/coverlet.collector.pdb", + "build/netstandard1.0/coverlet.collector.targets", + "build/netstandard1.0/coverlet.core.dll", + "build/netstandard1.0/coverlet.core.pdb", + "coverlet-icon.png", + "coverlet.collector.6.0.0.nupkg.sha512", + "coverlet.collector.nuspec" + ] + }, + "Microsoft.CodeCoverage/17.6.0": { + "sha512": "5v2GwzpR7JEuQUzupjx3zLwn2FutADW/weLzLt726DR3WXxsM+ICPoJG6pxuKFsumtZp890UrVuudTUhsE8Qyg==", + "type": "package", + "path": "microsoft.codecoverage/17.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE_NET.txt", + "ThirdPartyNotices.txt", + "build/netstandard2.0/CodeCoverage/CodeCoverage.config", + "build/netstandard2.0/CodeCoverage/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/VanguardInstrumentationProfiler_x86.config", + "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/amd64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll", + "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/arm64/VanguardInstrumentationProfiler_arm64.config", + "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll", + "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll", + "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "build/netstandard2.0/CodeCoverage/covrun32.dll", + "build/netstandard2.0/CodeCoverage/msdia140.dll", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/libInstrumentationEngine.so", + "build/netstandard2.0/InstrumentationEngine/arm64/MicrosoftInstrumentationEngine_arm64.dll", + "build/netstandard2.0/InstrumentationEngine/macos/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/macos/x64/libCoverageInstrumentationMethod.dylib", + "build/netstandard2.0/InstrumentationEngine/macos/x64/libInstrumentationEngine.dylib", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libInstrumentationEngine.so", + "build/netstandard2.0/InstrumentationEngine/x64/MicrosoftInstrumentationEngine_x64.dll", + "build/netstandard2.0/InstrumentationEngine/x86/MicrosoftInstrumentationEngine_x86.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.props", + "build/netstandard2.0/Microsoft.CodeCoverage.targets", + "build/netstandard2.0/Microsoft.DiaSymReader.dll", + "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll", + "build/netstandard2.0/Mono.Cecil.Pdb.dll", + "build/netstandard2.0/Mono.Cecil.Rocks.dll", + "build/netstandard2.0/Mono.Cecil.dll", + "build/netstandard2.0/ThirdPartyNotices.txt", + "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "microsoft.codecoverage.17.6.0.nupkg.sha512", + "microsoft.codecoverage.nuspec" + ] + }, + "Microsoft.NET.Test.Sdk/17.6.0": { + "sha512": "tHyg4C6c89QvLv6Utz3xKlba4EeoyJyIz59Q1NrjRENV7gfGnSE6I+sYPIbVOzQttoo2zpHDgOK/p6Hw2OlD7A==", + "type": "package", + "path": "microsoft.net.test.sdk/17.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE_NET.txt", + "build/net462/Microsoft.NET.Test.Sdk.props", + "build/net462/Microsoft.NET.Test.Sdk.targets", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets", + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props", + "lib/net462/_._", + "lib/netcoreapp3.1/_._", + "microsoft.net.test.sdk.17.6.0.nupkg.sha512", + "microsoft.net.test.sdk.nuspec" + ] + }, + "Microsoft.TestPlatform.ObjectModel/17.6.0": { + "sha512": "AA/rrf5zwC5/OBLEOajkhjbVTM3SvxRXy8kcQ8e4mJKojbyZvqqhpfNg362N9vXU94DLg9NUTFOAnoYVT0pTJw==", + "type": "package", + "path": "microsoft.testplatform.objectmodel/17.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE_NET.txt", + "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "microsoft.testplatform.objectmodel.17.6.0.nupkg.sha512", + "microsoft.testplatform.objectmodel.nuspec" + ] + }, + "Microsoft.TestPlatform.TestHost/17.6.0": { + "sha512": "7YdgUcIeCPVKLC7n7LNKDiEHWc7z3brkkYPdUbDnFsvf6WvY9UfzS0VSUJ8P2NgN0CDSD223GCJFSjSBLZRqOQ==", + "type": "package", + "path": "microsoft.testplatform.testhost/17.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE_NET.txt", + "ThirdPartyNotices.txt", + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props", + "build/netcoreapp3.1/x64/testhost.dll", + "build/netcoreapp3.1/x64/testhost.exe", + "build/netcoreapp3.1/x86/testhost.x86.dll", + "build/netcoreapp3.1/x86/testhost.x86.exe", + "lib/net462/_._", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/testhost.deps.json", + "lib/netcoreapp3.1/testhost.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/x64/msdia140.dll", + "lib/netcoreapp3.1/x86/msdia140.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "microsoft.testplatform.testhost.17.6.0.nupkg.sha512", + "microsoft.testplatform.testhost.nuspec" + ] + }, + "Newtonsoft.Json/13.0.1": { + "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "type": "package", + "path": "newtonsoft.json/13.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.1.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "NuGet.Frameworks/5.11.0": { + "sha512": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==", + "type": "package", + "path": "nuget.frameworks/5.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net40/NuGet.Frameworks.dll", + "lib/net40/NuGet.Frameworks.xml", + "lib/net472/NuGet.Frameworks.dll", + "lib/net472/NuGet.Frameworks.xml", + "lib/netstandard2.0/NuGet.Frameworks.dll", + "lib/netstandard2.0/NuGet.Frameworks.xml", + "nuget.frameworks.5.11.0.nupkg.sha512", + "nuget.frameworks.nuspec" + ] + }, + "System.Reflection.Metadata/1.6.0": { + "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", + "type": "package", + "path": "system.reflection.metadata/1.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.1/System.Reflection.Metadata.dll", + "lib/netstandard1.1/System.Reflection.Metadata.xml", + "lib/netstandard2.0/System.Reflection.Metadata.dll", + "lib/netstandard2.0/System.Reflection.Metadata.xml", + "lib/portable-net45+win8/System.Reflection.Metadata.dll", + "lib/portable-net45+win8/System.Reflection.Metadata.xml", + "system.reflection.metadata.1.6.0.nupkg.sha512", + "system.reflection.metadata.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "xunit.runner.visualstudio/2.4.5": { + "sha512": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==", + "type": "package", + "path": "xunit.runner.visualstudio/2.4.5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "License.txt", + "build/net462/xunit.abstractions.dll", + "build/net462/xunit.runner.reporters.net452.dll", + "build/net462/xunit.runner.utility.net452.dll", + "build/net462/xunit.runner.visualstudio.props", + "build/net462/xunit.runner.visualstudio.testadapter.dll", + "build/netcoreapp3.1/xunit.abstractions.dll", + "build/netcoreapp3.1/xunit.runner.reporters.netcoreapp10.dll", + "build/netcoreapp3.1/xunit.runner.utility.netcoreapp10.dll", + "build/netcoreapp3.1/xunit.runner.visualstudio.dotnetcore.testadapter.dll", + "build/netcoreapp3.1/xunit.runner.visualstudio.props", + "build/uap10.0.16299/xunit.runner.reporters.netstandard15.dll", + "build/uap10.0.16299/xunit.runner.utility.netstandard15.dll", + "build/uap10.0.16299/xunit.runner.utility.uwp10.dll", + "build/uap10.0.16299/xunit.runner.utility.uwp10.pri", + "build/uap10.0.16299/xunit.runner.visualstudio.props", + "build/uap10.0.16299/xunit.runner.visualstudio.targets", + "build/uap10.0.16299/xunit.runner.visualstudio.uwp.testadapter.dll", + "build/uap10.0.16299/xunit.runner.visualstudio.uwp.testadapter.pri", + "lib/net462/_._", + "lib/netcoreapp3.1/_._", + "lib/uap10.0.16299/_._", + "logo-512-transparent.png", + "xunit.runner.visualstudio.2.4.5.nupkg.sha512", + "xunit.runner.visualstudio.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0": [ + "Microsoft.NET.Test.Sdk >= 17.6.0", + "coverlet.collector >= 6.0.0", + "xunit >= 2.4.2", + "xunit.runner.visualstudio >= 2.4.5" + ] + }, + "packageFolders": { + "/home/marek/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj", + "projectName": "xunit", + "projectPath": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj", + "packagesPath": "/home/marek/.nuget/packages/", + "outputPath": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/marek/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.6.0, )" + }, + "coverlet.collector": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[6.0.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.4.2, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[2.4.5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.8, 8.0.8]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.108/PortableRuntimeIdentifierGraph.json" + } + } + }, + "logs": [ + { + "code": "NU1108", + "level": "Error", + "message": "Cycle detected. \n xunit -> xunit (>= 2.4.2).", + "libraryId": "xunit", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file diff --git a/takehome/csharp/xunit/obj/project.nuget.cache b/takehome/csharp/xunit/obj/project.nuget.cache new file mode 100644 index 0000000..f465b29 --- /dev/null +++ b/takehome/csharp/xunit/obj/project.nuget.cache @@ -0,0 +1,29 @@ +{ + "version": 2, + "dgSpecHash": "QHnnVLLCqqDsPvS792An4GE/vwmYnCusuRc6pId62ypX1zkQeG0NfeVJOpOvJ9GtULWLlKiT5tJCLcpFujxKGw==", + "success": false, + "projectFilePath": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj", + "expectedPackageFiles": [ + "/home/marek/.nuget/packages/coverlet.collector/6.0.0/coverlet.collector.6.0.0.nupkg.sha512", + "/home/marek/.nuget/packages/microsoft.codecoverage/17.6.0/microsoft.codecoverage.17.6.0.nupkg.sha512", + "/home/marek/.nuget/packages/microsoft.net.test.sdk/17.6.0/microsoft.net.test.sdk.17.6.0.nupkg.sha512", + "/home/marek/.nuget/packages/microsoft.testplatform.objectmodel/17.6.0/microsoft.testplatform.objectmodel.17.6.0.nupkg.sha512", + "/home/marek/.nuget/packages/microsoft.testplatform.testhost/17.6.0/microsoft.testplatform.testhost.17.6.0.nupkg.sha512", + "/home/marek/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512", + "/home/marek/.nuget/packages/nuget.frameworks/5.11.0/nuget.frameworks.5.11.0.nupkg.sha512", + "/home/marek/.nuget/packages/system.reflection.metadata/1.6.0/system.reflection.metadata.1.6.0.nupkg.sha512", + "/home/marek/.nuget/packages/xunit.runner.visualstudio/2.4.5/xunit.runner.visualstudio.2.4.5.nupkg.sha512", + "/home/marek/.nuget/packages/microsoft.aspnetcore.app.ref/8.0.8/microsoft.aspnetcore.app.ref.8.0.8.nupkg.sha512" + ], + "logs": [ + { + "code": "NU1108", + "level": "Error", + "message": "Cycle detected. \n xunit -> xunit (>= 2.4.2).", + "libraryId": "xunit", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file diff --git a/takehome/csharp/xunit/obj/xunit.csproj.nuget.dgspec.json b/takehome/csharp/xunit/obj/xunit.csproj.nuget.dgspec.json new file mode 100644 index 0000000..f5c5b51 --- /dev/null +++ b/takehome/csharp/xunit/obj/xunit.csproj.nuget.dgspec.json @@ -0,0 +1,89 @@ +{ + "format": 1, + "restore": { + "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj": {} + }, + "projects": { + "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj", + "projectName": "xunit", + "projectPath": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/xunit.csproj", + "packagesPath": "/home/marek/.nuget/packages/", + "outputPath": "/home/marek/code/ai_games_2024/takehome/csharp/xunit/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/marek/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.6.0, )" + }, + "coverlet.collector": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[6.0.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.4.2, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[2.4.5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.8, 8.0.8]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.108/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.props b/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.props new file mode 100644 index 0000000..5ee370e --- /dev/null +++ b/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + False + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/marek/.nuget/packages/ + /home/marek/.nuget/packages/ + PackageReference + 6.8.1 + + + + + + + + + + + \ No newline at end of file diff --git a/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.targets b/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.targets new file mode 100644 index 0000000..e64e919 --- /dev/null +++ b/takehome/csharp/xunit/obj/xunit.csproj.nuget.g.targets @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/takehome/csharp/xunit/xunit.csproj b/takehome/csharp/xunit/xunit.csproj new file mode 100644 index 0000000..22b0134 --- /dev/null +++ b/takehome/csharp/xunit/xunit.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + diff --git a/takehome/rust/Cargo.toml b/takehome/rust/Cargo.toml new file mode 100644 index 0000000..7f0bc71 --- /dev/null +++ b/takehome/rust/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +strum = "0.26.3" +strum_macros = "0.26.3" +rand = "0.8.4" diff --git a/takehome/rust/src/main.rs b/takehome/rust/src/main.rs new file mode 100644 index 0000000..1ab82f5 --- /dev/null +++ b/takehome/rust/src/main.rs @@ -0,0 +1,227 @@ +use rand::{seq::SliceRandom, thread_rng}; +use strum::IntoEnumIterator; +use strum_macros::EnumIter; + +fn main() { + println!("Hello, Lets start a war!"); + + let mut game = Game::new(); + game.play(); +} + +#[derive(Debug)] +struct Player { + hand: Vec, +} + +#[derive(Debug)] +struct Game { + computer_player: Player, + human_player: Player, +} + +// Shuffle the deck +// Ensure the deck is ordered +fn shuffle_deck(deck: &mut Vec) { + //TODO: Currently this is a naive shuffle, we should implement a better shuffle + let mut second_half = deck.split_off(deck.len() / 2); + let mut first_half = deck.split_off(0); + deck.append(&mut second_half); + deck.append(&mut first_half); +} + +impl Game { + fn new() -> Game { + let mut deck = Deck::new(); + + // Shuffle the deck + shuffle_deck(&mut deck.cards); + + // Deal the cards as a human would + /* + let mut card = deck.cards.pop(); + while card.is_some() { + if (deck.cards.len() % 2) == 0 { + computer_hand.push(card.unwrap()); + } else { + human_hand.push(card.unwrap()); + } + card = deck.cards.pop(); + } + */ + + // Deal the cards as twitch chat would + let player_hand = deck.cards.split_off(deck.cards.len() / 2); + let computer_hand = deck.cards.split_off(0); + println!("Player Hand: {:?}", player_hand); + println!("Computer Hand: {:?}", computer_hand); + + Game { + computer_player: Player { + hand: computer_hand, + }, + human_player: Player { hand: player_hand }, + } + } + + fn play(&mut self) { + while !self.human_player.hand.is_empty() && !self.computer_player.hand.is_empty() { + self.play_round(); + } + + // Determine the winner + if self.human_player.hand.is_empty() { + println!("Computer wins!"); + } else { + println!("Player wins!"); + } + } + + fn play_round(&mut self) { + // Compare the cards + // The player with the higher card wins + // If the cards are the same, the player with the higher suit wins + // If the suits are the same, the game is a draw + // If the game is a draw, the cards are added to the bottom of the deck + // If the game is not a draw, the winner takes the cards + // The game continues until one player has all the cards + // The player with all the cards wins + // The game is a draw if the game continues for too long + // Draw a card from each player's hand + let player_card = self.human_player.hand.pop().unwrap(); + let computer_card = self.computer_player.hand.pop().unwrap(); + + println!( + "Player card: {:?} vs {:?} Computer Card", + player_card, computer_card + ); + + // Compare the cards + match player_card.value.cmp(&computer_card.value) { + std::cmp::Ordering::Equal => { + // TODO: Draw, have a WAR. + } + std::cmp::Ordering::Greater => { + self.human_player.hand.push(player_card); + self.human_player.hand.push(computer_card); + } + std::cmp::Ordering::Less => { + self.computer_player.hand.push(player_card); + self.computer_player.hand.push(computer_card); + } + } + } +} + +#[derive(Debug)] +struct Deck { + cards: Vec, +} + +#[derive(Debug, Clone, Copy, PartialEq)] +struct Card { + suit: Suit, + value: CardValue, +} + +#[derive(EnumIter, Debug, PartialEq, Clone, Copy)] +enum Suit { + Spades, + Hearts, + Diamonds, + Clubs, +} + +#[derive(EnumIter, Debug, PartialEq, Clone, Copy, PartialOrd, Eq, Ord)] +enum CardValue { + Two = 2, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + Ten, + Jack, + Queen, + King, + Ace, +} + +impl Deck { + fn new() -> Deck { + let mut cards = Vec::with_capacity(52); + for suit in Suit::iter() { + for value in CardValue::iter() { + cards.push(Card { suit, value }); + } + } + Deck { cards } + } +} + +// Tests +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_deck() { + let deck = Deck::new(); + assert_eq!(deck.cards.len(), 52); + } + + #[test] + fn test_shuffle_deck() { + let mut deck = Deck::new(); + let original_deck = deck.cards.clone(); + shuffle_deck(&mut deck.cards); + + for i in 0..deck.cards.len() { + assert_ne!(deck.cards[i], original_deck[i]); + } + } + + #[test] + fn test_shuffle_two_decks_different() { + let mut deck = Deck::new(); + let mut deck2 = Deck::new(); + shuffle_deck(&mut deck.cards); + shuffle_deck(&mut deck2.cards); + + for i in 0..deck.cards.len() { + assert_ne!(deck.cards[i], deck2.cards[i]); + } + } + + #[test] + fn test_war() { + let mut game = Game::new(); + game.human_player.hand = vec![ + Card { + suit: Suit::Spades, + value: CardValue::Ace, + }, + Card { + suit: Suit::Spades, + value: CardValue::Two, + }, + ]; + game.computer_player.hand = vec![ + Card { + suit: Suit::Hearts, + value: CardValue::Ace, + }, + Card { + suit: Suit::Hearts, + value: CardValue::Two, + }, + ]; + + game.play_round(); + + assert_eq!(game.human_player.hand.len(), 0); + assert_eq!(game.computer_player.hand.len(), 4); + } +}