Skip to content

Instantly share code, notes, and snippets.

@digitalsanity
Forked from digitalshadow/OpenSimplexNoise.cs
Last active August 29, 2015 14:14
Show Gist options
  • Save digitalsanity/8c89d4c340a91b5b38a4 to your computer and use it in GitHub Desktop.
Save digitalsanity/8c89d4c340a91b5b38a4 to your computer and use it in GitHub Desktop.
/* OpenSimplex Noise in C#
* Ported from https://gist.github.com/KdotJPG/b1270127455a94ac5d19
* and heavily refactored to improve performance. The main difference is that once the
* bit flags are determined, the result is pulled from a lookup table, saving the time
* used deciphering the bit flags again. */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
namespace NoiseTest
{
public class OpenSimplexNoise
{
private const double STRETCH_2D = -0.211324865405187; //(1/Math.sqrt(2+1)-1)/2;
private const double STRETCH_3D = -1.0 / 6.0; //(1/Math.sqrt(3+1)-1)/3;
private const double STRETCH_4D = -0.138196601125011; //(1/Math.sqrt(4+1)-1)/4;
private const double SQUISH_2D = 0.366025403784439; //(Math.sqrt(2+1)-1)/2;
private const double SQUISH_3D = 1.0 / 3.0; //(Math.sqrt(3+1)-1)/3;
private const double SQUISH_4D = 0.309016994374947; //(Math.sqrt(4+1)-1)/4;
private const double NORM_2D = 1.0 / 47.0;
private const double NORM_3D = 1.0 / 103.0;
private const double NORM_4D = 1.0 / 30.0;
private byte[] perm;
private byte[] perm2D;
private byte[] perm3D;
private byte[] perm4D;
private static double[] gradients2D = new double[]
{
5, 2, 2, 5,
-5, 2, -2, 5,
5, -2, 2, -5,
-5, -2, -2, -5,
};
private static double[] gradients3D =
{
-11, 4, 4, -4, 11, 4, -4, 4, 11,
11, 4, 4, 4, 11, 4, 4, 4, 11,
-11, -4, 4, -4, -11, 4, -4, -4, 11,
11, -4, 4, 4, -11, 4, 4, -4, 11,
-11, 4, -4, -4, 11, -4, -4, 4, -11,
11, 4, -4, 4, 11, -4, 4, 4, -11,
-11, -4, -4, -4, -11, -4, -4, -4, -11,
11, -4, -4, 4, -11, -4, 4, -4, -11,
};
private static double[] gradients4D =
{
3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3,
-3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3,
3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3,
-3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, 1, -1, -1, 1, 3,
3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3,
-3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3,
3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3,
-3, -1, -1, 1, -1, -3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3,
3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3,
-3, 1, 1, -1, -1, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3,
3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3,
-3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3,
3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3,
-3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3,
3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, -1, 1, -1, -1, -3,
-3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3,
};
private static Contribution2[][] contributions2D;
private static Contribution3[][] contributions3D;
private static Contribution4[][] contributions4D;
static OpenSimplexNoise()
{
var base2D = new int[][]
{
new int[] { 1, 1, 0, 1, 0, 1, 0, 0, 0 },
new int[] { 1, 1, 0, 1, 0, 1, 2, 1, 1 }
};
var permutations2D = new int[][]
{
new int[] { 0, 0, 1, -1, 0, -1, 1, 2, 1, 1 },
new int[] { 1, 2, 2, 0, 2, 0, 2, 0, 0, 0 }
};
contributions2D = new Contribution2[base2D.Length][];
for (int i = 0; i < base2D.Length; i++)
{
var permutations = permutations2D[i];
var set = base2D[permutations[0]];
var contributions = new Contribution2[permutations.Length / 3];
for (int j = 1; j < permutations.Length; j += 3)
{
Contribution2 previous = null, current = null;
for (int k = 0; k < set.Length; k += 3)
{
current = new Contribution2(set[k], set[k + 1], set[k + 2]);
if (previous == null)
{
contributions[j / 3] = current;
}
else
{
previous.Next = current;
}
previous = current;
}
current.Next = new Contribution2(permutations[j], permutations[j + 1], permutations[j + 2]);
}
contributions2D[i] = contributions;
}
var base3D = new int[][]
{
new int[] { 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1 },
new int[] { 2, 1, 1, 0, 2, 1, 0, 1, 2, 0, 1, 1, 3, 1, 1, 1 },
new int[] { 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 0, 2, 1, 0, 1, 2, 0, 1, 1 }
};
var permutations3D = new int[][]
{
new int[] { 0 ,0, -1, 0, 0, 0, 0, -1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 0, -1, 1, 0, 0, 0, 1, -1, 0, 1, 1, 0, 0, 1, 1, -1, 0, -1, 0, 1, 0, 0, -1, 1, 0, 1, -1, 1, 0, 1, 0, 1, 0, -1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 },
new int[] { 0 ,2, 0, 0, 0, 1, -1, -1, -1, 2, 1, 0, 0, 1, 1, -1, -1, 2, 0, 1, 0, 1, -1, 1, -1, 2, 1, 1, 0, 1, 1, 1, -1, 2, 0, 0, 1, 1, -1, -1, 1, 2, 1, 0, 1, 1, 1, -1, 1, 2, 0, 1, 1, 1, -1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 },
new int[] { 1 ,3, 0, 0, 0, 3, 0, 0, 0, 3, 2, 0, 0, 3, 1, 0, 0, 3, 0, 2, 0, 3, 0, 1, 0, 3, 2, 1, 0, 3, 1, 2, 0, 3, 0, 0, 1, 3, 0, 0, 2, 3, 2, 0, 1, 3, 1, 0, 2, 3, 0, 2, 1, 3, 0, 1, 2, 3, 2, 1, 1, 3, 1, 2, 2 },
new int[] { 1 ,1, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 0, 0, 1, 2, 0, 0, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2 },
new int[] { 2 ,0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 1, 1, 1, -1, 3, 1, 1, 1, 2, 0, 0, 2, 3, 1, 1, 1, 2, 2, 0, 0, 3, 1, 1, 1, 2, 0, 2, 0, 3, 1, 1, 1, 2, 2, 0, 0 },
new int[] { 2 ,1, -1, 1, 1, 2, 0, 0, 2, 1, -1, 1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 2, 0, 1, -1, 1, 1, 2, 2, 0, 0, 1, 1, -1, 1, 2, 0, 0, 2, 1, 1, -1, 1, 2, 2, 0, 0, 1, 1, -1, 1, 2, 0, 2, 0, 1, 1, -1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 0, 2, 1, -1, 1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 2, 0, 1, -1, 1, 1, 2, 2, 0, 0, 1, 1, 1, -1, 2, 0, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 1, 1, 1, -1, 2, 0, 2, 0, 1, 1, 1, -1, 2, 2, 0, 0 }
};
contributions3D = new Contribution3[permutations3D.Length][];
for (int i = 0; i < permutations3D.Length; i++)
{
var permutations = permutations3D[i];
var set = base3D[permutations[0]];
var contributions = new Contribution3[permutations.Length / 8];
for (int j = 1; j < permutations.Length; j += 8)
{
Contribution3 previous = null, current = null;
for (int k = 0; k < set.Length; k += 4)
{
current = new Contribution3(set[k], set[k + 1], set[k + 2], set[k + 3]);
if (previous == null)
{
contributions[j / 8] = current;
}
else
{
previous.Next = current;
}
previous = current;
}
current.Next = new Contribution3(permutations[j], permutations[j + 1], permutations[j + 2], permutations[j + 3]);
current.Next.Next = new Contribution3(permutations[j + 4], permutations[j + 5], permutations[j + 6], permutations[j + 7]);
}
contributions3D[i] = contributions;
}
var base4D = new int[][]
{
new int[] { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 },
new int[] { 3, 1, 1, 1, 0, 3, 1, 1, 0, 1, 3, 1, 0, 1, 1, 3, 0, 1, 1, 1, 4, 1, 1, 1, 1 },
new int[] { 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 2, 1, 1, 0, 0, 2, 1, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 1, 0, 2, 0, 1, 0, 1, 2, 0, 0, 1, 1 },
new int[] { 3, 1, 1, 1, 0, 3, 1, 1, 0, 1, 3, 1, 0, 1, 1, 3, 0, 1, 1, 1, 2, 1, 1, 0, 0, 2, 1, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 1, 0, 2, 0, 1, 0, 1, 2, 0, 0, 1, 1 }
};
var permutations4D = new int[][]
{
new int[] { 0 ,0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, -1, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, 1, 1, -1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, -1, 0, -1, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 1, -1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, -1, 0, -1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, -1, 0, -1, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 0, -1, 1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, 0, 1, 0, 0, 1, 0, -1, 1, 0, 1, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 1, 0, 0, 0, 1, 1, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, -1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 },
new int[] { 0 ,2, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 1, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 1, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 1, 1, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 1, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 1, 1, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 1, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 1, 1, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 1, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
new int[] { 1 ,4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 2, 0, 0, 0, 4, 1, 0, 0, 0, 4, 1, 0, 0, 0, 4, 0, 2, 0, 0, 4, 0, 1, 0, 0, 4, 0, 1, 0, 0, 4, 2, 1, 0, 0, 4, 1, 2, 0, 0, 4, 1, 1, 0, 0, 4, 0, 0, 2, 0, 4, 0, 0, 1, 0, 4, 0, 0, 1, 0, 4, 2, 0, 1, 0, 4, 1, 0, 2, 0, 4, 1, 0, 1, 0, 4, 0, 2, 1, 0, 4, 0, 1, 2, 0, 4, 0, 1, 1, 0, 4, 2, 1, 1, 0, 4, 1, 2, 1, 0, 4, 1, 1, 2, 0, 4, 0, 0, 0, 1, 4, 0, 0, 0, 1, 4, 0, 0, 0, 2, 4, 2, 0, 0, 1, 4, 1, 0, 0, 1, 4, 1, 0, 0, 2, 4, 0, 2, 0, 1, 4, 0, 1, 0, 1, 4, 0, 1, 0, 2, 4, 2, 1, 0, 1, 4, 1, 2, 0, 1, 4, 1, 1, 0, 2, 4, 0, 0, 2, 1, 4, 0, 0, 1, 1, 4, 0, 0, 1, 2, 4, 2, 0, 1, 1, 4, 1, 0, 2, 1, 4, 1, 0, 1, 2, 4, 0, 2, 1, 1, 4, 0, 1, 2, 1, 4, 0, 1, 1, 2, 4, 2, 1, 1, 1, 4, 1, 2, 1, 1, 4, 1, 1, 2, 2 },
new int[] { 1 ,2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 0, 0, 0, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 1, 0, 0, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 0, 0, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 0, 0, 1, 0, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 0, 1, 0, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 0, 1, 1, 0, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, 0, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 0, 0, 0, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 0, 0, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 0, 1, 0, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 0, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 0, 0, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 0, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 0, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2 },
new int[] { 2 ,3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0 },
new int[] { 2 ,1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 0, 0, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
new int[] { 2 ,1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0 },
new int[] { 3 ,1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1 },
new int[] { 3 ,3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 4, 1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 4, 1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 4, 1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 4, 1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 4, 1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 4, 1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 4, 1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 4, 1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 4, 1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 4, 1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 4, 1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 4, 1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 4, 1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 4, 1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 4, 1, 1, 1, 1 },
new int[] { 3 ,3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, -1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, -1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, -1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, -1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, -1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, -1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, -1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, -1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, -1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, -1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, -1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, -1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, -1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, -1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, -1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, -1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, 1, -1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, 1, -1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 1, -1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, 1, -1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, 1, -1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, 1, -1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, -1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, 1, -1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, 1, -1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, 1, -1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 1, -1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, 1, -1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, 1, -1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, 1, -1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, -1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, 1, -1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, -1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, -1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, -1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, -1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, -1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, -1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, -1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, -1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, -1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, -1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, -1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, -1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, -1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, -1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, -1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, -1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, 1, -1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, 1, -1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 1, -1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, 1, -1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, 1, -1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, 1, -1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, -1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, 1, -1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, 1, -1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, 1, -1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 1, -1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, 1, -1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, 1, -1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, 1, -1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, -1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, 1, -1 }
};
contributions4D = new Contribution4[permutations4D.Length][];
for (int i = 0; i < permutations4D.Length; i++)
{
var permutations = permutations4D[i];
var set = base4D[permutations[0]];
var contributions = new Contribution4[permutations.Length / 15];
for (int j = 1; j < permutations.Length; j += 15)
{
Contribution4 previous = null, current = null;
for (int k = 0; k < set.Length; k += 5)
{
current = new Contribution4(set[k], set[k + 1], set[k + 2], set[k + 3], set[k + 4]);
if (previous == null)
{
contributions[j / 15] = current;
}
else
{
previous.Next = current;
}
previous = current;
}
current.Next = new Contribution4(permutations[j], permutations[j + 1], permutations[j + 2], permutations[j + 3], permutations[j + 4]);
current.Next.Next = new Contribution4(permutations[j + 5], permutations[j + 6], permutations[j + 7], permutations[j + 8], permutations[j + 9]);
current.Next.Next.Next = new Contribution4(permutations[j + 10], permutations[j + 11], permutations[j + 12], permutations[j + 13], permutations[j + 14]);
}
contributions4D[i] = contributions;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int FastFloor(double x)
{
var xi = (int)x;
return x < xi ? xi - 1 : xi;
}
public OpenSimplexNoise()
: this(DateTime.Now.Ticks)
{
}
public OpenSimplexNoise(long seed)
{
perm = new byte[256];
perm2D = new byte[256];
perm3D = new byte[256];
perm4D = new byte[256];
var source = new byte[256];
for (int i = 0; i < 256; i++)
{
source[i] = (byte)i;
}
seed = seed * 6364136223846793005L + 1442695040888963407L;
seed = seed * 6364136223846793005L + 1442695040888963407L;
seed = seed * 6364136223846793005L + 1442695040888963407L;
for (int i = 255; i >= 0; i--)
{
seed = seed * 6364136223846793005L + 1442695040888963407L;
int r = (int)((seed + 31) % (i + 1));
if (r < 0)
{
r += (i + 1);
}
perm[i] = source[r];
perm2D[i] = (byte)(perm[i] & 0x0E);
perm3D[i] = (byte)((perm[i] % 24) * 3);
perm4D[i] = (byte)(perm[i] & 0xFC);
source[r] = source[i];
}
}
public double Evaluate(double x, double y)
{
var stretchOffset = (x + y) * STRETCH_2D;
var xs = x + stretchOffset;
var ys = y + stretchOffset;
var xsb = FastFloor(xs);
var ysb = FastFloor(ys);
var squishOffset = (xsb + ysb) * SQUISH_2D;
var xb = xsb + squishOffset;
var yb = ysb + squishOffset;
var dx0 = x - xb;
var dy0 = y - yb;
var xins = xs - xsb;
var yins = ys - ysb;
Contribution2 c;
var inSum = xins + yins;
if (inSum <= 1)
{
var zins = 1 - inSum;
if (zins > xins || zins > yins)
{
if (xins > yins)
{
c = contributions2D[0][0];
}
else
{
c = contributions2D[0][1];
}
}
else
{
c = contributions2D[0][2];
}
}
else
{
var zins = 2 - inSum;
if (zins < xins || zins < yins)
{
if (xins > yins)
{
c = contributions2D[1][0];
}
else
{
c = contributions2D[1][1];
}
}
else
{
c = contributions2D[1][2];
}
}
var value = 0.0;
while (c != null)
{
var dx = dx0 + c.dx;
var dy = dy0 + c.dy;
var attn = 2 - dx * dx - dy * dy;
if (attn > 0)
{
var px = xsb + c.xsb;
var py = ysb + c.ysb;
var i = perm2D[(perm[px & 0xFF] + py) & 0xFF];
var valuePart = gradients2D[i] * dx + gradients2D[i + 1] * dy;
attn *= attn;
value += attn * attn * valuePart;
}
c = c.Next;
}
return value * NORM_2D;
}
public double Evaluate(double x, double y, double z)
{
var stretchOffset = (x + y + z) * STRETCH_3D;
var xs = x + stretchOffset;
var ys = y + stretchOffset;
var zs = z + stretchOffset;
var xsb = FastFloor(xs);
var ysb = FastFloor(ys);
var zsb = FastFloor(zs);
var squishOffset = (xsb + ysb + zsb) * SQUISH_3D;
var xb = xsb + squishOffset;
var yb = ysb + squishOffset;
var zb = zsb + squishOffset;
var dx0 = x - xb;
var dy0 = y - yb;
var dz0 = z - zb;
var xins = xs - xsb;
var yins = ys - ysb;
var zins = zs - zsb;
Contribution3 c;
var inSum = xins + yins + zins;
if (inSum <= 1)
{
var aPoint = 0x01;
var aScore = xins;
var bPoint = 0x02;
var bScore = yins;
if (aScore >= bScore && zins > bScore)
{
bScore = zins;
bPoint = 0x04;
}
else if (aScore < bScore && zins > aScore)
{
aScore = zins;
aPoint = 0x04;
}
var wins = 1 - inSum;
if (wins > aScore || wins > bScore)
{
c = contributions3D[0][bScore > aScore ? bPoint : aPoint];
}
else
{
c = contributions3D[1][aPoint | bPoint];
}
}
else if (inSum >= 2)
{
var aPoint = 0x06;
var aScore = xins;
var bPoint = 0x05;
var bScore = yins;
if (aScore <= bScore && zins < bScore)
{
bScore = zins;
bPoint = 0x03;
}
else if (aScore > bScore && zins < aScore)
{
aScore = zins;
aPoint = 0x03;
}
var wins = 3 - inSum;
if (wins < aScore || wins < bScore)
{
c = contributions3D[2][bScore < aScore ? bPoint : aPoint];
}
else
{
c = contributions3D[3][aPoint & bPoint];
}
}
else
{
byte aPoint;
bool aIsFurtherSide;
byte bPoint;
bool bIsFurtherSide;
var p1 = xins + yins;
if (p1 > 1)
{
p1 = p1 - 1;
aPoint = 0x03;
aIsFurtherSide = true;
}
else
{
p1 = 1 - p1;
aPoint = 0x04;
aIsFurtherSide = false;
}
var p2 = xins + zins;
if (p2 > 1)
{
p2 = p2 - 1;
bPoint = 0x05;
bIsFurtherSide = true;
}
else
{
p2 = 1 - p2;
bPoint = 0x02;
bIsFurtherSide = false;
}
var p3 = yins + zins;
if (p3 > 1)
{
p3 = p3 - 1;
if (p1 <= p2 && p1 < p3)
{
aPoint = 0x06;
aIsFurtherSide = true;
}
else if (p1 > p2 && p2 < p3)
{
bPoint = 0x06;
bIsFurtherSide = true;
}
}
else
{
p3 = 1 - p3;
if (p1 <= p2 && p1 < p3)
{
aPoint = 0x01;
aIsFurtherSide = false;
}
else if (p1 > p2 && p2 < p3)
{
bPoint = 0x01;
bIsFurtherSide = false;
}
}
if (aIsFurtherSide == bIsFurtherSide)
{
c = contributions3D[4][aIsFurtherSide ? ((aPoint & bPoint) & 0x03) | 0x4 : (aPoint | bPoint) & 0x03];
}
else
{
if (aIsFurtherSide)
{
c = contributions3D[5][((aPoint & 0x03) << 2) | (bPoint & 0x03)];
}
else
{
c = contributions3D[5][((bPoint & 0x03) << 2) | (aPoint & 0x03)];
}
}
}
var value = 0.0;
while (c != null)
{
var dx = dx0 + c.dx;
var dy = dy0 + c.dy;
var dz = dz0 + c.dz;
var attn = 2 - dx * dx - dy * dy - dz * dz;
if (attn > 0)
{
var px = xsb + c.xsb;
var py = ysb + c.ysb;
var pz = zsb + c.zsb;
var i = perm3D[(perm[(perm[px & 0xFF] + py) & 0xFF] + pz) & 0xFF];
var valuePart = gradients3D[i] * dx + gradients3D[i + 1] * dy + gradients3D[i + 2] * dz;
attn *= attn;
value += attn * attn * valuePart;
}
c = c.Next;
}
return value * NORM_3D;
}
public double Evaluate(double x, double y, double z, double w)
{
var stretchOffset = (x + y + z + w) * STRETCH_4D;
var xs = x + stretchOffset;
var ys = y + stretchOffset;
var zs = z + stretchOffset;
var ws = w + stretchOffset;
var xsb = FastFloor(xs);
var ysb = FastFloor(ys);
var zsb = FastFloor(zs);
var wsb = FastFloor(ws);
var squishOffset = (xsb + ysb + zsb + wsb) * SQUISH_4D;
var xb = xsb + squishOffset;
var yb = ysb + squishOffset;
var zb = zsb + squishOffset;
var wb = wsb + squishOffset;
var dx0 = x - xb;
var dy0 = y - yb;
var dz0 = z - zb;
var dw0 = w - wb;
var xins = xs - xsb;
var yins = ys - ysb;
var zins = zs - zsb;
var wins = ws - wsb;
double aScore, bScore;
int aPoint, bPoint;
Contribution4 c;
var inSum = xins + yins + zins + wins;
if (inSum <= 1)
{
aPoint = 0x01;
aScore = xins;
bPoint = 0x02;
bScore = yins;
if (aScore >= bScore && zins > bScore)
{
bScore = zins;
bPoint = 0x04;
}
else if (aScore < bScore && zins > aScore)
{
aScore = zins;
aPoint = 0x04;
}
if (aScore >= bScore && wins > bScore)
{
bScore = wins;
bPoint = 0x08;
}
else if (aScore < bScore && wins > aScore)
{
aScore = wins;
aPoint = 0x08;
}
var uins = 1 - inSum;
if (uins > aScore || uins > bScore)
{
c = contributions4D[0][bScore > aScore ? bPoint : aPoint];
}
else
{
c = contributions4D[1][aPoint | bPoint];
}
}
else if (inSum >= 3)
{
aPoint = 0x0E;
aScore = xins;
bPoint = 0x0D;
bScore = yins;
if (aScore <= bScore && zins < bScore)
{
bScore = zins;
bPoint = 0x0B;
}
else if (aScore > bScore && zins < aScore)
{
aScore = zins;
aPoint = 0x0B;
}
if (aScore <= bScore && wins < bScore)
{
bScore = wins;
bPoint = 0x07;
}
else if (aScore > bScore && wins < aScore)
{
aScore = wins;
aPoint = 0x07;
}
var uins = 4 - inSum;
if (uins < aScore || uins < bScore)
{
c = contributions4D[2][bScore < aScore ? bPoint : aPoint];
}
else
{
c = contributions4D[3][aPoint & bPoint];
}
}
else if (inSum <= 2)
{
var aIsBiggerSide = true;
var bIsBiggerSide = true;
if (xins + yins > zins + wins)
{
aScore = xins + yins;
aPoint = 0x03;
}
else
{
aScore = zins + wins;
aPoint = 0x0C;
}
if (xins + zins > yins + wins)
{
bScore = xins + zins;
bPoint = 0x05;
}
else
{
bScore = yins + wins;
bPoint = 0x0A;
}
if (xins + wins > yins + zins)
{
var score = xins + wins;
if (aScore >= bScore && score > bScore)
{
bScore = score;
bPoint = 0x09;
}
else if (aScore < bScore && score > aScore)
{
aScore = score;
aPoint = 0x09;
}
}
else
{
var score = yins + zins;
if (aScore >= bScore && score > bScore)
{
bScore = score;
bPoint = 0x06;
}
else if (aScore < bScore && score > aScore)
{
aScore = score;
aPoint = 0x06;
}
}
var p1 = 2 - inSum + xins;
if (aScore >= bScore && p1 > bScore)
{
bScore = p1;
bPoint = 0x01;
bIsBiggerSide = false;
}
else if (aScore < bScore && p1 > aScore)
{
aScore = p1;
aPoint = 0x01;
aIsBiggerSide = false;
}
var p2 = 2 - inSum + yins;
if (aScore >= bScore && p2 > bScore)
{
bScore = p2;
bPoint = 0x02;
bIsBiggerSide = false;
}
else if (aScore < bScore && p2 > aScore)
{
aScore = p2;
aPoint = 0x02;
aIsBiggerSide = false;
}
var p3 = 2 - inSum + zins;
if (aScore >= bScore && p3 > bScore)
{
bScore = p3;
bPoint = 0x04;
bIsBiggerSide = false;
}
else if (aScore < bScore && p3 > aScore)
{
aScore = p3;
aPoint = 0x04;
aIsBiggerSide = false;
}
var p4 = 2 - inSum + wins;
if (aScore >= bScore && p4 > bScore)
{
bScore = p4;
bPoint = 0x08;
bIsBiggerSide = false;
}
else if (aScore < bScore && p4 > aScore)
{
aScore = p4;
aPoint = 0x08;
aIsBiggerSide = false;
}
if (aIsBiggerSide == bIsBiggerSide)
{
if (aIsBiggerSide)
{
c = contributions4D[4][((aPoint | bPoint) & 0x0F) | ((aPoint & bPoint) << 4)];
}
else
{
c = contributions4D[5][aPoint | bPoint];
}
}
else
{
if (aIsBiggerSide)
{
c = contributions4D[6][(aPoint & 0x0F) | (bPoint << 4)];
}
else
{
c = contributions4D[6][(bPoint & 0x0F) | (aPoint << 4)];
}
}
}
else
{
var aIsBiggerSide = true;
var bIsBiggerSide = true;
if (xins + yins < zins + wins)
{
aScore = xins + yins;
aPoint = 0x0C;
}
else
{
aScore = zins + wins;
aPoint = 0x03;
}
if (xins + zins < yins + wins)
{
bScore = xins + zins;
bPoint = 0x0A;
}
else
{
bScore = yins + wins;
bPoint = 0x05;
}
if (xins + wins < yins + zins)
{
var score = xins + wins;
if (aScore <= bScore && score < bScore)
{
bScore = score;
bPoint = 0x06;
}
else if (aScore > bScore && score < aScore)
{
aScore = score;
aPoint = 0x06;
}
}
else
{
var score = yins + zins;
if (aScore <= bScore && score < bScore)
{
bScore = score;
bPoint = 0x09;
}
else if (aScore > bScore && score < aScore)
{
aScore = score;
aPoint = 0x09;
}
}
var p1 = 3 - inSum + xins;
if (aScore <= bScore && p1 < bScore)
{
bScore = p1;
bPoint = 0x0E;
bIsBiggerSide = false;
}
else if (aScore > bScore && p1 < aScore)
{
aScore = p1;
aPoint = 0x0E;
aIsBiggerSide = false;
}
var p2 = 3 - inSum + yins;
if (aScore <= bScore && p2 < bScore)
{
bScore = p2;
bPoint = 0x0D;
bIsBiggerSide = false;
}
else if (aScore > bScore && p2 < aScore)
{
aScore = p2;
aPoint = 0x0D;
aIsBiggerSide = false;
}
var p3 = 3 - inSum + zins;
if (aScore <= bScore && p3 < bScore)
{
bScore = p3;
bPoint = 0x0B;
bIsBiggerSide = false;
}
else if (aScore > bScore && p3 < aScore)
{
aScore = p3;
aPoint = 0x0B;
aIsBiggerSide = false;
}
var p4 = 3 - inSum + wins;
if (aScore <= bScore && p4 < bScore)
{
bScore = p4;
bPoint = 0x07;
bIsBiggerSide = false;
}
else if (aScore > bScore && p4 < aScore)
{
aScore = p4;
aPoint = 0x07;
aIsBiggerSide = false;
}
if (aIsBiggerSide == bIsBiggerSide)
{
if (aIsBiggerSide)
{
c = contributions4D[7][((aPoint & bPoint) & 0x0F) | ((aPoint | bPoint) << 4)];
}
else
{
c = contributions4D[8][aPoint & bPoint];
}
}
else
{
if (aIsBiggerSide)
{
c = contributions4D[9][(aPoint & 0x0F) | (bPoint << 4)];
}
else
{
c = contributions4D[9][(bPoint & 0x0F) | (aPoint << 4)];
}
}
}
var value = 0.0;
while (c != null)
{
var dx = dx0 + c.dx;
var dy = dy0 + c.dy;
var dz = dz0 + c.dz;
var dw = dw0 + c.dw;
var attn = 2 - dx * dx - dy * dy - dz * dz - dw * dw;
if (attn > 0)
{
var px = xsb + c.xsb;
var py = ysb + c.ysb;
var pz = zsb + c.zsb;
var pw = wsb + c.wsb;
var i = perm4D[(perm[(perm[(perm[px & 0xFF] + py) & 0xFF] + pz) & 0xFF] + pw) & 0xFF];
var valuePart = gradients4D[i] * dx + gradients4D[i + 1] * dy + gradients4D[i + 2] * dz + gradients4D[i + 3] * dw;
attn *= attn;
value += attn * attn * valuePart;
}
c = c.Next;
}
return value * NORM_4D;
}
private class Contribution2
{
public double dx, dy;
public int xsb, ysb;
public Contribution2 Next;
public Contribution2(double multiplier, int xsb, int ysb)
{
dx = -xsb - multiplier * SQUISH_2D;
dy = -ysb - multiplier * SQUISH_2D;
this.xsb = xsb;
this.ysb = ysb;
}
}
private class Contribution3
{
public double dx, dy, dz;
public int xsb, ysb, zsb;
public Contribution3 Next;
public Contribution3(double multiplier, int xsb, int ysb, int zsb)
{
dx = -xsb - multiplier * SQUISH_3D;
dy = -ysb - multiplier * SQUISH_3D;
dz = -zsb - multiplier * SQUISH_3D;
this.xsb = xsb;
this.ysb = ysb;
this.zsb = zsb;
}
}
private class Contribution4
{
public double dx, dy, dz, dw;
public int xsb, ysb, zsb, wsb;
public Contribution4 Next;
public Contribution4(double multiplier, int xsb, int ysb, int zsb, int wsb)
{
dx = -xsb - multiplier * SQUISH_4D;
dy = -ysb - multiplier * SQUISH_4D;
dz = -zsb - multiplier * SQUISH_4D;
dw = -wsb - multiplier * SQUISH_4D;
this.xsb = xsb;
this.ysb = ysb;
this.zsb = zsb;
this.wsb = wsb;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment