시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 3 0 0 0.000%

문제

프로그래머는 다양한 프로그래밍언어에서 함수를 오버로드할 수 있다. 함수 오버로드란 같은 함수의 이름을 가지고 있으나, 매개변수가 다른 함수이다. 그러나, Ada와 같은 언어에서는 리턴 타입도 오버로드할 수 있다. 즉, 같은 이름과 매개변수를 가지고 있으나, 리턴타입이 다를 수도 있는 것이다.

다음은 함수 오버로딩의 예이다.

char f(float x, int y)
char f(float x, float y)
float f(float x, float y)
float g(float x, int y)
float g(int x, float y)

위와 같이 함수 선언이 있을 때, 아래와 같은 변수 선언과 함수 호출을 포함한 프로그램을 작성할 수 있다.

float a = 1.0, b = 2.0;
int c = 3;
float d = g(c, f(a, b));

f의 처음 두 선언은 위의 함수 f에 해당하지 않는다. 하지만, 세번째 함수는 f(<float>, <float>)와 같은 형식이라 매개변수의 타입이 같고, 리턴 타입도 g(<int>, <float>)float과 같기 때문에 해당한다. 따라서, 3번째 f와 두번째 g를 사용할 수 있다.

이렇게 3번째 f와 2번째 g를 사용했기 때문에, 다음과 같이 숫자와 함께 표현할 수 있다.

d = g2(c, f3(a, b))

하지만, 위의 함수 선언을 이용해서 c = g(a, f(a, c))는 사용할 수 없다.

마지막으로 다음과 같은 함수 선언이 있다고 하자.

float x(float w)
int x(float w)
char y(float v)
char y(int v)

위와 같은 선언에서 다음과 같은 함수 호출은 애매모호(ambiguous)하기 때문에 사용할 수 없다.

float a = 1.0
char c = y(x(a))

입력

입력은 여러 개의 함수 선언과 함수 호출으로 이루어져 있다. 함수 선언은 한 줄에 하나씩 주어지며, 다음과 같은 형태이다.

name num_params param(1) param(2) ... param(num_params) rettype

name은 함수의 이름이고, param(i)는 i번째 매개변수의 데이터 타입이다. rettype은 함수의 리턴값의 데이터 타입이다. (이 문제에서 void 함수는 없다) num_params는 적어도 1이고 많아야 9이다. 매개변수는 이름을 갖지 않는다. 함수의 이름은 알파벳 소문자 한글자이고, 데이터 타입은 알파벳 대문자 한글자이다. 같은 이름을 갖는 다른 함수는 연속으로 나타나며, 같은 이름을 갖는 함수는 많아야 500개이다. 두 함수의 선언이 정확하게 일치하는 경우는 없다.

문제에서 설명한 것 처럼 함수에 숫자를 붙여서 나타내는 것의 숫자를 시리얼 넘버라고 한다. 이 때, 시리얼 넘버는 새로운 함수의 이름이 시작할 때 1이 되고, 선언이 나타날때마다 1씩 증가한다.

함수 선언의 마지막에는 '#'가 주어진다. 그 다음줄부터 함수 호출이 한 줄에 하나씩 주어진다.

함수 호출은 다음과 같은 문법을 따른다.

<function_call> := <data_type> = <right_hand_side>
<right_hand_side> := <fname> <num_params> <param_list>
<param_list> := <param> | <param_list> <param>
<param> := <data_type> | <right_hand_side>
<data_type> := <upper_case_letter>
<num_params> := '1' | '2' | ... | '9'
<fname> := <lower_case_letter>

:=와 |는 문법 정의에만 등장하는 기호이고, 실제 함수 호출에는 나타나지 않는다. 각 함수 호출에서 호출하는 함수의 이름은 500개를 넘지 않는다. 함수 호출의 마지막 줄에는 '#'가 하나 주어진다.

출력

입력으로 주어진 각 함수 호출에 대해서, 만약 어떤 함수를 사용했는지 유일하게 결정할 수 있다면, 입력 함수 호출에서 함수의 이름에 시리얼 넘버만 추가한 형태로 출력한다. 만약, 해당하는 함수가 없어서 호출할 수 없다면 "impossible"을 출력하고, 애매모호해서 호출하는 방법이 여러가지라면, "ambiguous"를 출력하고, 경우의 수를 출력한다. 만약, 1000가지를 넘는 방법으로 호출할 수 있따면 "> 1000"을 경우의 수 대신 출력한다.

예제 입력 1

f 2 A B C
f 2 A A C
f 2 A A A
g 2 A B A
g 2 B A A
x 1 A A
x 1 A B
y 1 A C
y 1 B C
h 2 A B E
h 2 C D F
k 2 E F A
#
A = g 2 B f 2 A A
B = g 2 A f 2 A B
C = y 1 x 1 A
A = k 2 h 2 A B h 2 C D
#

예제 출력 1

A = g2 2 B f3 2 A A
impossible
ambiguous 2
A = k1 2 h1 2 A B h2 2 C D
W3sicHJvYmxlbV9pZCI6IjQ4MDIiLCJwcm9ibGVtX2xhbmciOiIwIiwidGl0bGUiOiJcdWQ1NjhcdWMyMTggXHVjNjI0XHViYzg0XHViODVjXHViNTI5IiwiZGVzY3JpcHRpb24iOiI8cD5cdWQ1MDRcdWI4NWNcdWFkZjhcdWI3OThcdWJhMzhcdWIyOTQgXHViMmU0XHVjNTkxXHVkNTVjIFx1ZDUwNFx1Yjg1Y1x1YWRmOFx1Yjc5OFx1YmMwZFx1YzViOFx1YzViNFx1YzVkMFx1YzExYyBcdWQ1NjhcdWMyMThcdWI5N2MgXHVjNjI0XHViYzg0XHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM3ODhcdWIyZTQuIFx1ZDU2OFx1YzIxOCBcdWM2MjRcdWJjODRcdWI4NWNcdWI0ZGNcdWI3ODAgXHVhYzE5XHVjNzQwIFx1ZDU2OFx1YzIxOFx1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVhYzAwXHVjOWMwXHVhY2UwIFx1Yzc4OFx1YzczY1x1YjA5OCwgXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHVhYzAwIFx1YjJlNFx1Yjk3OCBcdWQ1NjhcdWMyMThcdWM3NzRcdWIyZTQuIFx1YWRmOFx1YjdlY1x1YjA5OCwgQWRhXHVjNjQwIFx1YWMxOVx1Yzc0MCBcdWM1YjhcdWM1YjRcdWM1ZDBcdWMxMWNcdWIyOTQgXHViOWFjXHVkMTM0IFx1ZDBjMFx1Yzc4NVx1YjNjNCBcdWM2MjRcdWJjODRcdWI4NWNcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjJlNC4gXHVjOTg5LCBcdWFjMTlcdWM3NDAgXHVjNzc0XHViOTg0XHVhY2ZjIFx1YjllNFx1YWMxY1x1YmNjMFx1YzIxOFx1Yjk3YyBcdWFjMDBcdWM5YzBcdWFjZTAgXHVjNzg4XHVjNzNjXHViMDk4LCBcdWI5YWNcdWQxMzRcdWQwYzBcdWM3ODVcdWM3NzQgXHViMmU0XHViOTdjIFx1YzIxOFx1YjNjNCBcdWM3ODhcdWIyOTQgXHVhYzgzXHVjNzc0XHViMmU0LjxcL3A+XHJcblxyXG48cD5cdWIyZTRcdWM3NGNcdWM3NDAgXHVkNTY4XHVjMjE4IFx1YzYyNFx1YmM4NFx1Yjg1Y1x1YjUyOVx1Yzc1OCBcdWM2MDhcdWM3NzRcdWIyZTQuPFwvcD5cclxuXHJcbjxwcmUgY2xhc3M9XCJicnVzaDpjOyB0b29sYmFyOmZhbHNlO1wiPlxyXG5jaGFyIGYoZmxvYXQgeCwgaW50IHkpXHJcbmNoYXIgZihmbG9hdCB4LCBmbG9hdCB5KVxyXG5mbG9hdCBmKGZsb2F0IHgsIGZsb2F0IHkpXHJcbmZsb2F0IGcoZmxvYXQgeCwgaW50IHkpXHJcbmZsb2F0IGcoaW50IHgsIGZsb2F0IHkpXHJcbjxcL3ByZT5cclxuXHJcbjxwPlx1YzcwNFx1YzY0MCBcdWFjMTlcdWM3NzQgXHVkNTY4XHVjMjE4IFx1YzEyMFx1YzViOFx1Yzc3NCBcdWM3ODhcdWM3NDQgXHViNTRjLCBcdWM1NDRcdWI3OThcdWM2NDAgXHVhYzE5XHVjNzQwIFx1YmNjMFx1YzIxOCBcdWMxMjBcdWM1YjhcdWFjZmMgXHVkNTY4XHVjMjE4IFx1ZDYzOFx1Y2Q5Y1x1Yzc0NCBcdWQzZWNcdWQ1NjhcdWQ1NWMgXHVkNTA0XHViODVjXHVhZGY4XHViN2E4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2MCBcdWMyMTggXHVjNzg4XHViMmU0LjxcL3A+XHJcblxyXG48cHJlIGNsYXNzPVwiYnJ1c2g6YzsgdG9vbGJhcjpmYWxzZTtcIj5cclxuZmxvYXQgYSA9IDEuMCwgYiA9IDIuMDtcclxuaW50IGMgPSAzO1xyXG5mbG9hdCBkID0gZyhjLCBmKGEsIGIpKTtcclxuPFwvcHJlPlxyXG5cclxuPHA+PGNvZGU+ZjxcL2NvZGU+XHVjNzU4IFx1Y2M5OFx1Yzc0YyBcdWI0NTAgXHVjMTIwXHVjNWI4XHVjNzQwIFx1YzcwNFx1Yzc1OCBcdWQ1NjhcdWMyMTggPGNvZGU+ZjxcL2NvZGU+XHVjNWQwIFx1ZDU3NFx1YjJmOVx1ZDU1OFx1YzljMCBcdWM1NGFcdWIyOTRcdWIyZTQuIFx1ZDU1OFx1YzljMFx1YjljYywgXHVjMTM4XHViYzg4XHVjOWY4IFx1ZDU2OFx1YzIxOFx1YjI5NCA8Y29kZT5mKCZsdDtmbG9hdCZndDssICZsdDtmbG9hdCZndDspPFwvY29kZT5cdWM2NDAgXHVhYzE5XHVjNzQwIFx1ZDYxNVx1YzJkZFx1Yzc3NFx1Yjc3YyBcdWI5ZTRcdWFjMWNcdWJjYzBcdWMyMThcdWM3NTggXHVkMGMwXHVjNzg1XHVjNzc0IFx1YWMxOVx1YWNlMCwgXHViOWFjXHVkMTM0IFx1ZDBjMFx1Yzc4NVx1YjNjNCA8Y29kZT5nKCZsdDtpbnQmZ3Q7LCAmbHQ7ZmxvYXQmZ3Q7KTxcL2NvZGU+XHVjNzU4IDxjb2RlPmZsb2F0PFwvY29kZT5cdWFjZmMgXHVhYzE5XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCBcdWQ1NzRcdWIyZjlcdWQ1NWNcdWIyZTQuIFx1YjUzMFx1Yjc3Y1x1YzExYywgM1x1YmM4OFx1YzlmOCA8Y29kZT5mPFwvY29kZT5cdWM2NDAgXHViNDUwXHViYzg4XHVjOWY4IDxjb2RlPmc8XC9jb2RlPlx1Yjk3YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YjJlNC48XC9wPlxyXG5cclxuPHA+XHVjNzc0XHViODA3XHVhYzhjIDNcdWJjODhcdWM5ZjgmbmJzcDs8Y29kZT5mPFwvY29kZT5cdWM2NDAgMlx1YmM4OFx1YzlmOCA8Y29kZT5nPFwvY29kZT5cdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTg4XHVhZTMwIFx1YjU0Y1x1YmIzOFx1YzVkMCwgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc3NCBcdWMyMmJcdWM3OTBcdWM2NDAgXHVkNTY4XHVhZWQ4IFx1ZDQ1Y1x1ZDYwNFx1ZDU2MCBcdWMyMTggXHVjNzg4XHViMmU0LjxcL3A+XHJcblxyXG48cHJlIGNsYXNzPVwiYnJ1c2g6YzsgdG9vbGJhcjpmYWxzZTtcIj5cclxuZCA9IGcyKGMsIGYzKGEsIGIpKVxyXG48XC9wcmU+XHJcblxyXG48cD5cdWQ1NThcdWM5YzBcdWI5Y2MsIFx1YzcwNFx1Yzc1OCBcdWQ1NjhcdWMyMTggXHVjMTIwXHVjNWI4XHVjNzQ0IFx1Yzc3NFx1YzZhOVx1ZDU3NFx1YzExYyA8Y29kZT5jID0gZyhhLCBmKGEsIGMpKTxcL2NvZGU+XHViMjk0IFx1YzBhY1x1YzZhOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHViMmU0LjxcL3A+XHJcblxyXG48cD5cdWI5YzhcdWM5YzBcdWI5YzlcdWM3M2NcdWI4NWMgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWQ1NjhcdWMyMTggXHVjMTIwXHVjNWI4XHVjNzc0IFx1Yzc4OFx1YjJlNFx1YWNlMCBcdWQ1NThcdWM3OTAuPFwvcD5cclxuXHJcbjxwcmUgY2xhc3M9XCJicnVzaDpjOyB0b29sYmFyOmZhbHNlO1wiPlxyXG5mbG9hdCB4KGZsb2F0IHcpXHJcbmludCB4KGZsb2F0IHcpXHJcbmNoYXIgeShmbG9hdCB2KVxyXG5jaGFyIHkoaW50IHYpXHJcbjxcL3ByZT5cclxuXHJcbjxwPlx1YzcwNFx1YzY0MCBcdWFjMTlcdWM3NDAgXHVjMTIwXHVjNWI4XHVjNWQwXHVjMTFjIFx1YjJlNFx1Yzc0Y1x1YWNmYyBcdWFjMTlcdWM3NDAgXHVkNTY4XHVjMjE4IFx1ZDYzOFx1Y2Q5Y1x1Yzc0MCBcdWM1NjBcdWI5ZTRcdWJhYThcdWQ2MzgoYW1iaWd1b3VzKVx1ZDU1OFx1YWUzMCBcdWI1NGNcdWJiMzhcdWM1ZDAgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWIyZTQuPFwvcD5cclxuXHJcbjxwcmUgY2xhc3M9XCJicnVzaDpjOyB0b29sYmFyOmZhbHNlO1wiPlxyXG5mbG9hdCBhID0gMS4wXHJcbmNoYXIgYyA9IHkoeChhKSlcclxuPFwvcHJlPlxyXG4iLCJpbnB1dCI6IjxwPlx1Yzc4NVx1YjgyNVx1Yzc0MCBcdWM1ZWNcdWI3ZWMgXHVhYzFjXHVjNzU4IFx1ZDU2OFx1YzIxOCBcdWMxMjBcdWM1YjhcdWFjZmMgXHVkNTY4XHVjMjE4IFx1ZDYzOFx1Y2Q5Y1x1YzczY1x1Yjg1YyBcdWM3NzRcdWI4ZThcdWM1YjRcdWM4MzggXHVjNzg4XHViMmU0LiBcdWQ1NjhcdWMyMTggXHVjMTIwXHVjNWI4XHVjNzQwIFx1ZDU1YyBcdWM5MDRcdWM1ZDAgXHVkNTU4XHViMDk4XHVjNTI5IFx1YzhmY1x1YzViNFx1YzljMFx1YmE3MCwgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWQ2MTVcdWQwZGNcdWM3NzRcdWIyZTQuPFwvcD5cclxuXHJcbjxwcmU+XHJcbm5hbWUgbnVtX3BhcmFtcyBwYXJhbSgxKSBwYXJhbSgyKSAuLi4gcGFyYW0obnVtX3BhcmFtcykgcmV0dHlwZTxcL3ByZT5cclxuXHJcbjxwPm5hbWVcdWM3NDAgXHVkNTY4XHVjMjE4XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc3NFx1YWNlMCwgcGFyYW0oaSlcdWIyOTQgaVx1YmM4OFx1YzlmOCBcdWI5ZTRcdWFjMWNcdWJjYzBcdWMyMThcdWM3NTggXHViMzcwXHVjNzc0XHVkMTMwIFx1ZDBjMFx1Yzc4NVx1Yzc3NFx1YjJlNC4gcmV0dHlwZVx1Yzc0MCBcdWQ1NjhcdWMyMThcdWM3NTggXHViOWFjXHVkMTM0XHVhYzEyXHVjNzU4IFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWQwYzBcdWM3ODVcdWM3NzRcdWIyZTQuIChcdWM3NzQgXHViYjM4XHVjODFjXHVjNWQwXHVjMTFjIHZvaWQgXHVkNTY4XHVjMjE4XHViMjk0IFx1YzVjNlx1YjJlNCkgbnVtX3BhcmFtc1x1YjI5NCBcdWM4MDFcdWM1YjRcdWIzYzQgMVx1Yzc3NFx1YWNlMCBcdWI5Y2VcdWM1NDRcdWM1N2MgOVx1Yzc3NFx1YjJlNC4gXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHViMjk0IFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWFjMTZcdWM5YzAgXHVjNTRhXHViMjk0XHViMmU0LiBcdWQ1NjhcdWMyMThcdWM3NTggXHVjNzc0XHViOTg0XHVjNzQwIFx1YzU0Y1x1ZDMwY1x1YmNiMyBcdWMxOGNcdWJiMzhcdWM3OTAgXHVkNTVjXHVhZTAwXHVjNzkwXHVjNzc0XHVhY2UwLCBcdWIzNzBcdWM3NzRcdWQxMzAgXHVkMGMwXHVjNzg1XHVjNzQwIFx1YzU0Y1x1ZDMwY1x1YmNiMyBcdWIzMDBcdWJiMzhcdWM3OTAgXHVkNTVjXHVhZTAwXHVjNzkwXHVjNzc0XHViMmU0LiBcdWFjMTlcdWM3NDAgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YWMxNlx1YjI5NCBcdWIyZTRcdWI5NzggXHVkNTY4XHVjMjE4XHViMjk0IFx1YzVmMFx1YzE4ZFx1YzczY1x1Yjg1YyBcdWIwOThcdWQwYzBcdWIwOThcdWJhNzAsIFx1YWMxOVx1Yzc0MCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVhYzE2XHViMjk0IFx1ZDU2OFx1YzIxOFx1YjI5NCBcdWI5Y2VcdWM1NDRcdWM1N2MgNTAwXHVhYzFjXHVjNzc0XHViMmU0LiBcdWI0NTAgXHVkNTY4XHVjMjE4XHVjNzU4IFx1YzEyMFx1YzViOFx1Yzc3NCBcdWM4MTVcdWQ2NTVcdWQ1NThcdWFjOGMgXHVjNzdjXHVjZTU4XHVkNTU4XHViMjk0IFx1YWNiZFx1YzZiMFx1YjI5NCBcdWM1YzZcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1YmIzOFx1YzgxY1x1YzVkMFx1YzExYyBcdWMxMjRcdWJhODVcdWQ1NWMgXHVhYzgzIFx1Y2M5OFx1YjdmYyBcdWQ1NjhcdWMyMThcdWM1ZDAgXHVjMjJiXHVjNzkwXHViOTdjIFx1YmQ5OVx1YzVlY1x1YzExYyBcdWIwOThcdWQwYzBcdWIwYjRcdWIyOTQgXHVhYzgzXHVjNzU4IFx1YzIyYlx1Yzc5MFx1Yjk3YyBcdWMyZGNcdWI5YWNcdWM1YmMgXHViMTE4XHViYzg0XHViNzdjXHVhY2UwIFx1ZDU1Y1x1YjJlNC4gXHVjNzc0IFx1YjU0YywgXHVjMmRjXHViOWFjXHVjNWJjIFx1YjExOFx1YmM4NFx1YjI5NCBcdWMwYzhcdWI4NWNcdWM2YjQgXHVkNTY4XHVjMjE4XHVjNzU4IFx1Yzc3NFx1Yjk4NFx1Yzc3NCBcdWMyZGNcdWM3OTFcdWQ1NjAgXHViNTRjIDFcdWM3NzQgXHViNDE4XHVhY2UwLCBcdWMxMjBcdWM1YjhcdWM3NzQgXHViMDk4XHVkMGMwXHViMGEwXHViNTRjXHViOWM4XHViMmU0IDFcdWM1MjkgXHVjOTlkXHVhYzAwXHVkNTVjXHViMmU0LjxcL3A+XHJcblxyXG48cD5cdWQ1NjhcdWMyMTggXHVjMTIwXHVjNWI4XHVjNzU4IFx1YjljOFx1YzljMFx1YjljOVx1YzVkMFx1YjI5NCAmIzM5OyMmIzM5O1x1YWMwMCBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuIFx1YWRmOCBcdWIyZTRcdWM3NGNcdWM5MDRcdWJkODBcdWQxMzAgXHVkNTY4XHVjMjE4IFx1ZDYzOFx1Y2Q5Y1x1Yzc3NCBcdWQ1NWMgXHVjOTA0XHVjNWQwIFx1ZDU1OFx1YjA5OFx1YzUyOSBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1ZDU2OFx1YzIxOCBcdWQ2MzhcdWNkOWNcdWM3NDAgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc0MCBcdWJiMzhcdWJjOTVcdWM3NDQgXHViNTMwXHViOTc4XHViMmU0LjxcL3A+XHJcblxyXG48cHJlPlxyXG4mbHQ7ZnVuY3Rpb25fY2FsbCZndDsgOj0gJmx0O2RhdGFfdHlwZSZndDsgPSAmbHQ7cmlnaHRfaGFuZF9zaWRlJmd0O1xyXG4mbHQ7cmlnaHRfaGFuZF9zaWRlJmd0OyA6PSAmbHQ7Zm5hbWUmZ3Q7ICZsdDtudW1fcGFyYW1zJmd0OyAmbHQ7cGFyYW1fbGlzdCZndDtcclxuJmx0O3BhcmFtX2xpc3QmZ3Q7IDo9ICZsdDtwYXJhbSZndDsgfCAmbHQ7cGFyYW1fbGlzdCZndDsgJmx0O3BhcmFtJmd0O1xyXG4mbHQ7cGFyYW0mZ3Q7IDo9ICZsdDtkYXRhX3R5cGUmZ3Q7IHwgJmx0O3JpZ2h0X2hhbmRfc2lkZSZndDtcclxuJmx0O2RhdGFfdHlwZSZndDsgOj0gJmx0O3VwcGVyX2Nhc2VfbGV0dGVyJmd0O1xyXG4mbHQ7bnVtX3BhcmFtcyZndDsgOj0gJiMzOTsxJiMzOTsgfCAmIzM5OzImIzM5OyB8IC4uLiB8ICYjMzk7OSYjMzk7XHJcbiZsdDtmbmFtZSZndDsgOj0gJmx0O2xvd2VyX2Nhc2VfbGV0dGVyJmd0O1xyXG48XC9wcmU+XHJcblxyXG48cD46PVx1YzY0MCB8XHViMjk0IFx1YmIzOFx1YmM5NSBcdWM4MTVcdWM3NThcdWM1ZDBcdWI5Y2MgXHViNGYxXHVjN2E1XHVkNTU4XHViMjk0IFx1YWUzMFx1ZDYzOFx1Yzc3NFx1YWNlMCwgXHVjMmU0XHVjODFjIFx1ZDU2OFx1YzIxOCBcdWQ2MzhcdWNkOWNcdWM1ZDBcdWIyOTQgXHViMDk4XHVkMGMwXHViMDk4XHVjOWMwIFx1YzU0YVx1YjI5NFx1YjJlNC4gXHVhYzAxIFx1ZDU2OFx1YzIxOCBcdWQ2MzhcdWNkOWNcdWM1ZDBcdWMxMWMgXHVkNjM4XHVjZDljXHVkNTU4XHViMjk0IFx1ZDU2OFx1YzIxOFx1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDAgNTAwXHVhYzFjXHViOTdjIFx1YjExOFx1YzljMCBcdWM1NGFcdWIyOTRcdWIyZTQuIFx1ZDU2OFx1YzIxOCBcdWQ2MzhcdWNkOWNcdWM3NTggXHViOWM4XHVjOWMwXHViOWM5IFx1YzkwNFx1YzVkMFx1YjI5NCAmIzM5OyMmIzM5O1x1YWMwMCBcdWQ1NThcdWIwOTggXHVjOGZjXHVjNWI0XHVjOWM0XHViMmU0LjxcL3A+XHJcbiIsIm91dHB1dCI6IjxwPlx1Yzc4NVx1YjgyNVx1YzczY1x1Yjg1YyBcdWM4ZmNcdWM1YjRcdWM5YzQgXHVhYzAxIFx1ZDU2OFx1YzIxOCBcdWQ2MzhcdWNkOWNcdWM1ZDAgXHViMzAwXHVkNTc0XHVjMTFjLCBcdWI5Y2NcdWM1N2QgXHVjNWI0XHViNWE0IFx1ZDU2OFx1YzIxOFx1Yjk3YyBcdWMwYWNcdWM2YTlcdWQ1ODhcdWIyOTRcdWM5YzAgXHVjNzIwXHVjNzdjXHVkNTU4XHVhYzhjIFx1YWNiMFx1YzgxNVx1ZDU2MCBcdWMyMTggXHVjNzg4XHViMmU0XHViYTc0LCBcdWM3ODVcdWI4MjUgXHVkNTY4XHVjMjE4IFx1ZDYzOFx1Y2Q5Y1x1YzVkMFx1YzExYyBcdWQ1NjhcdWMyMThcdWM3NTggXHVjNzc0XHViOTg0XHVjNWQwIFx1YzJkY1x1YjlhY1x1YzViYyBcdWIxMThcdWJjODRcdWI5Y2MgXHVjZDk0XHVhYzAwXHVkNTVjIFx1ZDYxNVx1ZDBkY1x1Yjg1YyBcdWNkOWNcdWI4MjVcdWQ1NWNcdWIyZTQuIFx1YjljY1x1YzU3ZCwgXHVkNTc0XHViMmY5XHVkNTU4XHViMjk0IFx1ZDU2OFx1YzIxOFx1YWMwMCBcdWM1YzZcdWM1YjRcdWMxMWMgXHVkNjM4XHVjZDljXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWIyZTRcdWJhNzQgJnF1b3Q7aW1wb3NzaWJsZSZxdW90O1x1Yzc0NCBcdWNkOWNcdWI4MjVcdWQ1NThcdWFjZTAsIFx1YzU2MFx1YjllNFx1YmFhOFx1ZDYzOFx1ZDU3NFx1YzExYyBcdWQ2MzhcdWNkOWNcdWQ1NThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzc0IFx1YzVlY1x1YjdlY1x1YWMwMFx1YzljMFx1Yjc3Y1x1YmE3NCwgJnF1b3Q7YW1iaWd1b3VzJnF1b3Q7XHViOTdjIFx1Y2Q5Y1x1YjgyNVx1ZDU1OFx1YWNlMCwgXHVhY2JkXHVjNmIwXHVjNzU4IFx1YzIxOFx1Yjk3YyBcdWNkOWNcdWI4MjVcdWQ1NWNcdWIyZTQuIFx1YjljY1x1YzU3ZCwgMTAwMFx1YWMwMFx1YzljMFx1Yjk3YyBcdWIxMThcdWIyOTQgXHViYzI5XHViYzk1XHVjNzNjXHViODVjIFx1ZDYzOFx1Y2Q5Y1x1ZDU2MCBcdWMyMTggXHVjNzg4XHViNTMwXHViYTc0ICZxdW90OyZndDsgMTAwMCZxdW90O1x1Yzc0NCBcdWFjYmRcdWM2YjBcdWM3NTggXHVjMjE4IFx1YjMwMFx1YzJlMCBcdWNkOWNcdWI4MjVcdWQ1NWNcdWIyZTQuPFwvcD5cclxuIiwiaGludCI6IiIsIm9yaWdpbmFsIjoiMCIsInByb2JsZW1fbGFuZ19jb2RlIjoiXHVkNTVjXHVhZDZkXHVjNWI0In0seyJwcm9ibGVtX2lkIjoiNDgwMiIsInByb2JsZW1fbGFuZyI6IjEiLCJ0aXRsZSI6IkZ1bmN0aW9uIE92ZXJsb2FkaW5nIiwiZGVzY3JpcHRpb24iOiI8cD5NYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyAoaW5jbHVkaW5nIEMsIEMrKyBhbmQgSmF2YSkgYWxsb3cgdGhlIHByb2dyYW1tZXIgdG8gZGVmaW5lIG92ZXJsb2FkZWQgZnVuY3Rpb25zLCBpLmUuLCBzZXZlcmFsIGZ1bmN0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHBhcmFtZXRlciBsaXN0cy4gSG93ZXZlciwgaW4gc29tZSBsYW5ndWFnZXMgKHN1Y2ggYXMgQWRhKSBpdCBpcyBwb3NzaWJsZSB0byBvdmVybG9hZCBieSByZXR1cm4gdHlwZSBhcyB3ZWxsLiBUaGF0IGlzLCBpdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGZ1bmN0aW9ucyB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYW5kIHBhcmFtZXRlciBsaXN0LCBidXQgZGlmZmVyZW50IHJldHVybiB0eXBlcy4gRm9yIGV4YW1wbGU6PFwvcD5cclxuXHJcbjxwcmU+XHJcbmNoYXIgZihmbG9hdCB4LCBpbnQgeSlcclxuY2hhciBmKGZsb2F0IHgsIGZsb2F0IHkpXHJcbmZsb2F0IGYoZmxvYXQgeCwgZmxvYXQgeSlcclxuZmxvYXQgZyhmbG9hdCB4LCBpbnQgeSlcclxuZmxvYXQgZyhpbnQgeCwgZmxvYXQgeSlcclxuPFwvcHJlPlxyXG5cclxuPHA+R2l2ZW4gdGhlc2UgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBzdXBwb3NlIHRoZSBwcm9ncmFtIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBmdW5jdGlvbiBjYWxsOjxcL3A+XHJcblxyXG48cHJlPlxyXG5mbG9hdCBhID0gMS4wLCBiID0gMi4wO1xyXG5pbnQgYyA9IDM7XHJcbmZsb2F0IGQgPSBnKGMsIGYoYSwgYikpO1xyXG48XC9wcmU+XHJcblxyXG48cD5UaGUgXHVmYjAxcnN0IHR3byBkZWNsYXJhdGlvbnMgb2YgZiB3b3VsZCBub3Qgd29yayBoZXJlLCBidXQgdGhlIHRoaXJkIG9uZSBkb2VzOiA8Y29kZT5mKCZsdDtmbG9hdCZndDssICZsdDtmbG9hdCZndDspIHJldHVybnMgJmx0O2Zsb2F0Jmd0OzxcL2NvZGU+LCB3aGljaCByZWR1Y2VzIHRoZSBmdW5jdGlvbiBjYWxsIHRvIDxjb2RlPmcoJmx0O2ludCZndDssICZsdDtmbG9hdCZndDspPFwvY29kZT4sIGFuZCB0aGUgc2Vjb25kIGRlY2xhcmF0aW9uIG9mIDxjb2RlPmc8XC9jb2RlPiB3aWxsIHJldHVybiB0aGUgPGNvZGU+Jmx0O2Zsb2F0Jmd0OzxcL2NvZGU+IHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIHZhcmlhYmxlIDxjb2RlPmQ8XC9jb2RlPi4gU2luY2Ugd2UgdXNlZCB0aGUgM3JkIHZlcnNpb24gb2YgPGNvZGU+ZjxcL2NvZGU+IGFuZCB0aGUgMm5kIHZlcnNpb24gb2YgPGNvZGU+ZzxcL2NvZGU+LCB3ZSBzYXkgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gY2FsbCBpcyByZXNvbHZlZCBieTxcL3A+XHJcblxyXG48cHJlPlxyXG5kID0gZzIoYywgZjMoYSwgYikpXHJcbjxcL3ByZT5cclxuXHJcbjxwPlVzaW5nIHRoZSBzYW1lIGRlY2xhcmF0aW9ucywgdGhlIGZ1bmN0aW9uIGNhbGwgPGNvZGU+YyA9IGcoYSwgZihhLCBjKSk8XC9jb2RlPiBjYW5ub3QgYmUgcmVzb2x2ZWQuIEFzIGEgZmluYWwgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uczxcL3A+XHJcblxyXG48cHJlPlxyXG5mbG9hdCB4KGZsb2F0IHcpXHJcbmludCB4KGZsb2F0IHcpXHJcbmNoYXIgeShmbG9hdCB2KVxyXG5jaGFyIHkoaW50IHYpXHJcbjxcL3ByZT5cclxuXHJcbjxwPmFuZCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIGZ1bmN0aW9uIGNhbGw8XC9wPlxyXG5cclxuPHByZT5cclxuZmxvYXQgYSA9IDEuMFxyXG5jaGFyIGMgPSB5KHgoYSkpXHJcbjxcL3ByZT5cclxuXHJcbjxwPkluIHRoaXMgY2FzZSwgd2Ugc2VlIHRoYXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uIGNhbGwgaXMgYW1iaWd1b3VzLjxcL3A+XHJcbiIsImlucHV0IjoiPHA+VGhlIGlucHV0IHdpbGwgY29uc2lzdCBvZiBhIGxpc3Qgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zIChvbmUgcGVyIGxpbmUpLiBFYWNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIHRoZSBpbnB1dCB3aWxsIGhhdmUgdGhlIGZvcm08XC9wPlxyXG5cclxuPHByZT5cclxubmFtZSBudW1fcGFyYW1zIHBhcmFtKDEpIHBhcmFtKDIpIC4uLiBwYXJhbShudW1fcGFyYW1zKSByZXR0eXBlPFwvcHJlPlxyXG5cclxuPHA+d2hlcmUgbmFtZSBpcyB0aGUgZnVuY3Rpb24gbmFtZSwgcGFyYW0oaSkgaXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgaS10aCBwYXJhbWV0ZXIsIGFuZCByZXR0eXBlIGlzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZSAodGhpcyBwcm9ibGVtIGRvZXMgbm90IGRlYWwgd2l0aCAmIzM5O3ZvaWQmIzM5OyBmdW5jdGlvbnMpOyBudW1fcGFyYW1zIGlzIGF0IGxlYXN0IDEgYW5kIGF0IG1vc3QgOS4gTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIG5hbWVzLCBpdCBpcyBvbmx5IHRoZWlyIGRhdGEgdHlwZXMgdGhhdCBtYXR0ZXIuIEZ1bmN0aW9uIG5hbWVzIGFyZSBzaW5nbGUgbG93ZXIgY2FzZSBsZXR0ZXJzLCB3aGlsZSBkYXRhIHR5cGVzIGFyZSBzaW5nbGUgdXBwZXIgY2FzZSBsZXR0ZXJzLiBEaWZmZXJlbnQgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB3aWxsIGFwcGVhciBjb25zZWN1dGl2ZWx5IGluIHRoZSBpbnB1dCwgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDUwMCBkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBlYWNoIGZ1bmN0aW9uIG5hbWUuIE5vIHR3byBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2lsbCBiZSBleGFjdGx5IHRoZSBzYW1lLiBFYWNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGNhcnJpZXMgd2l0aCBpdCwgaW1wbGljaXRseSwgYSAmIzM5O3NlcmlhbCBudW1iZXImIzM5Oy4gVGhlIHNlcmlhbCBudW1iZXJzIHN0YXJ0IG91dCBhdCAxIGFuZCBpbmNyZWFzZSB1bnRpbCBhIG5ldyBmdW5jdGlvbiBuYW1lIGlzIGVuY291bnRlcmVkOyB0aGVuIHRoZXkgc3RhcnQgb3V0IGF0IDEgYWdhaW4uPFwvcD5cclxuXHJcbjxwPlRoZSBsaXN0IG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUgaW5wdXQgd2lsbCBiZSBjb25jbHVkZWQgYnkgYSBsaW5lIGNvbnRhaW5pbmcgb25seSBhIHBvdW5kIHNpZ24gKCYjMzk7IyYjMzk7KS4gVGhlcmVhZnRlciB3aWxsIGNvbWUgYSBsaXN0IG9mIGZ1bmN0aW9uIGNhbGxzIChvbmUgcGVyIGxpbmUpLjxcL3A+XHJcblxyXG48cD5UaGUgc3RydWN0dXJlIG9mIGVhY2ggZnVuY3Rpb24gY2FsbCBjYW4gYmUgZGVcdWZiMDFuZWQgYnkgdGhlIGdyYW1tYXI6PFwvcD5cclxuXHJcbjxwcmU+XHJcbiZsdDtmdW5jdGlvbl9jYWxsJmd0OyA6PSAmbHQ7ZGF0YV90eXBlJmd0OyA9ICZsdDtyaWdodF9oYW5kX3NpZGUmZ3Q7XHJcbiZsdDtyaWdodF9oYW5kX3NpZGUmZ3Q7IDo9ICZsdDtmbmFtZSZndDsgJmx0O251bV9wYXJhbXMmZ3Q7ICZsdDtwYXJhbV9saXN0Jmd0O1xyXG4mbHQ7cGFyYW1fbGlzdCZndDsgOj0gJmx0O3BhcmFtJmd0OyB8ICZsdDtwYXJhbV9saXN0Jmd0OyAmbHQ7cGFyYW0mZ3Q7XHJcbiZsdDtwYXJhbSZndDsgOj0gJmx0O2RhdGFfdHlwZSZndDsgfCAmbHQ7cmlnaHRfaGFuZF9zaWRlJmd0O1xyXG4mbHQ7ZGF0YV90eXBlJmd0OyA6PSAmbHQ7dXBwZXJfY2FzZV9sZXR0ZXImZ3Q7XHJcbiZsdDtudW1fcGFyYW1zJmd0OyA6PSAmIzM5OzEmIzM5OyB8ICYjMzk7MiYjMzk7IHwgLi4uIHwgJiMzOTs5JiMzOTtcclxuJmx0O2ZuYW1lJmd0OyA6PSAmbHQ7bG93ZXJfY2FzZV9sZXR0ZXImZ3Q7PFwvcHJlPlxyXG5cclxuPHA+SGVyZSB0aGUgc3ltYm9scyA6PSBhbmQgfCBhcmUgdXNlZCB0byBkZVx1ZmIwMW5lIHRoZSBncmFtbWFyLCB0aGV5IHdpbGwgbm90IHNob3cgdXAgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbiBjYWxsLiBGdXJ0aGVybW9yZSwgaW4gYW55IGZ1bmN0aW9uIGNhbGwgdGhlIHNwZWNpXHVmYjAxZWQgbnVtX3BhcmFtcyB3aWxsIG1hdGNoIGV4YWN0bHkgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGdpdmVuIGluIHRoZSBwYXJhbWV0ZXIgbGlzdC4gRWFjaCBmdW5jdGlvbiBjYWxsIHdpbGwgY29udGFpbiBubyBtb3JlIHRoYW4gNTAwIGZ1bmN0aW9uIG5hbWVzIChub3QgbmVjZXNzYXJpbHkgZGlzdGluY3QpLiBUaGUgZW5kIG9mIHRoZSBsaXN0IG9mIGZ1bmN0aW9uIGNhbGxzIHdpbGwgYmUgbWFya2VkIGJ5IGEgbGluZSBjb250YWluaW5nIG9ubHkgYSBwb3VuZCBzaWduLiBJbiBlYWNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBhcyB3ZWxsIGFzIGluIGVhY2ggZnVuY3Rpb24gY2FsbCBpbiB0aGUgaW5wdXQsIGFkamFjZW50IHRva2VucyAobG93ZXIgb3IgdXBwZXIgY2FzZSBsZXR0ZXJzLCBkaWdpdHMsIGVxdWFscyBzaWduKSB3aWxsIGJlIHNlcGFyYXRlZCBieSBleGFjdGx5IG9uZSBibGFuayBzcGFjZS48XC9wPlxyXG4iLCJvdXRwdXQiOiI8cD5Gb3IgZWFjaCBmdW5jdGlvbiBjYWxsIGluIHRoZSBpbnB1dCwgdGhlcmUgd2lsbCBiZSBvbmUgbGluZSBvZiBvdXRwdXQuIElmIHRoZSBmdW5jdGlvbiBjYWxsIGNhbiBiZSByZXNvbHZlZCB1bmlxdWVseSwgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBpbnB1dCBmdW5jdGlvbiBjYWxsLCBidXQgZWFjaCBmdW5jdGlvbiBuYW1lIHdpbGwgaGF2ZSBhIHNlcmlhbCBudW1iZXIgYXBwZW5kZWQgdG8gaXQsIHRvIGluZGljYXRlIHdoaWNoIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdhcyB1c2VkIHRoZXJlLiBPdGhlcndpc2UsIHRoZSBvdXRwdXQgd2lsbCBiZSBlaXRoZXIgJiMzOTtpbXBvc3NpYmxlJiMzOTsgb3IgJiMzOTthbWJpZ3VvdXMmIzM5OywgYXMgZXhwbGFpbmVkIGFib3ZlLiBJZiBpdCBpcyBhbWJpZ3VvdXMsIGFsc28gb3V0cHV0IHRoZSBudW1iZXIgb2Ygd2F5cyB0aGUgZnVuY3Rpb24gY2FsbCBjYW4gYmUgcmVzb2x2ZWQsIG9yIHByaW50ICYjMzk7Jmd0OyAxMDAwJiMzOTsgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxMDAwIHdheXMuPFwvcD5cclxuIiwiaGludCI6IiIsIm9yaWdpbmFsIjoiMSIsInByb2JsZW1fbGFuZ19jb2RlIjoiXHVjNjAxXHVjNWI0In1d