Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updates solution to build for .NET Core #37

Closed
wants to merge 60 commits into from

Conversation

conniey
Copy link
Contributor

@conniey conniey commented Apr 18, 2017

Description

  • Compiling icu.net.netstandard.csproj results in multiple assemblies that target net40, net451, and netstandard1.6. It is possible to remove icu.net.sln and icu.net.csproj because icu.net.netstandard.csproj builds assemblies that support net40 and more.
  • Would be best to upload NuGet package created from compiling icu.net.netstandard.csproj on Windows because it contains binaries targeting all 3 frameworks. (Located in $\source\NuGetBuild\netstandard)
  • icu.net.netstandard.testrunner.csproj was added because NUnit (through dotnet test) does not work on VS2017, yet. Support for .Net Core projects nunit/nunit3-vs-adapter#297
    • An alternative would be migrate the tests to xunit.

Building on Windows

Prerequisites

Build/Package

  1. Open Visual Studio 2017 Developer Command Prompt
  2. Execute: msbuild /t:Build .\build\icu-dotnet.proj
  3. It should create a package in .source\NuGetBuild\netstandard\ with the appropriate GitVersion.

Test

Option 1

  1. Open Visual Studio 2017 Developer Command Prompt
  2. Execute: msbuild /t:Test .\build\icu-dotnet.proj

Option 2

  1. Open command prompt
  2. cd source\icu.net.netstandard.testrunner\
  3. Execute: dotnet run to run tests
    • dotnet run --project <Full path to csproj>

Building on Linux (tested on Ubuntu 16.04)

Prerequisites

  • sudo apt-get install mono-complete
  • sudo apt-get install libcurl3
  • sudo apt-get install msbuild
  • Install .NET Core. There are 2 ways, using dotnet-install.sh or through apt-get.
    1. Install using apt-get. Benefit is that the .NET CLI is on your path.
      sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
      sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
      sudo apt-get update
      sudo apt-get install dotnet-dev-1.0.3
      
    2. Install using dotnet-install script. Benefit is that you can choose where to install .NET CLI. Downside is that the CLI is not on your path.
      bash <(curl -s https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0/scripts/obtain/dotnet-install.sh) --version 1.0.3

Build/Package/Test

If you installed .NET Core using apt-get

  1. Execute: export DOTNETSDK=/usr/share/dotnet/sdk/1.0.3
  2. Execute: chmod +x build/msbuild.sh
  3. Execute: ./build/msbuild.sh /t:Test build/icu-dotnet.proj

If you installed .NET Core using dotnet-install.sh

  1. Execute: export DOTNETSDK=$HOME/.dotnet/sdk/1.0.3
  2. Execute: export DOTNETCLI=$HOME/.dotnet/dotnet
  3. Execute: chmod +x build/msbuild.sh
  4. Execute: ./build/msbuild.sh /t:Test build/icu-dotnet.proj

Issues

  • Currently GitVersion does not support .NET Core, so I had to hack in the ability to build the package with full MSBuild. After GitVersion is moved to .NET Core, we can remove the dependency on Visual Studio 2017 and just have .NET Core SDK installed.
  • .NET Core on Linux does not support assembly signing, so the builds are not signed when running on Linux. :(

Fixes #23, #8


This change is Reviewable

@ermshiperete
Copy link
Member

@conniey So how do I build this? My usual msbuild /t:Test build\icu-dotnet.proj fails.

@ermshiperete
Copy link
Member

Figured it out. I had to run git clean -dxf to force it to re-download the nuget packages. Now it builds.

@conniey
Copy link
Contributor Author

conniey commented Apr 21, 2017

@ermshiperete

What error are you getting? Do you have Visual Studio 2017 Community Edition installed with .NET Core?

If you execute msbuild /t:Test /p:BuildNetCore=false build\icu-dotnet.proj ... It should build without the tools.

@ermshiperete
Copy link
Member

@conniey Got it working on Windows. Do you know how to build this on Linux?

@ermshiperete
Copy link
Member

Hey, this looks pretty good. Thanks! A few comments.


Reviewed 34 of 34 files at r1.
Review status: all files reviewed at latest revision, 16 unresolved discussions, some commit checks failed.


build/icu-dotnet.proj, line 67 at r1 (raw file):

			Properties="Configuration=$(Configuration)"
			Condition="'$(BuildNetCore)' == 'true'"/>
	</Target>

Can we split this into two/three targets? e.g. Compile, CompileStandard, CompileCore where Compile depends on the other two. That way we could at least build part of this project on Linux, even when we can't yet build everything because of missing compatible msbuild version (unless you know how to build on Linux, of course).x


source/icu.net/NativeMethods.cs, line 83 at r1 (raw file):

		[Flags]
		internal enum LoadLibraryFlags : uint

Can this be private?


source/icu.net/NativeMethods.cs, line 253 at r1 (raw file):

			{
				Trace.TraceWarning("{0} of {1} failed with error {2}",
					IsWindows ? "LoadLibrary" : "dlopen",

This should be LoadLibraryEx now


source/icu.net/NativeMethods.cs, line 254 at r1 (raw file):

				Trace.TraceWarning("{0} of {1} failed with error {2}",
					IsWindows ? "LoadLibrary" : "dlopen",
					libPath, Marshal.GetLastWin32Error());

I'm not familiar how GetLastWin32Error behaves - do we still get the same error message even though we called it already above?


source/icu.net/NativeMethods.NetCore.cs, line 1 at r1 (raw file):

using System;

File should have the copyright header


source/icu.net/NativeMethods.NetCore.cs, line 310 at r1 (raw file):

		/// Returns the result of trying to resolve the icu binary paths.
		/// </summary>
		internal class IcuVersionInfo

Can you move this class to a separate file?


source/icu.net/Platform.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net.netstandard/SortKey.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Collation/Collator.cs, line 268 at r1 (raw file):

#endif

        /// <summary>

Looks like an unintended whitespace change here...


source/icu.net/Exceptions/BreakException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/IDNAException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/MissingResourceException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/RegexException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/SyntaxErrorException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/TransliteratorParseException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


source/icu.net/Exceptions/WarningException.cs, line 1 at r1 (raw file):

using System;

Missing copyright header


Comments from Reviewable

@ermshiperete
Copy link
Member

Can you please rebase on latest master? Thanks!

@conniey
Copy link
Contributor Author

conniey commented Apr 26, 2017

Got it working on Windows. Do you know how to build this on Linux?

Urgh, having troubles building it on Linux due to the GitVersion dependency and full .NET Framework builds.. but I am researching how to build it. In the meantime, I'll split those targets.

Related issues:

@conniey conniey force-pushed the netcore branch 4 times, most recently from 9a709c9 to 7aeabc9 Compare April 28, 2017 23:16
@conniey
Copy link
Contributor Author

conniey commented Apr 28, 2017

Review status: 12 of 39 files reviewed at latest revision, 16 unresolved discussions, some commit checks failed.


source/icu.net/NativeMethods.cs, line 254 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

I'm not familiar how GetLastWin32Error behaves - do we still get the same error message even though we called it already above?

Yes, the error code from GetLastWin32Error will be the same as long as no other native method has set that value. General rule of thumb is to call it immediate after the native function call, just in case another native method, sets the value to something else.

I updated the code. :)


Comments from Reviewable

@conniey
Copy link
Contributor Author

conniey commented Apr 28, 2017

@ermshiperete I updated the PR to support .NET Core building on Linux. The PR description has the updated instructions.

@conniey
Copy link
Contributor Author

conniey commented May 2, 2017

Review status: 12 of 39 files reviewed at latest revision, 16 unresolved discussions, some commit checks failed.


build/icu-dotnet.proj, line 67 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Can we split this into two/three targets? e.g. Compile, CompileStandard, CompileCore where Compile depends on the other two. That way we could at least build part of this project on Linux, even when we can't yet build everything because of missing compatible msbuild version (unless you know how to build on Linux, of course).x

I split these targets into three targets Compile, CompileNetCore and CompileNet40Solution. I also updated the PR description with instructions on how to set-up a build for Linux.


source/icu.net/NativeMethods.cs, line 83 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Can this be private?

Fixed


source/icu.net/NativeMethods.cs, line 253 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

This should be LoadLibraryEx now

Fixed.


source/icu.net/NativeMethods.NetCore.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

File should have the copyright header

Fixed


source/icu.net/NativeMethods.NetCore.cs, line 310 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Can you move this class to a separate file?

Fixed


source/icu.net/Platform.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net.netstandard/SortKey.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Collation/Collator.cs, line 268 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Looks like an unintended whitespace change here...

Fixed


source/icu.net/Exceptions/BreakException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/IDNAException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/MissingResourceException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/RegexException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/SyntaxErrorException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/TransliteratorParseException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


source/icu.net/Exceptions/WarningException.cs, line 1 at r1 (raw file):

Previously, ermshiperete (Eberhard Beilharz) wrote…

Missing copyright header

Fixed


Comments from Reviewable

@ermshiperete ermshiperete added the wip work in progress - don't merge yet label May 6, 2017
@NightOwl888
Copy link
Contributor

@conniey

What more needs to happen to get official .NET Core support? The temporary icu-dotnet package we are using has fallen behind in features.

@conniey
Copy link
Contributor Author

conniey commented Jul 22, 2017

@NightOwl888 Mostly, to get this building on their Jenkins CI. The issue is that msbuild (through mono) has a bunch of bugs so I had created a workaround (ie. msbuild,sh) to build the product.. I had checked back a couple of times to get this building through a released version of mono but encountered these issues:

Since they are fixed now... I'll try again to see if I can clean up/fix the Jenkins CI.

@NightOwl888
Copy link
Contributor

@conniey - Thanks!

@conniey
Copy link
Contributor Author

conniey commented Jul 25, 2017

@ermshiperete
Hey,

The tooling has improved a lot since this PR was opened and I updated it. Would you mind testing it now?

Prerequisites

  1. Install Mono 5.0.1 Stable (5.0.1.1)
  2. Install .NET Core 1.0.4

Build/Test on Linux and Windows

  1. msbuild /t:Build build/icu-dotnet.proj and msbuild /t:Test build/icu-dotnet.proj

NuGet packages
After building, under $/source/NuGetBuild/netstandard/ is icu.net.[version].nupkg, containing assemblies referencing net40, net451 and netstandard1.6.

@NightOwl888
Copy link
Contributor

@conniey

Thanks for doing this. I made a build based on this branch and put together a temporary feed @ (https://www.myget.org/F/lucene-icu-dotnet/api/v2) and integrated with Collation. However, there are a few bugs using my current working branch (https://github.com/NightOwl888/lucenenet/tree/benchmark).

NOTE: I renamed the NuGet package icu-dotnet to ensure we can reference the production .NET Framework version of icu.net when our beta is released, even if this PR isn't pushed to NuGet yet.

Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.TestCollator

.NET Framwork 4.5.1

With your icu-dotnet MyGet feed this test passes, but a build based on this branch gets a "type initialization exception".

Test Name:	TestCollator
Test FullName:	Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.TestCollator
Test Source:	F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\ByTask\TestPerfTasksLogic.cs : line 1008
Test Outcome:	Failed
Test Duration:	0:00:00.11

Result StackTrace:	
at Lucene.Net.Benchmarks.ByTask.Tasks.NewCollationAnalyzerTask.DoLogic() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\NewCollationAnalyzerTask.cs:line 110
   at Lucene.Net.Benchmarks.ByTask.Tasks.PerfTask.RunAndMaybeStats(Boolean reportStats) in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\PerfTask.cs:line 191
   at Lucene.Net.Benchmarks.ByTask.Tasks.TaskSequence.DoSerialTasks() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\TaskSequence.cs:line 231
   at Lucene.Net.Benchmarks.ByTask.Tasks.TaskSequence.DoLogic() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\TaskSequence.cs:line 153
   at Lucene.Net.Benchmarks.ByTask.Tasks.PerfTask.RunAndMaybeStats(Boolean reportStats) in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\PerfTask.cs:line 191
   at Lucene.Net.Benchmarks.ByTask.Utils.Algorithm.Execute() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Utils\Algorithm.cs:line 419
   at Lucene.Net.Benchmarks.ByTask.Benchmark.Execute() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Benchmark.cs:line 88
   at Lucene.Net.Benchmarks.BenchmarkTestCase.execBenchmark(String[] algLines) in F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\BenchmarkTestCase.cs:line 96
   at Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.TestCollator() in F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\ByTask\TestPerfTasksLogic.cs:line 1022
--TypeInitializationException
   at Icu.NativeMethods.uloc_canonicalize(String localeID, IntPtr name, Int32 nameCapacity, ErrorCode& err)
   at Icu.Locale.GetString(GetStringMethod method, String localeId)
   at Icu.Locale.Canonicalize(String localeID)
   at Icu.Collation.RuleBasedCollator.Create(String localeId, Fallback fallback)
   at Icu.Collation.Collator.Create(String localeId, Fallback fallback)
   at Icu.Collation.Collator.Create(CultureInfo cultureInfo, Fallback fallback)
   at Lucene.Net.Benchmarks.ByTask.Tasks.NewCollationAnalyzerTask.CreateAnalyzer(CultureInfo locale, Implementation impl) in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\NewCollationAnalyzerTask.cs:line 86
   at Lucene.Net.Benchmarks.ByTask.Tasks.NewCollationAnalyzerTask.DoLogic() in F:\Projects\lucenenet\src\Lucene.Net.Benchmark\ByTask\Tasks\NewCollationAnalyzerTask.cs:line 103
--ArgumentNullException
   at Microsoft.Extensions.DependencyModel.DependencyContextLoader.Load(Assembly assembly)
   at Microsoft.Extensions.DependencyModel.DependencyContext.LoadDefault()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at Icu.NativeMethodsHelper.TryGetPathFromAssemblyDirectory()
   at Icu.NativeMethodsHelper.GetIcuVersionInfoForNetCoreOrWindows()
   at Icu.NativeMethods.ResetIcuVersionInfo()
   at Icu.NativeMethods..cctor()
Result Message:	
System.Exception : Error creating Analyzer: impl=ICU
  ----> System.TypeInitializationException : The type initializer for 'Icu.NativeMethods' threw an exception.
  ----> System.ArgumentNullException : Value cannot be null.
Parameter name: assembly

.NET Standard 1.5/.NET Core 1.0

On .NET Core 1.0 we get a different error message. In this case the "expected" value (since it is mostly zeros I suspect is the incorrect one) is generated by the RuleBasedCollator.

Test Name:	TestCollator
Test FullName:	Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.TestCollator
Test Source:	F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\ByTask\TestPerfTasksLogic.cs : line 1008
Test Outcome:	Failed
Test Duration:	0:00:00.069

Result StackTrace:	at Lucene.Net.Util.LuceneTestCase.assertEquals(Object expected, Object actual) in F:\Projects\lucenenet\src\Lucene.Net.TestFramework\JavaCompatibility\LuceneTestCase.cs:line 58
at Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.assertEqualCollation(Analyzer a1, Analyzer a2, String text) in F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\ByTask\TestPerfTasksLogic.cs:line 1049
at Lucene.Net.Benchmarks.ByTask.TestPerfTasksLogic.TestCollator() in F:\Projects\lucenenet\src\Lucene.Net.Tests.Benchmark\ByTask\TestPerfTasksLogic.cs:line 1017
Result Message:	Expected: <[2a 5 45 2a 5 4e 2a 5 4e 2a 5 41 2a 5 40 2a 5 51 1 a 1 a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]>
  But was:  <[2a 5 45 2a 5 4e 2a 5 4e 2a 5 41 2a 5 40 2a 5 51 1 a 1 a 0 23 2a 2 2a 5 25 2a 5 28 2a 5 2d 2a 5 20 2a 5 2d 2a 5 22 2a 5 28 2a 5 20 2a 5 2b 2a 2 2a 5 22 2a 5 2e 2a 5 31 2a 5 2f 2a 2 2a 5 1b 2a 5 32 2a 5 25 2a 5 22 2a 5 2f 2a 5 1d 2a 2 2a 5 32 2a 5 24 2a 5 2b 2a 5 2b 2a 5 32 2a 2 2a 5 32 2a 5 33 2a 5 2e 2a 5 22 2a 5 2a 1 25 d 1 2e 0 2a 2 2a 5 21 2a 5 44 2a 5 4d 2a 5 49 2a 5 40 2a 5 4c 2a 5 48 2a 5 4d 2a 2 2a 5 32 2a 5 48 2a 5 52 2a 5 53 2a 5 48 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 22 2a 5 4e 2a 5 4b 2a 5 4e 2a 5 4d 2a 5 48 2a 5 40 2a 5 4b 2a 2 2a 5 31 2a 5 44 2a 5 40 2a 5 4b 2a 5 53 2a 5 58 2a 5 b 2a 2 2a 5 36 2a 5 44 2a 5 52 2a 5 53 2a 2 2a 5 27 2a 5 40 2a 5 51 2a 5 53 2a 5 45 2a 5 4e 2a 5 51 2a 5 43 2a 5 b 2a 2 2a 5 22 2a 5 4e 2a 5 4d 2a 5 4d 2a 5 d 2a 5 b 2a 2 2a 5 4f 2a 5 54 2a 5 51 2a 5 42 2a 5 47 2a 5 40 2a 5 52 2a 5 44 2a 5 43 2a 2 2a 5 10 2a 5 16 2a 5 14 2a 5 b 2a 5 18 2a 5 f 2a 5 f 2a 2 2a 5 52 2a 5 47 2a 5 40 2a 5 51 2a 5 44 2a 5 52 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 53 2a 5 4e 2a 5 42 2a 5 4a 2a 2 2a 5 45 2a 5 4e 2a 5 51 2a 2 2a 5 12 2a 5 b 2a 5 13 2a 5 10 2a 5 15 2a 5 b 2a 5 15 2a 5 11 2a 5 13 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 33 2a 5 47 2a 5 44 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4f 2a 5 40 2a 5 4d 2a 5 58 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4f 2a 5 54 2a 5 51 2a 5 42 2a 5 47 2a 5 40 2a 5 52 2a 5 44 2a 2 2a 5 44 2a 5 50 2a 5 54 2a 5 40 2a 5 4b 2a 5 52 2a 2 2a 5 14 2a 5 d 2a 5 11 2a 2 2a 5 4f 2a 5 42 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 4e 2a 5 54 2a 5 53 2a 5 52 2a 5 53 2a 5 40 2a 5 4d 2a 5 43 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 52 2a 5 47 2a 5 40 2a 5 51 2a 5 44 2a 5 52 2a 5 d 2a 2 2a 2 2a 5 31 2a 5 44 2a 5 54 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 5 2a 5 2 2a 5 12 2a 5 1a 2a 2 2a 2 1 25 25 25 25 25 25 25 13 1 65 65 38 0 42 2a 5 4b 2a 5 4e 2a 5 52 2a 5 44 2a 5 43 2a 5 d 2a 2 2a 2 2a 5 31 2a 5 44 2a 5 54 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 5 2a 5 2 2a 5 12 2a 5 1a 2a 2 2a 2 1 25 25 25 25 25 25 25 25 b 1 65 65 51 0 51 2a 5 44 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4c 2a 5 4e 2a 5 4d 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 33 2a 5 47 2a 5 44 2a 2 2a 5 56 2a 5 40 2a 5 51 2a 5 51 2a 5 40 2a 5 4d 2a 5 53 2a 2 2a 5 56 2a 5 48 2a 5 4b 2a 5 4b 2a 2 2a 5 44 2a 5 4d 2a 5 53 2a 5 48 2a 5 53 2a 5 4b 2a 5 44 2a 2 2a 5 47 2a 5 4e 2a 5 4b 2a 5 43 2a 5 44 2a 5 51 2a 5 52 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 41 2a 5 54 2a 5 58 2a 2 2a 5 4e 2a 5 4d 2a 5 44 2a 5 c 2a 5 47 2a 5 40 2a 5 4b 2a 5 45 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4c 2a 5 4e 2a 5 4d 2a 2 2a 5 52 2a 5 47 2a 5 40 2a 5 51 2a 5 44 2a 2 2a 5 40 2a 5 53 2a 2 2a 5 14 2a 5 d 2a 5 14 2a 5 f 2a 2 2a 5 43 2a 5 4b 2a 5 51 2a 5 52 2a 2 2a 5 4f 2a 5 44 2a 5 51 2a 2 2a 5 45 2a 5 54 2a 5 4b 2a 5 4b 2a 2 2a 5 52 2a 5 47 2a 5 40 2a 5 51 2a 5 44 2a 2 2a 5 45 2a 5 51 2a 5 4e 2a 5 4c 2a 2 2a 5 2c 2a 5 40 2a 5 51 2a 5 42 2a 5 47 2a 2 2a 5 4e 2a 5 4d 2a 5 44 2a 5 b 2a 2 2a 5 10 2a 5 18 2a 5 17 2a 5 17 2a 5 b 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 32 2a 5 44 2a 5 4f 2a 5 53 2a 5 44 2a 5 4c 2a 5 41 2a 5 44 2a 5 51 2a 2 2a 5 4e 2a 5 4d 2a 5 44 2a 5 b 2a 2 2a 5 10 2a 5 18 2a 5 17 2a 5 18 2a 5 b 2a 2 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 5 51 2a 5 44 2a 5 40 2a 5 45 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 40 2a 5 53 2a 2 2a 5 15 2a 5 d 2a 5 14 2a 5 f 2a 2 2a 5 43 2a 5 4b 2a 5 51 2a 5 52 2a 2 2a 5 4f 2a 5 44 2a 5 51 2a 2 2a 5 45 2a 5 54 2a 5 4b 2a 5 4b 2a 2 2a 5 52 2a 5 47 2a 5 40 2a 5 51 2a 5 44 2a 2 2a 5 54 2a 5 4d 2a 5 53 2a 5 48 2a 5 4b 2a 2 2a 5 2c 2a 5 40 2a 5 51 2a 5 42 2a 5 47 2a 2 2a 5 10 2a 5 18 2a 5 18 2a 5 10 2a 5 b 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 5 58 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 5 d 2a 2 2a 2 2a 5 31 2a 5 44 2a 5 54 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 5 2a 5 2 2a 5 12 2a 5 1a 2a 2 2a 2 1 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 19 1 65 65 65 65 65 23 0 4f 2a 5 48 2a 5 42 2a 5 40 2a 5 4b 2a 5 4b 2a 5 58 2a 2 2a 5 51 2a 5 44 2a 5 4f 2a 5 4e 2a 5 51 2a 5 53 2a 5 52 2a 2 2a 5 45 2a 5 48 2a 5 51 2a 5 52 2a 5 53 2a 2 2a 5 50 2a 5 54 2a 5 40 2a 5 51 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 51 2a 5 44 2a 5 52 2a 5 54 2a 5 4b 2a 5 53 2a 5 52 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 4b 2a 5 40 2a 5 53 2a 5 44 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 42 2a 5 47 2a 5 b 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 51 2a 5 44 2a 5 4f 2a 5 4e 2a 5 51 2a 5 53 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 4b 2a 5 48 2a 5 4a 2a 5 44 2a 5 4b 2a 5 58 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 41 2a 5 44 2a 2 2a 5 48 2a 5 52 2a 5 52 2a 5 54 2a 5 44 2a 5 43 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 44 2a 5 40 2a 5 51 2a 5 4b 2a 5 58 2a 2 2a 5 20 2a 5 4f 2a 5 51 2a 5 48 2a 5 4b 2a 2 2a 5 53 2a 5 47 2a 5 48 2a 5 52 2a 2 2a 5 58 2a 5 44 2a 5 40 2a 5 51 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 28 2a 5 53 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 43 2a 5 44 2a 5 4b 2a 5 40 2a 5 58 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 43 2a 5 54 2a 5 44 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 40 2a 5 43 2a 5 4c 2a 5 48 2a 5 4d 2a 5 48 2a 5 52 2a 5 53 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 55 2a 5 44 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 52 2a 5 48 2a 5 43 2a 5 44 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 5 b 2a 2 2a 5 48 2a 5 4d 2a 5 42 2a 5 4b 2a 5 54 2a 5 43 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 43 2a 5 54 2a 5 42 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 40 2a 5 4f 2a 5 4f 2a 5 51 2a 5 40 2a 5 48 2a 5 52 2a 5 40 2a 5 4b 2a 5 52 2a 5 b 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 4d 2a 5 44 2a 5 42 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 2 2a 5 56 2a 5 48 2a 5 53 2a 5 47 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 40 2a 5 42 2a 5 50 2a 5 54 2a 5 48 2a 5 52 2a 5 48 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 5 d 2a 2 2a 2 2a 5 31 2a 5 44 2a 5 54 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 5 2a 5 2 2a 5 12 2a 5 1a 2a 2 2a 2 1 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 1 65 65 65 65 65 65 65 65 13 0 2 2a 5 45 2a 5 54 2a 5 44 2a 5 4b 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 51 2a 5 54 2a 5 4c 2a 5 4e 2a 5 51 2a 5 52 2a 2 2a 5 40 2a 5 52 2a 2 2a 5 43 2a 5 48 2a 5 43 2a 2 2a 5 40 2a 5 4d 2a 2 2a 5 40 2a 5 4d 2a 5 4d 2a 5 4e 2a 5 54 2a 5 4d 2a 5 42 2a 5 44 2a 5 4c 2a 5 44 2a 5 4d 2a 5 53 2a 2 2a 5 58 2a 5 44 2a 5 52 2a 5 53 2a 5 44 2a 5 51 2a 5 43 2a 5 40 2a 5 58 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 4c 2a 5 40 2a 5 4d 2a 5 40 2a 5 46 2a 5 44 2a 5 4c 2a 5 44 2a 5 4d 2a 5 53 2a 2 2a 5 42 2a 5 47 2a 5 40 2a 5 4d 2a 5 46 2a 5 44 2a 5 52 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 20 2a 5 53 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4c 2a 5 44 2a 5 44 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 5 b 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4f 2a 5 40 2a 5 4d 2a 5 58 2a 2 2a 5 4e 2a 5 45 2a 5 45 2a 5 48 2a 5 42 2a 5 48 2a 5 40 2a 5 4b 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 52 2a 5 53 2a 5 4e 2a 5 42 2a 5 4a 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 54 2a 5 4d 2a 5 43 2a 5 44 2a 5 51 2a 5 55 2a 5 40 2a 5 4b 2a 5 54 2a 5 44 2a 5 43 2a 2 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 43 2a 5 4e 2a 5 44 2a 5 52 2a 2 2a 5 4d 2a 5 4e 2a 5 53 2a 2 2a 5 45 2a 5 54 2a 5 4b 2a 5 4b 2a 5 58 2a 2 2a 5 51 2a 5 44 2a 5 45 2a 5 4b 2a 5 44 2a 5 42 2a 5 53 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4f 2a 5 44 2a 5 51 2a 5 45 2a 5 4e 2a 5 51 2a 5 4c 2a 5 40 2a 5 4d 2a 5 42 2a 5 44 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 5 b 2a 2 2a 5 40 2a 5 42 2a 5 42 2a 5 4e 2a 5 51 2a 5 43 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 40 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 5 52 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 38 2a 5 44 2a 5 52 2a 5 53 2a 5 44 2a 5 51 2a 5 43 2a 5 40 2a 5 58 2a 5 b 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 56 2a 5 40 2a 5 52 2a 2 2a 5 44 2a 5 4b 2a 5 44 2a 5 55 2a 5 40 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 42 2a 5 47 2a 5 48 2a 5 44 2a 5 45 2a 2 2a 5 4e 2a 5 4f 2a 5 44 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 4e 2a 5 45 2a 5 45 2a 5 48 2a 5 42 2a 5 44 2a 5 51 2a 5 b 2a 2 2a 5 29 2a 5 44 2a 5 45 2a 5 45 2a 5 44 2a 5 51 2a 5 58 2a 2 2a 5 2b 2a 5 40 2a 5 4d 2a 5 44 2a 5 b 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 40 2a 5 43 2a 5 43 2a 5 44 2a 5 43 2a 2 2a 5 4f 2a 5 4e 2a 5 52 2a 5 48 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 48 2a 5 43 2a 5 44 2a 5 4d 2a 5 53 2a 5 b 2a 2 2a 5 56 2a 5 47 2a 5 48 2a 5 42 2a 5 47 2a 2 2a 5 47 2a 5 40 2a 5 43 2a 2 2a 5 41 2a 5 44 2a 5 44 2a 5 4d 2a 2 2a 5 55 2a 5 40 2a 5 42 2a 5 40 2a 5 4d 2a 5 53 2a 5 d 2a 2 2a 5 28 2a 5 53 2a 2 2a 5 40 2a 5 4b 2a 5 52 2a 5 4e 2a 2 2a 5 42 2a 5 51 2a 5 44 2a 5 40 2a 5 53 2a 5 44 2a 5 43 2a 2 2a 5 45 2a 5 4e 2a 5 54 2a 5 51 2a 2 2a 5 4d 2a 5 44 2a 5 56 2a 2 2a 5 4f 2a 5 4e 2a 5 52 2a 5 48 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 2 2a 5 45 2a 5 4e 2a 5 51 2a 2 2a 5 42 2a 5 47 2a 5 40 2a 5 48 2a 5 51 2a 5 4c 2a 5 44 2a 5 4d 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 4e 2a 5 4f 2a 5 44 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 43 2a 5 48 2a 5 55 2a 5 48 2a 5 52 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 20 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 4f 2a 5 44 2a 5 42 2a 5 54 2a 5 4b 2a 5 40 2a 5 53 2a 5 44 2a 5 43 2a 2 2a 5 40 2a 2 2a 5 4f 2a 5 40 2a 5 51 2a 5 53 2a 5 48 2a 5 40 2a 5 4b 2a 2 2a 5 52 2a 5 4f 2a 5 48 2a 5 4d 2a 5 4e 2a 5 45 2a 5 45 2a 2 2a 5 56 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 4c 2a 5 40 2a 5 4a 2a 5 44 2a 2 2a 5 4c 2a 5 4e 2a 5 52 2a 5 53 2a 2 2a 5 52 2a 5 44 2a 5 4d 2a 5 52 2a 5 44 2a 5 b 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 53 2a 5 51 2a 5 40 2a 5 51 2a 5 58 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 4e 2a 5 4d 2a 5 44 2a 2 2a 5 55 2a 5 40 2a 5 51 2a 5 48 2a 5 40 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 2 2a 5 4e 2a 5 4d 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 5 44 2a 5 53 2a 2 2a 5 51 2a 5 54 2a 5 4c 2a 5 4e 2a 5 51 2a 5 52 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 40 2a 2 2a 5 53 2a 5 4e 2a 5 53 2a 5 40 2a 5 4b 2a 2 2a 5 52 2a 5 4f 2a 5 48 2a 5 4d 2a 5 4e 2a 5 45 2a 5 45 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 32 2a 5 4e 2a 5 4c 2a 5 44 2a 2 2a 5 40 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 5 52 2a 5 b 2a 2 2a 5 47 2a 5 4e 2a 5 56 2a 5 44 2a 5 55 2a 5 44 2a 5 51 2a 5 b 2a 2 2a 5 43 2a 5 48 2a 5 52 2a 5 40 2a 5 46 2a 5 51 2a 5 44 2a 5 44 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 40 2a 5 4d 2a 5 58 2a 2 2a 5 52 2a 5 4f 2a 5 48 2a 5 4d 2a 5 4e 2a 5 45 2a 5 45 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 56 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 41 2a 5 44 2a 2 2a 5 46 2a 5 4e 2a 5 4e 2a 5 43 2a 2 2a 5 52 2a 5 48 2a 5 4d 2a 5 42 2a 5 44 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 40 2a 2 2a 5 52 2a 5 53 2a 5 51 2a 5 4e 2a 5 4d 2a 5 46 2a 2 2a 5 4f 2a 5 51 2a 5 4e 2a 5 45 2a 5 48 2a 5 53 2a 2 2a 5 42 2a 5 44 2a 5 4d 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 45 2a 5 4e 2a 5 51 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 5 b 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 53 2a 5 51 2a 5 48 2a 5 41 2a 5 54 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 40 2a 5 41 2a 5 4e 2a 5 54 2a 5 53 2a 2 2a 5 11 2a 5 f 2a 2 2a 5 4f 2a 5 42 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 44 2a 5 40 2a 5 51 2a 5 4d 2a 5 48 2a 5 4d 2a 5 46 2a 5 52 2a 2 2a 5 4b 2a 5 40 2a 5 52 2a 5 53 2a 2 2a 5 58 2a 5 44 2a 5 40 2a 5 51 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 4 2a 5 28 2a 2 2a 5 53 2a 5 47 2a 5 48 2a 5 4d 2a 5 4a 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 47 2a 5 48 2a 5 46 2a 5 47 2a 5 4b 2a 5 58 2a 2 2a 5 54 2a 5 4d 2a 5 4b 2a 5 48 2a 5 4a 2a 5 44 2a 5 4b 2a 5 58 2a 2 2a 5 53 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 46 2a 5 4e 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 52 2a 5 44 2a 5 4b 2a 5 4b 2a 2 2a 5 52 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 5 b 2a 4 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 2f 2a 5 44 2a 5 51 2a 5 51 2a 5 48 2a 5 4d 2a 2 2a 5 2b 2a 5 4e 2a 5 4d 2a 5 46 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 2b 2a 5 48 2a 5 4f 2a 5 4f 2a 5 44 2a 5 51 2a 2 2a 5 20 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 53 2a 5 48 2a 5 42 2a 5 40 2a 5 4b 2a 5 d 2a 2 2a 5 27 2a 5 44 2a 2 2a 5 50 2a 5 54 2a 5 44 2a 5 52 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 44 2a 5 43 2a 2 2a 5 56 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 56 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 41 2a 5 44 2a 2 2a 5 40 2a 2 2a 5 41 2a 5 44 2a 5 53 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 48 2a 5 4d 2a 5 55 2a 5 44 2a 5 52 2a 5 53 2a 5 4c 2a 5 44 2a 5 4d 2a 5 53 2a 2 2a 5 53 2a 5 47 2a 5 40 2a 5 4d 2a 2 2a 4 2a 5 40 2a 2 2a 5 55 2a 5 44 2a 5 51 2a 5 58 2a 2 2a 5 4f 2a 5 51 2a 5 4e 2a 5 45 2a 5 48 2a 5 53 2a 5 40 2a 5 41 2a 5 4b 2a 5 44 2a 2 2a 5 52 2a 5 44 2a 5 42 2a 5 54 2a 5 51 2a 5 48 2a 5 53 2a 5 48 2a 5 44 2a 5 52 2a 2 2a 5 45 2a 5 48 2a 5 51 2a 5 4c 2a 5 d 2a 4 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 32 2a 5 44 2a 5 55 2a 5 44 2a 5 51 2a 5 40 2a 5 4b 2a 2 2a 5 40 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 4d 2a 5 4e 2a 5 53 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 4d 2a 5 44 2a 5 44 2a 5 43 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 42 2a 5 40 2a 5 52 2a 5 47 2a 5 b 2a 2 2a 5 56 2a 5 47 2a 5 48 2a 5 42 2a 5 47 2a 2 2a 5 4c 2a 5 48 2a 5 46 2a 5 47 2a 5 53 2a 2 2a 5 41 2a 5 44 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4e 2a 5 4d 2a 5 4b 2a 5 58 2a 2 2a 5 51 2a 5 44 2a 5 40 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 52 2a 5 44 2a 5 4b 2a 5 4b 2a 2 2a 5 40 2a 2 2a 5 4f 2a 5 40 2a 5 51 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 40 2a 2 2a 5 52 2a 5 53 2a 5 51 2a 5 4e 2a 5 4d 2a 5 46 2a 2 2a 5 40 2a 5 52 2a 5 52 2a 5 44 2a 5 53 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 21 2a 5 54 2a 5 53 2a 2 2a 5 4e 2a 5 53 2a 5 47 2a 5 44 2a 5 51 2a 5 52 2a 2 2a 5 41 2a 5 44 2a 5 4b 2a 5 48 2a 5 44 2a 5 55 2a 5 44 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4f 2a 5 40 2a 5 4d 2a 5 58 2a 2 2a 5 42 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 55 2a 5 44 2a 5 51 2a 5 58 2a 2 2a 5 56 2a 5 44 2a 5 4b 2a 5 4b 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 52 2a 5 48 2a 5 43 2a 5 44 2a 5 51 2a 5 44 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4e 2a 5 4f 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 52 2a 5 4f 2a 5 48 2a 5 4d 2a 5 4d 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 4e 2a 5 54 2a 5 53 2a 2 2a 5 4f 2a 5 40 2a 5 51 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 5 b 2a 2 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 4e 2a 5 4d 2a 5 44 2a 2 2a 5 51 2a 5 54 2a 5 4c 2a 5 4e 2a 5 51 2a 2 2a 5 52 2a 5 54 2a 5 46 2a 5 46 2a 5 44 2a 5 52 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 44 2a 5 4b 2a 5 4b 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 40 2a 5 41 2a 5 4e 2a 5 54 2a 5 53 2a 2 2a 5 11 2a 5 f 2a 2 2a 5 4f 2a 5 42 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 5 44 2a 5 53 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 2b 2a 5 40 2a 5 51 2a 5 51 2a 5 58 2a 2 2a 5 24 2a 5 42 2a 5 4a 2a 5 44 2a 5 4d 2a 5 45 2a 5 44 2a 5 4b 2a 5 43 2a 5 44 2a 5 51 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 2f 2a 5 51 2a 5 54 2a 5 43 2a 5 44 2a 5 4d 2a 5 53 2a 5 48 2a 5 40 2a 5 4b 2a 5 c 2a 5 21 2a 5 40 2a 5 42 2a 5 47 2a 5 44 2a 2 2a 5 32 2a 5 44 2a 5 42 2a 5 54 2a 5 51 2a 5 48 2a 5 53 2a 5 48 2a 5 44 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 47 2a 5 44 2a 2 2a 5 41 2a 5 44 2a 5 4b 2a 5 48 2a 5 44 2a 5 55 2a 5 44 2a 5 52 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 42 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 47 2a 5 40 2a 5 55 2a 5 44 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 52 2a 5 48 2a 5 43 2a 5 44 2a 5 51 2a 5 44 2a 5 43 2a 2 2a 5 40 2a 2 2a 5 4f 2a 5 40 2a 5 51 2a 5 53 2a 5 48 2a 5 40 2a 5 4b 2a 2 2a 5 52 2a 5 4f 2a 5 48 2a 5 4d 2a 5 4e 2a 5 45 2a 5 45 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4f 2a 5 40 2a 5 52 2a 5 53 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 4 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 41 2a 5 44 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 40 2a 5 52 2a 2 2a 5 4f 2a 5 51 2a 5 4e 2a 5 45 2a 5 48 2a 5 53 2a 5 40 2a 5 41 2a 5 4b 2a 5 44 2a 2 2a 5 40 2a 5 52 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 56 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 47 2a 5 40 2a 5 55 2a 5 44 2a 2 2a 5 45 2a 5 44 2a 5 53 2a 5 42 2a 5 47 2a 5 44 2a 5 43 2a 2 2a 5 40 2a 2 2a 5 41 2a 5 48 2a 5 46 2a 2 2a 5 4f 2a 5 51 2a 5 44 2a 5 4c 2a 5 48 2a 5 54 2a 5 4c 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 5 44 2a 5 53 2a 2 2a 5 4f 2a 5 4b 2a 5 40 2a 5 42 2a 5 44 2a 5 d 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 5 6 2a 5 52 2a 2 2a 5 41 2a 5 4e 2a 5 4e 2a 5 4a 2a 2 2a 5 55 2a 5 40 2a 5 4b 2a 5 54 2a 5 44 2a 2 2a 5 48 2a 5 52 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 10 2a 5 d 2a 5 13 2a 2 2a 5 4c 2a 5 4b 2a 5 4d 2a 2 2a 5 43 2a 5 4b 2a 5 51 2a 2 2a 5 51 2a 5 40 2a 5 4d 2a 5 46 2a 5 44 2a 5 d 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 5 44 2a 5 53 2a 2 2a 5 4f 2a 5 4b 2a 5 40 2a 5 42 2a 5 44 2a 2 2a 5 56 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 4f 2a 5 51 2a 5 4e 2a 5 41 2a 5 40 2a 5 41 2a 5 4b 2a 5 58 2a 2 2a 5 41 2a 5 44 2a 2 2a 5 56 2a 5 4e 2a 5 51 2a 5 53 2a 5 47 2a 2 2a 5 53 2a 5 47 2a 5 51 2a 5 44 2a 5 44 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 12 2a 5 d 2a 5 14 2a 2 2a 5 41 2a 5 48 2a 5 4b 2a 5 48 2a 5 4e 2a 5 4d 2a 2 2a 5 43 2a 5 4b 2a 5 51 2a 5 52 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 44 2a 5 51 2a 5 4c 2a 5 52 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 5 44 2a 5 53 2a 2 2a 5 42 2a 5 40 2a 5 4f 2a 5 48 2a 5 53 2a 5 40 2a 5 4b 2a 5 48 2a 5 59 2a 5 40 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 b 2a 4 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 24 2a 5 42 2a 5 4a 2a 5 44 2a 5 4d 2a 5 45 2a 5 44 2a 5 4b 2a 5 43 2a 5 44 2a 5 51 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 32 2a 5 4e 2a 5 4c 2a 5 44 2a 2 2a 5 40 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 42 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 54 2a 5 52 2a 5 44 2a 2 2a 5 42 2a 5 40 2a 5 4f 2a 5 48 2a 5 53 2a 5 40 2a 5 4b 2a 2 2a 5 52 2a 5 48 2a 5 4d 2a 5 42 2a 5 44 2a 2 2a 5 48 2a 5 53 2a 2 2a 5 4f 2a 5 4b 2a 5 40 2a 5 4d 2a 5 52 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 44 2a 5 57 2a 5 4f 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 46 2a 5 4b 2a 5 4e 2a 5 41 2a 5 40 2a 5 4b 2a 5 4b 2a 5 58 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 4 2a 5 33 2a 5 47 2a 5 44 2a 5 58 2a 2 2a 5 47 2a 5 40 2a 5 55 2a 5 44 2a 2 2a 5 44 2a 5 4d 2a 5 4e 2a 5 51 2a 5 4c 2a 5 4e 2a 5 54 2a 5 52 2a 2 2a 5 48 2a 5 4d 2a 5 53 2a 5 44 2a 5 51 2a 5 4d 2a 5 40 2a 5 4b 2a 2 2a 5 46 2a 5 51 2a 5 4e 2a 5 56 2a 5 53 2a 5 47 2a 2 2a 5 4f 2a 5 4b 2a 5 40 2a 5 4d 2a 5 52 2a 2 2a 5 53 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 53 2a 5 40 2a 5 4a 2a 5 44 2a 5 52 2a 2 2a 5 42 2a 5 40 2a 5 4f 2a 5 48 2a 5 53 2a 5 40 2a 5 4b 2a 5 d 2a 2 2a 5 38 2a 5 4e 2a 5 54 2a 2 2a 5 56 2a 5 40 2a 5 4d 2a 5 53 2a 2 2a 5 58 2a 5 4e 2a 5 54 2a 5 51 2a 2 2a 5 52 2a 5 53 2a 5 4e 2a 5 42 2a 5 4a 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 51 2a 5 44 2a 5 45 2a 5 4b 2a 5 44 2a 5 42 2a 5 53 2a 2 2a 5 51 2a 5 44 2a 5 40 2a 5 4b 2a 5 48 2a 5 52 2a 5 53 2a 5 48 2a 5 42 2a 2 2a 5 55 2a 5 40 2a 5 4b 2a 5 54 2a 5 40 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 44 2a 5 4d 2a 5 47 2a 5 40 2a 5 4d 2a 5 42 2a 5 44 2a 2 2a 5 58 2a 5 4e 2a 5 54 2a 5 51 2a 2 2a 5 40 2a 5 41 2a 5 48 2a 5 4b 2a 5 48 2a 5 53 2a 5 58 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 4c 2a 5 40 2a 5 4a 2a 5 44 2a 2 2a 5 40 2a 5 4b 2a 5 4b 2a 2 2a 5 4a 2a 5 48 2a 5 4d 2a 5 43 2a 5 52 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 44 2a 5 4d 2a 5 43 2a 5 44 2a 5 40 2a 5 55 2a 5 4e 2a 5 51 2a 5 52 2a 2 2a 5 43 2a 5 4e 2a 5 56 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 51 2a 5 4e 2a 5 40 2a 5 43 2a 5 b 2a 4 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 24 2a 5 d 2a 5 25 2a 5 d 2a 2 2a 5 27 2a 5 54 2a 5 53 2a 5 53 2a 5 4e 2a 5 4d 2a 2 2a 5 26 2a 5 51 2a 5 4e 2a 5 54 2a 5 4f 2a 2 2a 5 40 2a 5 4d 2a 5 40 2a 5 4b 2a 5 58 2a 5 52 2a 5 53 2a 2 2a 5 2c 2a 5 48 2a 5 42 2a 5 47 2a 5 40 2a 5 44 2a 5 4b 2a 2 2a 5 2b 2a 5 44 2a 5 56 2a 5 48 2a 5 52 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 4 2a 5 33 2a 5 47 2a 5 44 2a 5 58 2a 5 6 2a 5 55 2a 5 44 2a 2 2a 5 4e 2a 5 54 2a 5 53 2a 5 4b 2a 5 48 2a 5 4d 2a 5 44 2a 5 43 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 45 2a 5 40 2a 5 42 2a 5 53 2a 2 2a 5 53 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 5 58 2a 5 6 2a 5 51 2a 5 44 2a 2 2a 5 48 2a 5 4d 2a 5 55 2a 5 44 2a 5 52 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 47 2a 5 44 2a 5 40 2a 5 55 2a 5 48 2a 5 4b 2a 5 58 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 45 2a 5 54 2a 5 53 2a 5 54 2a 5 51 2a 5 44 2a 5 b 2a 2 2a 5 56 2a 5 47 2a 5 48 2a 5 42 2a 5 47 2a 2 2a 5 46 2a 5 4e 2a 5 44 2a 5 52 2a 2 2a 5 47 2a 5 44 2a 5 40 2a 5 55 2a 5 48 2a 5 4b 2a 5 58 2a 2 2a 5 48 2a 5 4d 2a 5 53 2a 5 4e 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 48 2a 5 4d 2a 5 53 2a 5 44 2a 5 51 2a 5 4d 2a 5 40 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 40 2a 5 4b 2a 2 2a 5 40 2a 5 51 2a 5 44 2a 5 4d 2a 5 40 2a 5 b 2a 4 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 2b 2a 5 44 2a 5 56 2a 5 48 2a 5 52 2a 5 d 2a 2 2a 4 2a 5 d 2a 5 d 2a 5 d 2a 5 33 2a 5 47 2a 5 40 2a 5 53 2a 2 2a 5 43 2a 5 4e 2a 5 44 2a 5 52 2a 2 2a 5 4d 2a 5 4e 2a 5 53 2a 2 2a 5 4f 2a 5 51 2a 5 44 2a 5 42 2a 5 4b 2a 5 54 2a 5 43 2a 5 44 2a 2 2a 5 40 2a 5 42 2a 5 50 2a 5 54 2a 5 48 2a 5 52 2a 5 48 2a 5 53 2a 5 48 2a 5 4e 2a 5 4d 2a 5 52 2a 2 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 43 2a 5 48 2a 5 55 2a 5 44 2a 5 52 2a 5 53 2a 5 48 2a 5 53 2a 5 54 2a 5 51 2a 5 44 2a 5 52 2a 2 2a 5 40 2a 5 4b 2a 5 4e 2a 5 4d 2a 5 46 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 56 2a 5 40 2a 5 58 2a 5 b 2a 4 2a 2 2a 5 47 2a 5 44 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 2b 2a 5 44 2a 5 56 2a 5 48 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 48 2a 5 45 2a 2 2a 5 20 2a 5 4c 2a 5 44 2a 5 51 2a 5 48 2a 5 42 2a 5 40 2a 5 4d 2a 2 2a 5 24 2a 5 57 2a 5 4f 2a 5 51 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 51 2a 5 44 2a 5 43 2a 5 54 2a 5 42 2a 5 44 2a 5 43 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 44 2a 5 57 2a 5 4f 2a 5 4e 2a 5 52 2a 5 54 2a 5 51 2a 5 44 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 41 2a 5 51 2a 5 4e 2a 5 4a 2a 5 44 2a 5 51 2a 5 40 2a 5 46 2a 5 44 2a 2 2a 5 41 2a 5 54 2a 5 52 2a 5 48 2a 5 4d 2a 5 44 2a 5 52 2a 5 52 2a 2 2a 5 41 2a 5 58 2a 2 2a 5 52 2a 5 44 2a 5 4b 2a 5 4b 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 4f 2a 5 40 2a 5 51 2a 5 53 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 52 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 5 b 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 52 2a 5 53 2a 5 4e 2a 5 42 2a 5 4a 2a 2 2a 5 4c 2a 5 48 2a 5 46 2a 5 47 2a 5 53 2a 2 2a 5 41 2a 5 44 2a 5 53 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 51 2a 5 44 2a 5 45 2a 5 4b 2a 5 44 2a 5 42 2a 5 53 2a 2 2a 5 4e 2a 5 53 2a 5 47 2a 5 44 2a 5 51 2a 2 2a 5 40 2a 5 52 2a 5 52 2a 5 44 2a 5 53 2a 5 52 2a 5 b 2a 2 2a 5 52 2a 5 54 2a 5 42 2a 5 47 2a 2 2a 5 40 2a 5 52 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 53 2a 5 51 2a 5 40 2a 5 55 2a 5 44 2a 5 4b 2a 2 2a 5 51 2a 5 44 2a 5 4b 2a 5 40 2a 5 53 2a 5 44 2a 5 43 2a 2 2a 5 52 2a 5 44 2a 5 51 2a 5 55 2a 5 48 2a 5 42 2a 5 44 2a 5 52 2a 2 2a 5 41 2a 5 54 2a 5 52 2a 5 48 2a 5 4d 2a 5 44 2a 5 52 2a 5 52 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 4 2a 5 28 2a 5 53 2a 2 2a 5 42 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 45 2a 5 48 2a 5 4d 2a 5 43 2a 2 2a 5 48 2a 5 53 2a 5 52 2a 2 2a 5 53 2a 5 51 2a 5 54 2a 5 44 2a 2 2a 5 56 2a 5 40 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 4c 2a 5 40 2a 5 51 2a 5 4a 2a 2 2a 5 56 2a 5 48 2a 5 53 2a 5 47 2a 2 2a 5 40 2a 2 2a 5 4b 2a 5 44 2a 5 52 2a 5 52 2a 5 44 2a 5 51 2a 2 2a 5 44 2a 5 57 2a 5 4f 2a 5 4e 2a 5 52 2a 5 54 2a 5 51 2a 5 44 2a 2 2a 5 53 2a 5 4e 2a 2 2a 5 41 2a 5 51 2a 5 4e 2a 5 4a 2a 5 44 2a 5 51 2a 5 40 2a 5 46 2a 5 44 2a 5 d 2a 2 2a 5 33 2a 5 47 2a 5 44 2a 2 2a 5 55 2a 5 40 2a 5 4b 2a 5 54 2a 5 44 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 4e 2a 5 53 2a 5 47 2a 5 44 2a 5 51 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4f 2a 5 4e 2a 5 4d 2a 5 44 2a 5 4d 2a 5 53 2a 5 52 2a 2 2a 5 42 2a 5 4e 2a 5 54 2a 5 4b 2a 5 43 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4c 2a 5 40 2a 5 4d 2a 5 43 2a 2 2a 5 40 2a 2 2a 5 47 2a 5 48 2a 5 46 2a 5 47 2a 5 44 2a 5 51 2a 2 2a 5 4c 2a 5 54 2a 5 4b 2a 5 53 2a 5 48 2a 5 4f 2a 5 4b 2a 5 44 2a 2 2a 5 41 2a 5 44 2a 5 42 2a 5 40 2a 5 54 2a 5 52 2a 5 44 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 5 58 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 52 2a 5 53 2a 5 48 2a 5 53 2a 5 54 2a 5 53 2a 5 44 2a 2 2a 5 40 2a 2 2a 5 47 2a 5 48 2a 5 46 2a 5 47 2a 5 44 2a 5 51 2a 2 2a 5 4f 2a 5 44 2a 5 51 2a 5 42 2a 5 44 2a 5 4d 2a 5 53 2a 5 40 2a 5 46 2a 5 44 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 53 2a 5 4e 2a 5 53 2a 5 40 2a 5 4b 2a 2 2a 5 4e 2a 5 4f 2a 5 44 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 44 2a 5 40 2a 5 51 2a 5 4d 2a 5 48 2a 5 4d 2a 5 46 2a 5 52 2a 2 2a 5 4e 2a 5 45 2a 2 2a 5 53 2a 5 47 2a 5 44 2a 2 2a 5 42 2a 5 4e 2a 5 4c 2a 5 4f 2a 5 40 2a 5 4d 2a 5 58 2a 5 b 2a 4 2a 2 2a 5 47 2a 5 44 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 2b 2a 5 44 2a 5 56 2a 5 48 2a 5 52 2a 2 2a 5 52 2a 5 40 2a 5 48 2a 5 43 2a 2 2a 5 32 2a 5 47 2a 5 44 2a 5 40 2a 5 51 2a 5 52 2a 5 4e 2a 5 4d 2a 2 2a 5 42 2a 5 4e 2a 5 4d 2a 5 53 2a 5 51 2a 5 48 2a 5 41 2a 5 54 2a 5 53 2a 5 44 2a 5 43 2a 2 2a 5 12 2a 5 10 2a 5 15 2a 2 2a 5 4c 2a 5 4b 2a 5 4d 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 40 2a 5 45 2a 5 53 2a 5 44 2a 5 51 2a 5 c 2a 5 53 2a 5 40 2a 5 57 2a 2 2a 5 4e 2a 5 4f 2a 5 44 2a 5 51 2a 5 40 2a 5 53 2a 5 48 2a 5 4d 2a 5 46 2a 2 2a 5 44 2a 5 40 2a 5 51 2a 5 4d 2a 5 48 2a 5 4d 2a 5 46 2a 5 52 2a 5 b 2a 2 2a 5 54 2a 5 4f 2a 2 2a 5 45 2a 5 51 2a 5 4e 2a 5 4c 2a 2 2a 5 40 2a 5 41 2a 5 4e 2a 5 54 2a 5 53 2a 2 2a 5 11 2a 5 f 2a 5 f 2a 2 2a 5 4c 2a 5 4b 2a 5 4d 2a 2 2a 5 43 2a 5 4b 2a 5 51 2a 5 52 2a 2 2a 5 48 2a 5 4d 2a 2 2a 5 10 2a 5 18 2a 5 17 2a 5 14 2a 5 d 2a 2 2a 2 2a 2 2a 2 2a 2 2a 2 2a 5 31 2a 5 44 2a 5 54 2a 5 53 2a 5 44 2a 5 51 2a 2 2a 5 5 2a 5 2 2a 5 12 2a 5 1a 2a 2 2a 2 1 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 10 1 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]>

Lucene.Net.Collation.TestICUCollationDocValuesField.TestRanges

Only fails on .NET Core 1.0. Fails when calling RuleBasedCollator.Compare() on line 117 of TestICUCollationDocValuesField.cs. It is returning -1, when it should be returning +1.

Lucene.Net.Collation.TestICUCollationKeyAnalyzer.TestThreadSafe

Failing on .NET Core 1.0 - throws an exception that cannot be caught in .NET Core and crashes NUnit.

MyGet Feed

I setup a new MyGet account for Lucene.Net so we can have multiple team members manage the feeds. If you don't consider the icu-dotnet feed to be general purpose but specific to the Lucene.Net project, please transfer ownership to the lucenenet account.

You can transfer ownership by logging into MyGet, going to the “icu-dotnet” feed, selecting “FEED SECURITY”, click on “Add feed privileges…”, enter “lucenenet” and select “Owner of this feed”.

All of the URLs, API keys, etc. remain the same and you will still be able to manage packages there and feed owners. But it won't count against your MyGet storage space anymore and we will be able to manage the packages as well.

@NightOwl888
Copy link
Contributor

NightOwl888 commented Aug 4, 2017

BTW - is there any reason this still has a "WIP don't merge yet" label on it?

@ermshiperete
Copy link
Member

@conniey, @NightOwl888 sorry this is taking so long to get to it. I'll have to make some changes to our Jenkins infrastructure in order to be able to build it. Unfortunately I didn't get to it before my vacation and longish time away from the office. I'll try to get to it ASAP, but that'll be another few weeks...

@conniey
Copy link
Contributor Author

conniey commented Aug 7, 2017

@NightOwl888

Hey Shad,

I believe I've fixed the errors you've mentioned. The main issue is that there wasn't a reference to the native icu binaries package. I'll have to double check these on the .NET Core version because I don't have VS2015 installed on this machine.
NightOwl888/lucenenet#1

@NightOwl888
Copy link
Contributor

NightOwl888 commented Oct 20, 2017

@conniey, @ermshiperete

It seems Microsoft is using an approach for multi-targeting platforms that would be beneficial here. Rather than having the end user download all of the low-level dependencies depending on what platform they are on, there are separate NuGet packages containing the platform-specific dependencies.

For example, when you install System.Runtime.Extensions on Windows, it has a dependency on runtime.win.System.Runtime.Extensions. On Linux, it will install runtime.linux.System.Runtime.Extensions.

Couldn't this same approach be used to install the full ICU dependency on Windows, but not install the dependency on Linux (by either omitting the dependency or leaving it empty)? Then the end user won't be burdened with having to download a dependency that may or may not be required depending on their environment.

Sure, we lose the ability to get the "partial" package, but the only concern with that seems to be a bit of disk space. However, with a NuGet package that only installs on Windows, it would be possible to install the dll in a shared location specific to Windows only in the case it is required.

Thoughts?

@ermshiperete
Copy link
Member

@NightOwl888 I wonder how Microsoft does that. I don't see anything in the System.Runtime.Extensions nuget package that would specify that dependency.

If we can get it to work then it'd be a great improvement to the package.

@ermshiperete
Copy link
Member

Thanks @conniey !


Reviewed 3 of 6 files at r2, 19 of 20 files at r3, 1 of 2 files at r4, 4 of 4 files at r5, 7 of 16 files at r6, 13 of 13 files at r7.
Review status: all files reviewed at latest revision, 2 unresolved discussions, some commit checks broke.


build/icu-dotnet.proj, line 82 at r7 (raw file):

		assemblies targeting .NET 4.0, .NET 4.5.1 and .NET Standard 1.6.

		Creates NuGet package that works against all three frameworks. -->

This comment is really helpful. 👍


build/NuGet.targets, line 65 at r7 (raw file):

			Condition="!Exists('$(SolutionPath)')"/>

		<Exec Command='$(DotNetCLI) restore "$(SolutionNetCorePath)"'

One could add the condition: '$(BuildNetCore)' == 'true'


Comments from Reviewable

@ermshiperete
Copy link
Member

The icu.net.netstandard.tests fail if source/icu.net.netstandard.tests/bin/Debug/netcoreapp1.1/lib doesn't exist.


Review status: all files reviewed at latest revision, 2 unresolved discussions, some commit checks broke.


Comments from Reviewable

@ermshiperete
Copy link
Member

I fixed the failing tests. I had to make some changes to the Jenkinsfile to get a successful build on our Jenkins, which I did on the master branch. I rebased your changes and then merged that (PR #59).

@conniey Thanks for your great work and patience! We can finally close this PR!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
wip work in progress - don't merge yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Improve loading of packages for .NET Core
3 participants