using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Euler
{
class ProblemEight
{
static byte[] input = new byte[] { 7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2, 4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6, 7, 4, 4, 2, 6, 5, 7, 4, 7, 4, 2, 3, 5, 5, 3, 4, 9, 1, 9, 4, 9, 3, 4, 9, 6, 9, 8, 3, 5, 2, 0, 3, 1, 2, 7, 7, 4, 5, 0, 6, 3, 2, 6, 2, 3, 9, 5, 7, 8, 3, 1, 8, 0, 1, 6, 9, 8, 4, 8, 0, 1, 8, 6, 9, 4, 7, 8, 8, 5, 1, 8, 4, 3, 8, 5, 8, 6, 1, 5, 6, 0, 7, 8, 9, 1, 1, 2, 9, 4, 9, 4, 9, 5, 4, 5, 9, 5, 0, 1, 7, 3, 7, 9, 5, 8, 3, 3, 1, 9, 5, 2, 8, 5, 3, 2, 0, 8, 8, 0, 5, 5, 1, 1, 1, 2, 5, 4, 0, 6, 9, 8, 7, 4, 7, 1, 5, 8, 5, 2, 3, 8, 6, 3, 0, 5, 0, 7, 1, 5, 6, 9, 3, 2, 9, 0, 9, 6, 3, 2, 9, 5, 2, 2, 7, 4, 4, 3, 0, 4, 3, 5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5, 0, 4, 4, 5, 2, 4, 4, 5, 2, 3, 1, 6, 1, 7, 3, 1, 8, 5, 6, 4, 0, 3, 0, 9, 8, 7, 1, 1, 1, 2, 1, 7, 2, 2, 3, 8, 3, 1, 1, 3, 6, 2, 2, 2, 9, 8, 9, 3, 4, 2, 3, 3, 8, 0, 3, 0, 8, 1, 3, 5, 3, 3, 6, 2, 7, 6, 6, 1, 4, 2, 8, 2, 8, 0, 6, 4, 4, 4, 4, 8, 6, 6, 4, 5, 2, 3, 8, 7, 4, 9, 3, 0, 3, 5, 8, 9, 0, 7, 2, 9, 6, 2, 9, 0, 4, 9, 1, 5, 6, 0, 4, 4, 0, 7, 7, 2, 3, 9, 0, 7, 1, 3, 8, 1, 0, 5, 1, 5, 8, 5, 9, 3, 0, 7, 9, 6, 0, 8, 6, 6, 7, 0, 1, 7, 2, 4, 2, 7, 1, 2, 1, 8, 8, 3, 9, 9, 8, 7, 9, 7, 9, 0, 8, 7, 9, 2, 2, 7, 4, 9, 2, 1, 9, 0, 1, 6, 9, 9, 7, 2, 0, 8, 8, 8, 0, 9, 3, 7, 7, 6, 6, 5, 7, 2, 7, 3, 3, 3, 0, 0, 1, 0, 5, 3, 3, 6, 7, 8, 8, 1, 2, 2, 0, 2, 3, 5, 4, 2, 1, 8, 0, 9, 7, 5, 1, 2, 5, 4, 5, 4, 0, 5, 9, 4, 7, 5, 2, 2, 4, 3, 5, 2, 5, 8, 4, 9, 0, 7, 7, 1, 1, 6, 7, 0, 5, 5, 6, 0, 1, 3, 6, 0, 4, 8, 3, 9, 5, 8, 6, 4, 4, 6, 7, 0, 6, 3, 2, 4, 4, 1, 5, 7, 2, 2, 1, 5, 5, 3, 9, 7, 5, 3, 6, 9, 7, 8, 1, 7, 9, 7, 7, 8, 4, 6, 1, 7, 4, 0, 6, 4, 9, 5, 5, 1, 4, 9, 2, 9, 0, 8, 6, 2, 5, 6, 9, 3, 2, 1, 9, 7, 8, 4, 6, 8, 6, 2, 2, 4, 8, 2, 8, 3, 9, 7, 2, 2, 4, 1, 3, 7, 5, 6, 5, 7, 0, 5, 6, 0, 5, 7, 4, 9, 0, 2, 6, 1, 4, 0, 7, 9, 7, 2, 9, 6, 8, 6, 5, 2, 4, 1, 4, 5, 3, 5, 1, 0, 0, 4, 7, 4, 8, 2, 1, 6, 6, 3, 7, 0, 4, 8, 4, 4, 0, 3, 1, 9, 9, 8, 9, 0, 0, 0, 8, 8, 9, 5, 2, 4, 3, 4, 5, 0, 6, 5, 8, 5, 4, 1, 2, 2, 7, 5, 8, 8, 6, 6, 6, 8, 8, 1, 1, 6, 4, 2, 7, 1, 7, 1, 4, 7, 9, 9, 2, 4, 4, 4, 2, 9, 2, 8, 2, 3, 0, 8, 6, 3, 4, 6, 5, 6, 7, 4, 8, 1, 3, 9, 1, 9, 1, 2, 3, 1, 6, 2, 8, 2, 4, 5, 8, 6, 1, 7, 8, 6, 6, 4, 5, 8, 3, 5, 9, 1, 2, 4, 5, 6, 6, 5, 2, 9, 4, 7, 6, 5, 4, 5, 6, 8, 2, 8, 4, 8, 9, 1, 2, 8, 8, 3, 1, 4, 2, 6, 0, 7, 6, 9, 0, 0, 4, 2, 2, 4, 2, 1, 9, 0, 2, 2, 6, 7, 1, 0, 5, 5, 6, 2, 6, 3, 2, 1, 1, 1, 1, 1, 0, 9, 3, 7, 0, 5, 4, 4, 2, 1, 7, 5, 0, 6, 9, 4, 1, 6, 5, 8, 9, 6, 0, 4, 0, 8, 0, 7, 1, 9, 8, 4, 0, 3, 8, 5, 0, 9, 6, 2, 4, 5, 5, 4, 4, 4, 3, 6, 2, 9, 8, 1, 2, 3, 0, 9, 8, 7, 8, 7, 9, 9, 2, 7, 2, 4, 4, 2, 8, 4, 9, 0, 9, 1, 8, 8, 8, 4, 5, 8, 0, 1, 5, 6, 1, 6, 6, 0, 9, 7, 9, 1, 9, 1, 3, 3, 8, 7, 5, 4, 9, 9, 2, 0, 0, 5, 2, 4, 0, 6, 3, 6, 8, 9, 9, 1, 2, 5, 6, 0, 7, 1, 7, 6, 0, 6, 0, 5, 8, 8, 6, 1, 1, 6, 4, 6, 7, 1, 0, 9, 4, 0, 5, 0, 7, 7, 5, 4, 1, 0, 0, 2, 2, 5, 6, 9, 8, 3, 1, 5, 5, 2, 0, 0, 0, 5, 5, 9, 3, 5, 7, 2, 9, 7, 2, 5, 7, 1, 6, 3, 6, 2, 6, 9, 5, 6, 1, 8, 8, 2, 6, 7, 0, 4, 2, 8, 2, 5, 2, 4, 8, 3, 6, 0, 0, 8, 2, 3, 2, 5, 7, 5, 3, 0, 4, 2, 0, 7, 5, 2, 9, 6, 3, 4, 5, 0 };
static long product, max = 0;
public static void SolutionEight()
{
for (short i = 0; i < 987; i++)
{
product = (long)input[i]
* input[i + 1]
* input[i + 2]
* input[i + 3]
* input[i + 4]
* input[i + 5]
* input[i + 6]
* input[i + 7]
* input[i + 8]
* input[i + 9]
* input[i + 10]
* input[i + 11]
* input[i + 12];
max = product > max ? product : max;
}
// Console.WriteLine(max);
}
public static void SolutionEight2()
{
var threads = 8;// Environment.ProcessorCount / 2;
int windowSize = 1000 / threads;
var tasks = new Task<long>[threads];
for (int i = 0; i < threads; i++)
{
int windowStart = i;
tasks[windowStart] = Task<long>.Run(() => { return GetMax(windowStart * windowSize, (windowStart + 1) * windowSize - ((windowStart == threads - 1) ? 12 : 0)); });
}
long max = 0;
foreach (var task in tasks)
{
var result = task.Result;
max = max > result ? max : result;
}
// Console.WriteLine(max);
}
static public long GetMax(int start, int end)
{
long max = 0;
for (int i = start; i < end - 12; i++)
{
if (HasZero(i)) continue;
// Optimised as suggested by @Falco
if (i > 0 && input[i - 1] > input[i + 12]) continue;
// Optimised as suggestd by @domi1819
long product = (long)(input[i]
* input[i + 1]
* input[i + 2]
* input[i + 3]
* input[i + 4]
* input[i + 5]
* input[i + 6])
* (input[i + 7]
* input[i + 8]
* input[i + 9]
* input[i + 10]
* input[i + 11]
* input[i + 12]);
max = product > max ? product : max;
}
return max;
}
static bool HasZero(int i)
{
return !(input[i] != 0 &&
input[i + 1] != 0 &&
input[i + 2] != 0 &&
input[i + 3] != 0 &&
input[i + 4] != 0 &&
input[i + 5] != 0 &&
input[i + 6] != 0 &&
input[i + 7] != 0 &&
input[i + 8] != 0 &&
input[i + 9] != 0 &&
input[i + 10] != 0 &&
input[i + 11] != 0 &&
input[i + 12] != 0);
}
}
class Program
{
static void Main(string[] args)
{
ProblemEight.SolutionEight();
ProblemEight.SolutionEight2();
Run(ProblemEight.SolutionEight);
Run(ProblemEight.SolutionEight2);
}
static void Run(Action action) {
var timer = new Stopwatch();
timer.Start();
for (int i = 0; i < 20000; i++)
{
action();
}
timer.Stop();
Console.WriteLine(timer.ElapsedMilliseconds);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CgpuYW1lc3BhY2UgRXVsZXIKewogICAgY2xhc3MgUHJvYmxlbUVpZ2h0CiAgICB7CiAgICAgICAgc3RhdGljIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW10geyA3LCAzLCAxLCA2LCA3LCAxLCA3LCA2LCA1LCAzLCAxLCAzLCAzLCAwLCA2LCAyLCA0LCA5LCAxLCA5LCAyLCAyLCA1LCAxLCAxLCA5LCA2LCA3LCA0LCA0LCAyLCA2LCA1LCA3LCA0LCA3LCA0LCAyLCAzLCA1LCA1LCAzLCA0LCA5LCAxLCA5LCA0LCA5LCAzLCA0LCA5LCA2LCA5LCA4LCAzLCA1LCAyLCAwLCAzLCAxLCAyLCA3LCA3LCA0LCA1LCAwLCA2LCAzLCAyLCA2LCAyLCAzLCA5LCA1LCA3LCA4LCAzLCAxLCA4LCAwLCAxLCA2LCA5LCA4LCA0LCA4LCAwLCAxLCA4LCA2LCA5LCA0LCA3LCA4LCA4LCA1LCAxLCA4LCA0LCAzLCA4LCA1LCA4LCA2LCAxLCA1LCA2LCAwLCA3LCA4LCA5LCAxLCAxLCAyLCA5LCA0LCA5LCA0LCA5LCA1LCA0LCA1LCA5LCA1LCAwLCAxLCA3LCAzLCA3LCA5LCA1LCA4LCAzLCAzLCAxLCA5LCA1LCAyLCA4LCA1LCAzLCAyLCAwLCA4LCA4LCAwLCA1LCA1LCAxLCAxLCAxLCAyLCA1LCA0LCAwLCA2LCA5LCA4LCA3LCA0LCA3LCAxLCA1LCA4LCA1LCAyLCAzLCA4LCA2LCAzLCAwLCA1LCAwLCA3LCAxLCA1LCA2LCA5LCAzLCAyLCA5LCAwLCA5LCA2LCAzLCAyLCA5LCA1LCAyLCAyLCA3LCA0LCA0LCAzLCAwLCA0LCAzLCA1LCA1LCA3LCA2LCA2LCA4LCA5LCA2LCA2LCA0LCA4LCA5LCA1LCAwLCA0LCA0LCA1LCAyLCA0LCA0LCA1LCAyLCAzLCAxLCA2LCAxLCA3LCAzLCAxLCA4LCA1LCA2LCA0LCAwLCAzLCAwLCA5LCA4LCA3LCAxLCAxLCAxLCAyLCAxLCA3LCAyLCAyLCAzLCA4LCAzLCAxLCAxLCAzLCA2LCAyLCAyLCAyLCA5LCA4LCA5LCAzLCA0LCAyLCAzLCAzLCA4LCAwLCAzLCAwLCA4LCAxLCAzLCA1LCAzLCAzLCA2LCAyLCA3LCA2LCA2LCAxLCA0LCAyLCA4LCAyLCA4LCAwLCA2LCA0LCA0LCA0LCA0LCA4LCA2LCA2LCA0LCA1LCAyLCAzLCA4LCA3LCA0LCA5LCAzLCAwLCAzLCA1LCA4LCA5LCAwLCA3LCAyLCA5LCA2LCAyLCA5LCAwLCA0LCA5LCAxLCA1LCA2LCAwLCA0LCA0LCAwLCA3LCA3LCAyLCAzLCA5LCAwLCA3LCAxLCAzLCA4LCAxLCAwLCA1LCAxLCA1LCA4LCA1LCA5LCAzLCAwLCA3LCA5LCA2LCAwLCA4LCA2LCA2LCA3LCAwLCAxLCA3LCAyLCA0LCAyLCA3LCAxLCAyLCAxLCA4LCA4LCAzLCA5LCA5LCA4LCA3LCA5LCA3LCA5LCAwLCA4LCA3LCA5LCAyLCAyLCA3LCA0LCA5LCAyLCAxLCA5LCAwLCAxLCA2LCA5LCA5LCA3LCAyLCAwLCA4LCA4LCA4LCAwLCA5LCAzLCA3LCA3LCA2LCA2LCA1LCA3LCAyLCA3LCAzLCAzLCAzLCAwLCAwLCAxLCAwLCA1LCAzLCAzLCA2LCA3LCA4LCA4LCAxLCAyLCAyLCAwLCAyLCAzLCA1LCA0LCAyLCAxLCA4LCAwLCA5LCA3LCA1LCAxLCAyLCA1LCA0LCA1LCA0LCAwLCA1LCA5LCA0LCA3LCA1LCAyLCAyLCA0LCAzLCA1LCAyLCA1LCA4LCA0LCA5LCAwLCA3LCA3LCAxLCAxLCA2LCA3LCAwLCA1LCA1LCA2LCAwLCAxLCAzLCA2LCAwLCA0LCA4LCAzLCA5LCA1LCA4LCA2LCA0LCA0LCA2LCA3LCAwLCA2LCAzLCAyLCA0LCA0LCAxLCA1LCA3LCAyLCAyLCAxLCA1LCA1LCAzLCA5LCA3LCA1LCAzLCA2LCA5LCA3LCA4LCAxLCA3LCA5LCA3LCA3LCA4LCA0LCA2LCAxLCA3LCA0LCAwLCA2LCA0LCA5LCA1LCA1LCAxLCA0LCA5LCAyLCA5LCAwLCA4LCA2LCAyLCA1LCA2LCA5LCAzLCAyLCAxLCA5LCA3LCA4LCA0LCA2LCA4LCA2LCAyLCAyLCA0LCA4LCAyLCA4LCAzLCA5LCA3LCAyLCAyLCA0LCAxLCAzLCA3LCA1LCA2LCA1LCA3LCAwLCA1LCA2LCAwLCA1LCA3LCA0LCA5LCAwLCAyLCA2LCAxLCA0LCAwLCA3LCA5LCA3LCAyLCA5LCA2LCA4LCA2LCA1LCAyLCA0LCAxLCA0LCA1LCAzLCA1LCAxLCAwLCAwLCA0LCA3LCA0LCA4LCAyLCAxLCA2LCA2LCAzLCA3LCAwLCA0LCA4LCA0LCA0LCAwLCAzLCAxLCA5LCA5LCA4LCA5LCAwLCAwLCAwLCA4LCA4LCA5LCA1LCAyLCA0LCAzLCA0LCA1LCAwLCA2LCA1LCA4LCA1LCA0LCAxLCAyLCAyLCA3LCA1LCA4LCA4LCA2LCA2LCA2LCA4LCA4LCAxLCAxLCA2LCA0LCAyLCA3LCAxLCA3LCAxLCA0LCA3LCA5LCA5LCAyLCA0LCA0LCA0LCAyLCA5LCAyLCA4LCAyLCAzLCAwLCA4LCA2LCAzLCA0LCA2LCA1LCA2LCA3LCA0LCA4LCAxLCAzLCA5LCAxLCA5LCAxLCAyLCAzLCAxLCA2LCAyLCA4LCAyLCA0LCA1LCA4LCA2LCAxLCA3LCA4LCA2LCA2LCA0LCA1LCA4LCAzLCA1LCA5LCAxLCAyLCA0LCA1LCA2LCA2LCA1LCAyLCA5LCA0LCA3LCA2LCA1LCA0LCA1LCA2LCA4LCAyLCA4LCA0LCA4LCA5LCAxLCAyLCA4LCA4LCAzLCAxLCA0LCAyLCA2LCAwLCA3LCA2LCA5LCAwLCAwLCA0LCAyLCAyLCA0LCAyLCAxLCA5LCAwLCAyLCAyLCA2LCA3LCAxLCAwLCA1LCA1LCA2LCAyLCA2LCAzLCAyLCAxLCAxLCAxLCAxLCAxLCAwLCA5LCAzLCA3LCAwLCA1LCA0LCA0LCAyLCAxLCA3LCA1LCAwLCA2LCA5LCA0LCAxLCA2LCA1LCA4LCA5LCA2LCAwLCA0LCAwLCA4LCAwLCA3LCAxLCA5LCA4LCA0LCAwLCAzLCA4LCA1LCAwLCA5LCA2LCAyLCA0LCA1LCA1LCA0LCA0LCA0LCAzLCA2LCAyLCA5LCA4LCAxLCAyLCAzLCAwLCA5LCA4LCA3LCA4LCA3LCA5LCA5LCAyLCA3LCAyLCA0LCA0LCAyLCA4LCA0LCA5LCAwLCA5LCAxLCA4LCA4LCA4LCA0LCA1LCA4LCAwLCAxLCA1LCA2LCAxLCA2LCA2LCAwLCA5LCA3LCA5LCAxLCA5LCAxLCAzLCAzLCA4LCA3LCA1LCA0LCA5LCA5LCAyLCAwLCAwLCA1LCAyLCA0LCAwLCA2LCAzLCA2LCA4LCA5LCA5LCAxLCAyLCA1LCA2LCAwLCA3LCAxLCA3LCA2LCAwLCA2LCAwLCA1LCA4LCA4LCA2LCAxLCAxLCA2LCA0LCA2LCA3LCAxLCAwLCA5LCA0LCAwLCA1LCAwLCA3LCA3LCA1LCA0LCAxLCAwLCAwLCAyLCAyLCA1LCA2LCA5LCA4LCAzLCAxLCA1LCA1LCAyLCAwLCAwLCAwLCA1LCA1LCA5LCAzLCA1LCA3LCAyLCA5LCA3LCAyLCA1LCA3LCAxLCA2LCAzLCA2LCAyLCA2LCA5LCA1LCA2LCAxLCA4LCA4LCAyLCA2LCA3LCAwLCA0LCAyLCA4LCAyLCA1LCAyLCA0LCA4LCAzLCA2LCAwLCAwLCA4LCAyLCAzLCAyLCA1LCA3LCA1LCAzLCAwLCA0LCAyLCAwLCA3LCA1LCAyLCA5LCA2LCAzLCA0LCA1LCAwIH07CiAgICAgICAgc3RhdGljIGxvbmcgcHJvZHVjdCwgbWF4ID0gMDsKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU29sdXRpb25FaWdodCgpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHNob3J0IGkgPSAwOyBpIDwgOTg3OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb2R1Y3QgPSAobG9uZylpbnB1dFtpXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDFdCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgMl0KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyAzXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDRdCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgNV0KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyA2XQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDddCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgOF0KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyA5XQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDEwXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDExXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDEyXTsKICAgICAgICAgICAgICAgIG1heCA9IHByb2R1Y3QgPiBtYXggPyBwcm9kdWN0IDogbWF4OwogICAgICAgICAgICB9Ci8vICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUobWF4KTsKICAgICAgICB9CgoKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU29sdXRpb25FaWdodDIoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRocmVhZHMgPSA4Oy8vIEVudmlyb25tZW50LlByb2Nlc3NvckNvdW50IC8gMjsKICAgICAgICAgICAgaW50IHdpbmRvd1NpemUgPSAxMDAwIC8gdGhyZWFkczsKICAgICAgICAgICAgdmFyIHRhc2tzID0gbmV3IFRhc2s8bG9uZz5bdGhyZWFkc107CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkczsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgd2luZG93U3RhcnQgPSBpOwogICAgICAgICAgICAgICAgdGFza3Nbd2luZG93U3RhcnRdID0gVGFzazxsb25nPi5SdW4oKCkgPT4geyByZXR1cm4gR2V0TWF4KHdpbmRvd1N0YXJ0ICogd2luZG93U2l6ZSwgKHdpbmRvd1N0YXJ0ICsgMSkgKiB3aW5kb3dTaXplIC0gKCh3aW5kb3dTdGFydCA9PSB0aHJlYWRzIC0gMSkgPyAxMiA6IDApKTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9uZyBtYXggPSAwOwogICAgICAgICAgICBmb3JlYWNoICh2YXIgdGFzayBpbiB0YXNrcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhc2suUmVzdWx0OwogICAgICAgICAgICAgICAgbWF4ID0gbWF4ID4gcmVzdWx0ID8gbWF4IDogcmVzdWx0OwogICAgICAgICAgICB9Ci8vICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUobWF4KTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBwdWJsaWMgbG9uZyBHZXRNYXgoaW50IHN0YXJ0LCBpbnQgZW5kKQogICAgICAgIHsKICAgICAgICAgICAgbG9uZyBtYXggPSAwOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kIC0gMTI7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEhhc1plcm8oaSkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgLy8gT3B0aW1pc2VkIGFzIHN1Z2dlc3RlZCBieSBARmFsY28KICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBpbnB1dFtpIC0gMV0gPiBpbnB1dFtpICsgMTJdKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAvLyBPcHRpbWlzZWQgYXMgc3VnZ2VzdGQgYnkgQGRvbWkxODE5CiAgICAgICAgICAgICAgICBsb25nIHByb2R1Y3QgPSAobG9uZykoaW5wdXRbaV0KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyAxXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDJdCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgM10KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyA0XQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDVdCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgNl0pCiAgICAgICAgICAgICAgICAgICAgKiAoaW5wdXRbaSArIDddCiAgICAgICAgICAgICAgICAgICAgKiBpbnB1dFtpICsgOF0KICAgICAgICAgICAgICAgICAgICAqIGlucHV0W2kgKyA5XQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDEwXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDExXQogICAgICAgICAgICAgICAgICAgICogaW5wdXRbaSArIDEyXSk7CgogICAgICAgICAgICAgICAgbWF4ID0gcHJvZHVjdCA+IG1heCA/IHByb2R1Y3QgOiBtYXg7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICByZXR1cm4gbWF4OwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGJvb2wgSGFzWmVybyhpbnQgaSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAhKGlucHV0W2ldICE9IDAgJiYKICAgICAgICAgICAgICAgICAgIGlucHV0W2kgKyAxXSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICBpbnB1dFtpICsgMl0gIT0gMCAmJgogICAgICAgICAgICAgICAgICAgaW5wdXRbaSArIDNdICE9IDAgJiYKICAgICAgICAgICAgICAgICAgIGlucHV0W2kgKyA0XSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICBpbnB1dFtpICsgNV0gIT0gMCAmJgogICAgICAgICAgICAgICAgICAgaW5wdXRbaSArIDZdICE9IDAgJiYKICAgICAgICAgICAgICAgICAgIGlucHV0W2kgKyA3XSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICBpbnB1dFtpICsgOF0gIT0gMCAmJgogICAgICAgICAgICAgICAgICAgaW5wdXRbaSArIDldICE9IDAgJiYKICAgICAgICAgICAgICAgICAgIGlucHV0W2kgKyAxMF0gIT0gMCAmJgogICAgICAgICAgICAgICAgICAgaW5wdXRbaSArIDExXSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICBpbnB1dFtpICsgMTJdICE9IDApOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgUHJvYmxlbUVpZ2h0LlNvbHV0aW9uRWlnaHQoKTsKICAgICAgICAgICAgUHJvYmxlbUVpZ2h0LlNvbHV0aW9uRWlnaHQyKCk7CgogICAgICAgICAgICBSdW4oUHJvYmxlbUVpZ2h0LlNvbHV0aW9uRWlnaHQpOwogICAgICAgICAgICBSdW4oUHJvYmxlbUVpZ2h0LlNvbHV0aW9uRWlnaHQyKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyB2b2lkIFJ1bihBY3Rpb24gYWN0aW9uKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB0aW1lciA9IG5ldyBTdG9wd2F0Y2goKTsKICAgICAgICAgICAgdGltZXIuU3RhcnQoKTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWN0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRpbWVyLlN0b3AoKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUodGltZXIuRWxhcHNlZE1pbGxpc2Vjb25kcyk7CiAgICAgICAgfQogICAgfQp9Cg==