시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
5 초 128 MB 3 1 1 100.000%

문제

휴대폰의 잠금 방법 중 가장 흔한 것이 잠금 패턴이다. 잠금을 해제하기 위해서는 주어진 점들을 적절한 방법으로 이어 정해진 모양을 만들어야 한다.

청호의 휴대폰은 4개의 행에 각각 3개의 점이 있는 형태의 잠금 패턴을 사용한다. 아래의 그림은 잠금 패턴의 예시로, 잠금 패턴은 아래와 같이 2차원 평면으로 모델링되며 각각의 점은 X좌표와 Y좌표를 갖는 정수 격자점으로 표현된다. 가장 왼쪽 위의 점이 (1,4)이며, 가장 오른쪽 아래의 점이 (3,1)이 된다.

위의 패턴을 좌표로 읽으면 (3,4) (2,4) (1,2) (2,1) (2,2) (3,2) (3,1) (1,3) 이 된다.

이제 '유효한 패턴' 을 다음과 같이 정의하자.

  • 패턴은 그 패턴이 어떤 점을 처음 지나는 순간 그 점의 좌표를 표기하여 나열한 하나의 집합으로 나타낸다. 즉, 그려지는 순서대로 점을 표기하는 것이다. 이 때, (1,1) (2,2)와 (2,2) (1,1)은 그려지는 순서가 다르므로 서로 다른 패턴이다.
  • 패턴에 나타나는 임의의 연속된 두 점 A와 B에 대하여, A와 B를 잇는 선분 상에 있는 다른 점들은 패턴에 이미 출현했어야 한다. 예를 들어 (3,1) (1,3)은 유효하지 않은 패턴이지만, (3,1) (2,2) (1,3)이나 (2,2) (3,2) (3,1) (1,3)과 같은 패턴은 유효한 패턴이다.
  • 패턴은 동일한 점을 두 번 이상 지날 수는 있지만, 동일한 점이 두 번 이상 언급되어선 안 된다. 각 점은 최초에 지날 때 한 번만 패턴 내의 점으로 취급된다.
  • 패턴의 길이는 패턴 내의 모든 연속된 두 점 사이의 맨해튼 거리의 합으로 정의한다. 두 점 (X1, Y1), (X2, Y2)의 맨해튼 거리는 |X1 − X2| + |Y1 − Y2|로 정의된다.
  • 패턴은 최소한 두 개의 점을 포함해야 한다.

어느 날 청호는 자기 휴대폰의 잠금 패턴을 잊어버렸다. 하지만 청호는 패턴의 길이 L과 패턴이 절대 지나지 않았던 점들의 집합 S를 기억한다. S에 포함되지 않는 점들은 지날 수도 있고 지나지 않을 수도 있다.

청호는 알고 있는 정보를 바탕으로 모든 경우의 수를 하나하나 시도해보려 한다. 하지만 그 전에, 몇 번이나 시도해야할 지 미리 계산해보고 시도하고 싶다. S와 L이 주어질 때, 서로 다른 유효한 패턴의 개수는 총 몇 개일까?

입력

첫 줄에 테스트 케이스의 수 T가 주어진다. ( 1 ≤ T ≤ 100 )

각 테스트 케이스의 첫 줄엔 L과 N이 주어진다. L은 패턴의 길이이며, N은 청호가 기억하는 절대 지나지 않았던 점들의 수이다. ( 1 ≤ L ≤ 1000 ) , ( 0 ≤ N ≤ 12 )

이어 N줄에 걸쳐 두 정수 X와 Y가 주어진다. ( 1 ≤ X ≤ 3 ), ( 1 ≤ Y ≤ 4 )

이는 패턴이 점 (X,Y)를 절대 지나지 않음을 의미한다.

N개의 점은 모두 다르다.

출력

각 테스트 케이스마다, 가능한 유효한 패턴의 총 개수를 출력한다.

만일 가능한 패턴이 한 개도 없다면 패턴의 개수 대신 BAD MEMORY를 출력한다.

예제 입력 1

3
1 0
2 10
1 1
1 2
1 3
2 1
2 2
2 3
2 4
3 2
3 3
3 4
1 3
1 4
2 4
3 4

예제 출력 1

34
BAD MEMORY
24
W3sicHJvYmxlbV9pZCI6Ijk1NTIiLCJwcm9ibGVtX2xhbmciOiIwIiwidGl0bGUiOiJcdWM3YTBcdWFlMDggXHVkMzI4XHVkMTM0IiwiZGVzY3JpcHRpb24iOiI8cD5cdWQ3MzRcdWIzMDBcdWQzZjBcdWM3NTggXHVjN2EwXHVhZTA4IFx1YmMyOVx1YmM5NSBcdWM5MTEgXHVhYzAwXHVjN2E1IFx1ZDc1NFx1ZDU1YyBcdWFjODNcdWM3NzQgXHVjN2EwXHVhZTA4IFx1ZDMyOFx1ZDEzNFx1Yzc3NFx1YjJlNC4gXHVjN2EwXHVhZTA4XHVjNzQ0IFx1ZDU3NFx1YzgxY1x1ZDU1OFx1YWUzMCBcdWM3MDRcdWQ1NzRcdWMxMWNcdWIyOTQgXHVjOGZjXHVjNWI0XHVjOWM0IFx1YzgxMFx1YjRlNFx1Yzc0NCBcdWM4MDFcdWM4MDhcdWQ1NWMgXHViYzI5XHViYzk1XHVjNzNjXHViODVjIFx1Yzc3NFx1YzViNCBcdWM4MTVcdWQ1NzRcdWM5YzQgXHViYWE4XHVjNTkxXHVjNzQ0IFx1YjljY1x1YjRlNFx1YzViNFx1YzU3YyBcdWQ1NWNcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1Y2NhZFx1ZDYzOFx1Yzc1OCBcdWQ3MzRcdWIzMDBcdWQzZjBcdWM3NDAgNFx1YWMxY1x1Yzc1OCBcdWQ1ODlcdWM1ZDAgXHVhYzAxXHVhYzAxIDNcdWFjMWNcdWM3NTggXHVjODEwXHVjNzc0IFx1Yzc4OFx1YjI5NCBcdWQ2MTVcdWQwZGNcdWM3NTggXHVjN2EwXHVhZTA4IFx1ZDMyOFx1ZDEzNFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWQ1NWNcdWIyZTQuIFx1YzU0NFx1Yjc5OFx1Yzc1OCBcdWFkZjhcdWI5YmNcdWM3NDAgXHVjN2EwXHVhZTA4IFx1ZDMyOFx1ZDEzNFx1Yzc1OCBcdWM2MDhcdWMyZGNcdWI4NWMsIFx1YzdhMFx1YWUwOCBcdWQzMjhcdWQxMzRcdWM3NDAgXHVjNTQ0XHViNzk4XHVjNjQwIFx1YWMxOVx1Yzc3NCAyXHVjYzI4XHVjNmQwIFx1ZDNjOVx1YmE3NFx1YzczY1x1Yjg1YyBcdWJhYThcdWIzNzhcdWI5YzFcdWI0MThcdWJhNzAgXHVhYzAxXHVhYzAxXHVjNzU4IFx1YzgxMFx1Yzc0MCBYXHVjODhjXHVkNDVjXHVjNjQwIFlcdWM4OGNcdWQ0NWNcdWI5N2MgXHVhYzE2XHViMjk0IFx1YzgxNVx1YzIxOCBcdWFjYTlcdWM3OTBcdWM4MTBcdWM3M2NcdWI4NWMgXHVkNDVjXHVkNjA0XHViNDFjXHViMmU0LiBcdWFjMDBcdWM3YTUgXHVjNjdjXHVjYWJkIFx1YzcwNFx1Yzc1OCBcdWM4MTBcdWM3NzQgKDEsNClcdWM3NzRcdWJhNzAsIFx1YWMwMFx1YzdhNSBcdWM2MjRcdWI5NzhcdWNhYmQgXHVjNTQ0XHViNzk4XHVjNzU4IFx1YzgxMFx1Yzc3NCAoMywxKVx1Yzc3NCBcdWI0MWNcdWIyZTQuPFwvcD5cclxuXHJcbjxwPjxpbWcgc3JjPVwiXC91cGxvYWRcL2ltYWdlczJcL2xvY2twYXR0ZXJuLnBuZ1wiIFwvPjxcL3A+XHJcblxyXG48cD5cdWM3MDRcdWM3NTggXHVkMzI4XHVkMTM0XHVjNzQ0IFx1Yzg4Y1x1ZDQ1Y1x1Yjg1YyBcdWM3N2RcdWM3M2NcdWJhNzQgKDMsNCkgKDIsNCkgKDEsMikgKDIsMSkgKDIsMikgKDMsMikgKDMsMSkgKDEsMykgXHVjNzc0IFx1YjQxY1x1YjJlNC48XC9wPlxyXG5cclxuPHA+XHVjNzc0XHVjODFjICYjMzk7XHVjNzIwXHVkNmE4XHVkNTVjIFx1ZDMyOFx1ZDEzNCYjMzk7IFx1Yzc0NCBcdWIyZTRcdWM3NGNcdWFjZmMgXHVhYzE5XHVjNzc0IFx1YzgxNVx1Yzc1OFx1ZDU1OFx1Yzc5MC48XC9wPlxyXG5cclxuPHVsPlxyXG5cdDxsaT5cdWQzMjhcdWQxMzRcdWM3NDAgXHVhZGY4IFx1ZDMyOFx1ZDEzNFx1Yzc3NCBcdWM1YjRcdWI1YTQgXHVjODEwXHVjNzQ0IFx1Y2M5OFx1Yzc0YyBcdWM5YzBcdWIwOThcdWIyOTQgXHVjMjFjXHVhYzA0IFx1YWRmOCBcdWM4MTBcdWM3NTggXHVjODhjXHVkNDVjXHViOTdjIFx1ZDQ1Y1x1YWUzMFx1ZDU1OFx1YzVlYyBcdWIwOThcdWM1ZjRcdWQ1NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1YzlkMVx1ZDU2OVx1YzczY1x1Yjg1YyBcdWIwOThcdWQwYzBcdWIwYjhcdWIyZTQuIFx1Yzk4OSwgXHVhZGY4XHViODI0XHVjOWMwXHViMjk0IFx1YzIxY1x1YzExY1x1YjMwMFx1Yjg1YyBcdWM4MTBcdWM3NDQgXHVkNDVjXHVhZTMwXHVkNTU4XHViMjk0IFx1YWM4M1x1Yzc3NFx1YjJlNC4gXHVjNzc0IFx1YjU0YywgKDEsMSkgKDIsMilcdWM2NDAgKDIsMikgKDEsMSlcdWM3NDAgXHVhZGY4XHViODI0XHVjOWMwXHViMjk0IFx1YzIxY1x1YzExY1x1YWMwMCBcdWIyZTRcdWI5NzRcdWJiYzBcdWI4NWMgXHVjMTFjXHViODVjIFx1YjJlNFx1Yjk3OCBcdWQzMjhcdWQxMzRcdWM3NzRcdWIyZTQuPFwvbGk+XHJcblx0PGxpPlx1ZDMyOFx1ZDEzNFx1YzVkMCBcdWIwOThcdWQwYzBcdWIwOThcdWIyOTQgXHVjNzg0XHVjNzU4XHVjNzU4IFx1YzVmMFx1YzE4ZFx1YjQxYyBcdWI0NTAgXHVjODEwIEFcdWM2NDAgQlx1YzVkMCBcdWIzMDBcdWQ1NThcdWM1ZWMsIEFcdWM2NDAgQlx1Yjk3YyBcdWM3ODdcdWIyOTQgXHVjMTIwXHViZDg0IFx1YzBjMVx1YzVkMCBcdWM3ODhcdWIyOTQgXHViMmU0XHViOTc4IFx1YzgxMFx1YjRlNFx1Yzc0MCBcdWQzMjhcdWQxMzRcdWM1ZDAgXHVjNzc0XHViYmY4IFx1Y2Q5Y1x1ZDYwNFx1ZDU4OFx1YzViNFx1YzU3YyBcdWQ1NWNcdWIyZTQuIFx1YzYwOFx1Yjk3YyBcdWI0ZTRcdWM1YjQgKDMsMSkgKDEsMylcdWM3NDAgXHVjNzIwXHVkNmE4XHVkNTU4XHVjOWMwIFx1YzU0YVx1Yzc0MCBcdWQzMjhcdWQxMzRcdWM3NzRcdWM5YzBcdWI5Y2MsICgzLDEpICgyLDIpICgxLDMpXHVjNzc0XHViMDk4ICgyLDIpICgzLDIpICgzLDEpICgxLDMpXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWQzMjhcdWQxMzRcdWM3NDAgXHVjNzIwXHVkNmE4XHVkNTVjIFx1ZDMyOFx1ZDEzNFx1Yzc3NFx1YjJlNC48XC9saT5cclxuXHQ8bGk+XHVkMzI4XHVkMTM0XHVjNzQwIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM4MTBcdWM3NDQgXHViNDUwIFx1YmM4OCBcdWM3NzRcdWMwYzEgXHVjOWMwXHViMGEwIFx1YzIxOFx1YjI5NCBcdWM3ODhcdWM5YzBcdWI5Y2MsIFx1YjNkOVx1Yzc3Y1x1ZDU1YyBcdWM4MTBcdWM3NzQgXHViNDUwIFx1YmM4OCBcdWM3NzRcdWMwYzEgXHVjNWI4XHVhZTA5XHViNDE4XHVjNWI0XHVjMTIwIFx1YzU0OCBcdWI0MWNcdWIyZTQuIFx1YWMwMSBcdWM4MTBcdWM3NDAgXHVjZDVjXHVjZDA4XHVjNWQwIFx1YzljMFx1YjBhMCBcdWI1NGMgXHVkNTVjIFx1YmM4OFx1YjljYyBcdWQzMjhcdWQxMzQgXHViMGI0XHVjNzU4IFx1YzgxMFx1YzczY1x1Yjg1YyBcdWNkZThcdWFlMDlcdWI0MWNcdWIyZTQuPFwvbGk+XHJcblx0PGxpPlx1ZDMyOFx1ZDEzNFx1Yzc1OCBcdWFlMzhcdWM3NzRcdWIyOTQgXHVkMzI4XHVkMTM0IFx1YjBiNFx1Yzc1OCBcdWJhYThcdWI0ZTAgXHVjNWYwXHVjMThkXHViNDFjIFx1YjQ1MCBcdWM4MTAgXHVjMGFjXHVjNzc0XHVjNzU4IFx1YjllOFx1ZDU3NFx1ZDJiYyBcdWFjNzBcdWI5YWNcdWM3NTggXHVkNTY5XHVjNzNjXHViODVjIFx1YzgxNVx1Yzc1OFx1ZDU1Y1x1YjJlNC4gXHViNDUwIFx1YzgxMCAoWDxzdWI+MTxcL3N1Yj4sIFk8c3ViPjE8XC9zdWI+KSwgKFg8c3ViPjI8XC9zdWI+LCBZPHN1Yj4yPFwvc3ViPilcdWM3NTggXHViOWU4XHVkNTc0XHVkMmJjIFx1YWM3MFx1YjlhY1x1YjI5NCB8WDxzdWI+MTxcL3N1Yj4gJm1pbnVzOyBYPHN1Yj4yPFwvc3ViPnwgKyB8WTxzdWI+MTxcL3N1Yj4gJm1pbnVzOyBZPHN1Yj4yPFwvc3ViPnxcdWI4NWMgXHVjODE1XHVjNzU4XHViNDFjXHViMmU0LjxcL2xpPlxyXG5cdDxsaT5cdWQzMjhcdWQxMzRcdWM3NDAgXHVjZDVjXHVjMThjXHVkNTVjIFx1YjQ1MCBcdWFjMWNcdWM3NTggXHVjODEwXHVjNzQ0IFx1ZDNlY1x1ZDU2OFx1ZDU3NFx1YzU3YyBcdWQ1NWNcdWIyZTQuPFwvbGk+XHJcbjxcL3VsPlxyXG5cclxuPHA+XHVjNWI0XHViMjkwIFx1YjBhMCBcdWNjYWRcdWQ2MzhcdWIyOTQgXHVjNzkwXHVhZTMwIFx1ZDczNFx1YjMwMFx1ZDNmMFx1Yzc1OCBcdWM3YTBcdWFlMDggXHVkMzI4XHVkMTM0XHVjNzQ0IFx1Yzc4YVx1YzViNFx1YmM4NFx1YjgzOFx1YjJlNC4gXHVkNTU4XHVjOWMwXHViOWNjIFx1Y2NhZFx1ZDYzOFx1YjI5NCBcdWQzMjhcdWQxMzRcdWM3NTggXHVhZTM4XHVjNzc0IExcdWFjZmMgXHVkMzI4XHVkMTM0XHVjNzc0IFx1YzgwOFx1YjMwMCBcdWM5YzBcdWIwOThcdWM5YzAgXHVjNTRhXHVjNTU4XHViMzU4IFx1YzgxMFx1YjRlNFx1Yzc1OCBcdWM5ZDFcdWQ1NjkgU1x1Yjk3YyBcdWFlMzBcdWM1YjVcdWQ1NWNcdWIyZTQuIFNcdWM1ZDAgXHVkM2VjXHVkNTY4XHViNDE4XHVjOWMwIFx1YzU0YVx1YjI5NCBcdWM4MTBcdWI0ZTRcdWM3NDAgXHVjOWMwXHViMGEwIFx1YzIxOFx1YjNjNCBcdWM3ODhcdWFjZTAgXHVjOWMwXHViMDk4XHVjOWMwIFx1YzU0YVx1Yzc0NCBcdWMyMThcdWIzYzQgXHVjNzg4XHViMmU0LjxcL3A+XHJcblxyXG48cD5cdWNjYWRcdWQ2MzhcdWIyOTQgXHVjNTRjXHVhY2UwIFx1Yzc4OFx1YjI5NCBcdWM4MTVcdWJjZjRcdWI5N2MgXHViYzE0XHVkMGQ1XHVjNzNjXHViODVjIFx1YmFhOFx1YjRlMCBcdWFjYmRcdWM2YjBcdWM3NTggXHVjMjE4XHViOTdjIFx1ZDU1OFx1YjA5OFx1ZDU1OFx1YjA5OCBcdWMyZGNcdWIzYzRcdWQ1NzRcdWJjZjRcdWI4MjQgXHVkNTVjXHViMmU0LiBcdWQ1NThcdWM5YzBcdWI5Y2MgXHVhZGY4IFx1YzgwNFx1YzVkMCwgXHViYTg3IFx1YmM4OFx1Yzc3NFx1YjA5OCBcdWMyZGNcdWIzYzRcdWQ1NzRcdWM1N2NcdWQ1NjAgXHVjOWMwIFx1YmJmOFx1YjlhYyBcdWFjYzRcdWMwYjBcdWQ1NzRcdWJjZjRcdWFjZTAgXHVjMmRjXHViM2M0XHVkNTU4XHVhY2UwIFx1YzJmNlx1YjJlNC4gU1x1YzY0MCBMXHVjNzc0IFx1YzhmY1x1YzViNFx1YzljOCBcdWI1NGMsIFx1YzExY1x1Yjg1YyBcdWIyZTRcdWI5NzggXHVjNzIwXHVkNmE4XHVkNTVjIFx1ZDMyOFx1ZDEzNFx1Yzc1OCBcdWFjMWNcdWMyMThcdWIyOTQgXHVjZDFkIFx1YmE4NyBcdWFjMWNcdWM3N2NcdWFlNGM/PFwvcD5cclxuIiwiaW5wdXQiOiI8cD5cclxuXHRcdWNjYWIgXHVjOTA0XHVjNWQwIFx1ZDE0Y1x1YzJhNFx1ZDJiOCBcdWNmMDBcdWM3NzRcdWMyYTRcdWM3NTggXHVjMjE4IFRcdWFjMDAgXHVjOGZjXHVjNWI0XHVjOWM0XHViMmU0LiAoIDEgXHUyMjY0IFQgXHUyMjY0IDEwMCApXHJcbjxcL3A+XHJcbjxwPlxyXG5cdFx1YWMwMSBcdWQxNGNcdWMyYTRcdWQyYjggXHVjZjAwXHVjNzc0XHVjMmE0XHVjNzU4IFx1Y2NhYiBcdWM5MDRcdWM1ZDQgTFx1YWNmYyBOXHVjNzc0IFx1YzhmY1x1YzViNFx1YzljNFx1YjJlNC4gTFx1Yzc0MCBcdWQzMjhcdWQxMzRcdWM3NTggXHVhZTM4XHVjNzc0XHVjNzc0XHViYTcwLCBOXHVjNzQwIFx1Y2NhZFx1ZDYzOFx1YWMwMCBcdWFlMzBcdWM1YjVcdWQ1NThcdWIyOTQgXHVjODA4XHViMzAwIFx1YzljMFx1YjA5OFx1YzljMCBcdWM1NGFcdWM1NThcdWIzNTggXHVjODEwXHViNGU0XHVjNzU4IFx1YzIxOFx1Yzc3NFx1YjJlNC4gKCAxIFx1MjI2NCBMIFx1MjI2NCAxMDAwICkgLCAoIDAgXHUyMjY0IE4gXHUyMjY0IDEyIClcclxuPFwvcD5cclxuPHA+XHJcblx0XHVjNzc0XHVjNWI0IE5cdWM5MDRcdWM1ZDAgXHVhYzc4XHVjY2QwIFx1YjQ1MCBcdWM4MTVcdWMyMTggWFx1YzY0MCBZXHVhYzAwIFx1YzhmY1x1YzViNFx1YzljNFx1YjJlNC4gKCAxIFx1MjI2NCBYIFx1MjI2NCAzICksICggMSBcdTIyNjQgWSBcdTIyNjQgNCApXHJcbjxcL3A+XHJcbjxwPlxyXG5cdFx1Yzc3NFx1YjI5NCBcdWQzMjhcdWQxMzRcdWM3NzQgXHVjODEwIChYLFkpXHViOTdjIFx1YzgwOFx1YjMwMCBcdWM5YzBcdWIwOThcdWM5YzAgXHVjNTRhXHVjNzRjXHVjNzQ0IFx1Yzc1OFx1YmJmOFx1ZDU1Y1x1YjJlNC5cclxuPFwvcD5cclxuPHA+XHJcblx0Tlx1YWMxY1x1Yzc1OCBcdWM4MTBcdWM3NDAgXHViYWE4XHViNDUwIFx1YjJlNFx1Yjk3NFx1YjJlNC5cclxuPFwvcD4iLCJvdXRwdXQiOiI8cD5cclxuXHRcdWFjMDEgXHVkMTRjXHVjMmE0XHVkMmI4IFx1Y2YwMFx1Yzc3NFx1YzJhNFx1YjljOFx1YjJlNCwgXHVhYzAwXHViMmE1XHVkNTVjIFx1YzcyMFx1ZDZhOFx1ZDU1YyBcdWQzMjhcdWQxMzRcdWM3NTggXHVjZDFkIFx1YWMxY1x1YzIxOFx1Yjk3YyBcdWNkOWNcdWI4MjVcdWQ1NWNcdWIyZTQuXHJcbjxcL3A+XHJcbjxwPlxyXG5cdFx1YjljY1x1Yzc3YyBcdWFjMDBcdWIyYTVcdWQ1NWMgXHVkMzI4XHVkMTM0XHVjNzc0IFx1ZDU1YyBcdWFjMWNcdWIzYzQgXHVjNWM2XHViMmU0XHViYTc0IFx1ZDMyOFx1ZDEzNFx1Yzc1OCBcdWFjMWNcdWMyMTggXHViMzAwXHVjMmUwIEJBRCBNRU1PUllcdWI5N2MgXHVjZDljXHViODI1XHVkNTVjXHViMmU0LlxyXG48XC9wPiIsImhpbnQiOiIiLCJvcmlnaW5hbCI6IjAiLCJwcm9ibGVtX2xhbmdfY29kZSI6Ilx1ZDU1Y1x1YWQ2ZFx1YzViNCJ9LHsicHJvYmxlbV9pZCI6Ijk1NTIiLCJwcm9ibGVtX2xhbmciOiIxIiwidGl0bGUiOiJMb2NrIFBhdHRlcm4iLCJkZXNjcmlwdGlvbiI6IjxwPk9uZSBvZiB0aGUgd2F5cyB0byBsb2NrIHNvbWUgcGhvbmVzLCBpcyB0aGUgbG9jayBwYXR0ZXJuLiBUbyB1bmxvY2sgeW91ciBwaG9uZSB5b3UgaGF2ZSB0byBkcmF3IGEgc2VjcmV0IHBhdHRlcm4gb24gYSBncmlkIG9mIHNvbWUgcG9pbnRzLCB0aGUgcGF0dGVybiB3aWxsIGJlIHNvbWUgbGluZSBzZWdtZW50cyBjb25uZWN0aW5nIHRoZXNlIHBvaW50cy48XC9wPlxyXG5cclxuPHA+WW91ciBwaG9uZSBwYXR0ZXJuIGdyaWQgY29uc2lzdHMgb2YgZm91ciByb3dzIHdpdGggdGhyZWUgcG9pbnRzIGluIGVhY2ggcm93LiBUaGUgZm9sbG93aW5nIGltYWdlIG9uIHRoZSBsZWZ0IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JpZCwgaXQgY2FuIGJlIG1vZGVsZWQgYXMgYSAyRCBwbGFuZSB3aXRoIFggYW5kIFkgY29vcmRpbmF0ZXMgZm9yIGVhY2ggcG9pbnQsIGZvciBleGFtcGxlIHRoZSB0b3AgbGVmdCBwb2ludCBpcyAoMSw0KSBhbmQgdGhlIGJvdHRvbSByaWdodCBwb2ludCBpcyAoMywxKS4gVGhlIGltYWdlIG9uIHRoZSByaWdodCBpcyBhIHZhbGlkIHBhdHRlcm4sIHdoaWNoIGNvbm5lY3RzIHRoZSBmb2xsb3dpbmcgcG9pbnRzIGluIHRoaXMgb3JkZXI6ICgzLDQpICgyLDQpICgxLDIpICgyLDEpICgyLDIpICgzLDIpICgzLDEpICgxLDMpPFwvcD5cclxuXHJcbjxwPjxpbWcgYWx0PVwiXCIgc3JjPVwiXC91cGxvYWRcL2ltYWdlczJcL2xvY2twYXR0ZXJuLnBuZ1wiIFwvPjxcL3A+XHJcblxyXG48cD5BIHZhbGlkIHBhdHRlcm4gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8XC9wPlxyXG5cclxuPHVsPlxyXG5cdDxsaT5BIHBhdHRlcm4gY2FuIGJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBzZXF1ZW5jZSBvZiBwb2ludHMgd2hpY2ggaXQmcnNxdW87cyB0b3VjaGluZyBmb3IgdGhlIGZpcnN0IHRpbWUgKGluIHRoZSBzYW1lIG9yZGVyIG9mIGRyYXdpbmcgdGhlIHBhdHRlcm4pLCBhIHBhdHRlcm4gZ29pbmcgZnJvbSAoMSwxKSB0byAoMiwyKSBpcyBub3QgdGhlIHNhbWUgYXMgYSBwYXR0ZXJuIGdvaW5nIGZyb20gKDIsMikgdG8gKDEsMSkuPFwvbGk+XHJcblx0PGxpPkZvciBldmVyeSB0d28gY29uc2VjdXRpdmUgcG9pbnRzIEEgYW5kIEIgaW4gdGhlIHBhdHRlcm4gcmVwcmVzZW50YXRpb24sIGlmIHRoZSBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyBBIGFuZCBCIHBhc3NlcyB0aHJvdWdoIHNvbWUgb3RoZXIgcG9pbnRzLCB0aGVzZSBwb2ludHMgbXVzdCBiZSBpbiB0aGUgc2VxdWVuY2UgYWxzbyBhbmQgY29tZXMgYmVmb3JlIEEgYW5kIEIsIG90aGVyd2lzZSB0aGUgcGF0dGVybiB3aWxsIGJlIGludmFsaWQuIEZvciBleGFtcGxlIGEgcGF0dGVybiByZXByZXNlbnRhdGlvbiB3aGljaCBzdGFydHMgd2l0aCAoMywxKSB0aGVuICgxLDMpIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgc2VnbWVudCBwYXNzZXMgdGhyb3VnaCAoMiwyKSB3aGljaCBkaWRuJnJzcXVvO3QgYXBwZWFyIGluIHRoZSBwYXR0ZXJuIHJlcHJlc2VudGF0aW9uIGJlZm9yZSAoMywxKSwgYW5kIHRoZSBjb3JyZWN0IHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIHBhdHRlcm4gaXMgKDMsMSkgKDIsMikgKDEsMykuIEJ1dCB0aGUgcGF0dGVybiAoMiwyKSAoMywyKSAoMywxKSAoMSwzKSBpcyB2YWxpZCBiZWNhdXNlICgyLDIpIGFwcGVhcmVkIGJlZm9yZSAoMywxKS48XC9saT5cclxuXHQ8bGk+SW4gdGhlIHBhdHRlcm4gcmVwcmVzZW50YXRpb24gd2UgZG9uJnJzcXVvO3QgbWVudGlvbiB0aGUgc2FtZSBwb2ludCBtb3JlIHRoYW4gb25jZSwgZXZlbiBpZiB0aGUgcGF0dGVybiB3aWxsIHRvdWNoIHRoaXMgcG9pbnQgYWdhaW4gdGhyb3VnaCBhbm90aGVyIHZhbGlkIHNlZ21lbnQsIGFuZCBlYWNoIHNlZ21lbnQgaW4gdGhlIHBhdHRlcm4gbXVzdCBiZSBnb2luZyBmcm9tIGEgcG9pbnQgdG8gYW5vdGhlciBwb2ludCB3aGljaCB0aGUgcGF0dGVybiBkaWRuJnJzcXVvO3QgdG91Y2ggYmVmb3JlIGFuZCBpdCBtaWdodCBnbyB0aHJvdWdoIHNvbWUgcG9pbnRzIHdoaWNoIGFscmVhZHkgYXBwZWFyZWQgaW4gdGhlIHBhdHRlcm4uPFwvbGk+XHJcblx0PGxpPlRoZSBsZW5ndGggb2YgYSBwYXR0ZXJuIGlzIHRoZSBzdW0gb2YgdGhlIE1hbmhhdHRhbiBkaXN0YW5jZXMgYmV0d2VlbiBldmVyeSB0d28gY29uc2VjdXRpdmUgcG9pbnRzIGluIHRoZSBwYXR0ZXJuIHJlcHJlc2VudGF0aW9uLiBUaGUgTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyAoWDxzdWI+MTxcL3N1Yj4sIFk8c3ViPjE8XC9zdWI+KSBhbmQgKFg8c3ViPjI8XC9zdWI+LCBZPHN1Yj4yPFwvc3ViPikgaXMgfFg8c3ViPjE8XC9zdWI+ICZtaW51czsgWDxzdWI+MjxcL3N1Yj58ICsgfFk8c3ViPjE8XC9zdWI+ICZtaW51czsgWTxzdWI+MjxcL3N1Yj58ICh3aGVyZSB8WHwgbWVhbnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIFgpLiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBhYm92ZSBpbWFnZSBpczogMSArIDMgKyAyICsgMSArIDEgKyAxICsgNCA9IDEzLjxcL2xpPlxyXG5cdDxsaT5BIHBhdHRlcm4gbXVzdCB0b3VjaCBhdCBsZWFzdCB0d28gcG9pbnRzLjxcL2xpPlxyXG48XC91bD5cclxuXHJcbjxwPlVuZm9ydHVuYXRlbHkgeW91IGZvcmdvdCB5b3VyIHBob25lJnJzcXVvO3MgcGF0dGVybiwgYnV0IHlvdSByZW1lbWJlciB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuIGFuZCBhIHNldCBvZiBwb2ludHMgUyB3aGljaCBhcmUgbm90IHRvdWNoZWQgYnkgdGhlIHBhdHRlcm4gZm9yIHN1cmUgKHRoZSBwb2ludHMgd2hpY2ggYXJlIG5vdCBpbiBTIG1pZ2h0IGFuZCBtaWdodCBub3QgYmUgdG91Y2hlZCBieSB0aGUgcGF0dGVybiksIGFuZCB5b3UgZGVjaWRlZCB0byB0cnkgYWxsIHRoZSB2YWxpZCBwYXR0ZXJucyB3aGljaCBzYXRpc2Z5IHdoYXQgeW91IHJlbWVtYmVyLiBCZWZvcmUgZG9pbmcgdGhpcywgeW91IGhhdmUgdG8gd3JpdGUgYSBwcm9ncmFtIHRvIGNhbGN1bGF0ZSBmb3IgeW91IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHZhbGlkIHBhdHRlcm5zLjxcL3A+XHJcbiIsImlucHV0IjoiPHA+WW91ciBwcm9ncmFtIHdpbGwgYmUgdGVzdGVkIG9uIG9uZSBvciBtb3JlIHRlc3QgY2FzZXMuIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGEgc2luZ2xlIGludGVnZXIgVCwgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzICgxICZsZTsgVCAmbGU7IDEwMCkuIEZvbGxvd2VkIGJ5IHRoZSB0ZXN0IGNhc2VzLCB0aGUgZmlyc3QgbGluZSBvZiBhIHRlc3QgY2FzZSBjb250YWlucyB0d28gaW50ZWdlcnMgTCBhbmQgTiBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UuIEwgKDEgJmxlOyBMICZsZTsgMSwgMDAwKSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuIChhcyBkZXNjcmliZWQgYWJvdmUpLCBhbmQgTiAoMCAmbGU7IE4gJmxlOyAxMikgaXMgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCB5b3UgYXJlIHN1cmUgdGhleSBhcmUgbm90IHRvdWNoZWQgYnkgdGhlIHBhdHRlcm4sIGZvbGxvd2VkIGJ5IE4gbGluZXMgZWFjaCBsaW5lIGNvbnRhaW5zIHR3byBpbnRlZ2VycyBYICgxICZsZTsgWCAmbGU7IDMpIGFuZCBZICgxICZsZTsgWSAmbGU7IDQpIHNlcGFyYXRlZCBieSBhIHNpbmdsZSBzcGFjZSwgcmVwcmVzZW50aW5nIHRoZSBjb29yZGluYXRlcyBvZiBvbmUgb2YgdGhlIHBvaW50cyB3aGljaCBhcmUgbm90IHRvdWNoZWQgYnkgdGhjIHBhdHRlcm4gZm9yIHN1cmUsIHRoZSBOIHBvaW50cyBhcmUgZGlzdGluY3QuPFwvcD5cclxuIiwib3V0cHV0IjoiPHA+Rm9yIGVhY2ggdGVzdCBjYXNlLCBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHdoYXQgeW91IHJlbWVtYmVyLCBwcmludCBvbiBhIHNpbmdsZSBsaW5lICZsc3F1bztCQUQgTUVNT1JZJnJzcXVvOyAod2l0aG91dCB0aGUgcXVvdGVzKSwgb3RoZXJ3aXNlIHByaW50IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHZhbGlkIHBhdHRlcm5zLjxcL3A+XHJcbiIsImhpbnQiOiIiLCJvcmlnaW5hbCI6IjEiLCJwcm9ibGVtX2xhbmdfY29kZSI6Ilx1YzYwMVx1YzViNCJ9XQ==