#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD 1000000007
struct mint{
static unsigned R, RR, Rinv, W, md, mdninv;
unsigned val;
mint( ) {
}
mint( int a) {
val = mulR( a) ;
}
mint( unsigned a) {
val = mulR( a) ;
}
mint( long long a) {
val = mulR( a) ;
}
mint( unsigned long long a) {
val = mulR( a) ;
}
int get_inv( long long a, int md) {
long long e, s= md, t= a, u= 1 , v= 0 ;
while ( s) {
e= t/ s;
t- = e* s;
u- = e* v;
swap( t,s) ;
swap( u,v) ;
}
if ( u< 0 ) {
u+ = md;
}
return u;
}
void setmod( unsigned m) {
int i;
unsigned t;
W = 32 ;
md = m;
R = ( 1ULL << W) % md;
RR = ( unsigned long long ) R* R % md;
switch ( m) {
case 104857601 :
Rinv = 2560000 ;
mdninv = 104857599 ;
break ;
case 998244353 :
Rinv = 232013824 ;
mdninv = 998244351 ;
break ;
case 1000000007 :
Rinv = 518424770 ;
mdninv = 2226617417U;
break ;
case 1000000009 :
Rinv = 171601999 ;
mdninv = 737024967 ;
break ;
case 1004535809 :
Rinv = 234947584 ;
mdninv = 1004535807 ;
break ;
case 1007681537 :
Rinv = 236421376 ;
mdninv = 1007681535 ;
break ;
case 1012924417 :
Rinv = 238887936 ;
mdninv = 1012924415 ;
break ;
case 1045430273 :
Rinv = 254466304 ;
mdninv = 1045430271 ;
break ;
case 1051721729 :
Rinv = 257538304 ;
mdninv = 1051721727 ;
break ;
default :
Rinv = get_inv( R, md) ;
mdninv = 0 ;
t = 0 ;
for ( i= 0 ; i< ( ( int ) W) ; i++ ) {
if ( t% 2 == 0 ) {
t+ = md;
mdninv | = ( 1U<< i) ;
}
t / = 2 ;
}
}
}
unsigned mulR( unsigned a) {
return ( unsigned long long ) a* R% md;
}
unsigned mulR( int a) {
if ( a < 0 ) {
a = a% md+ md;
}
return mulR( ( unsigned ) a) ;
}
unsigned mulR( unsigned long long a) {
return mulR( ( unsigned ) ( a% md) ) ;
}
unsigned mulR( long long a) {
a % = md;
if ( a < 0 ) {
a + = md;
}
return mulR( ( unsigned ) a) ;
}
unsigned reduce( unsigned T) {
unsigned m= T * mdninv, t= ( unsigned ) ( ( T + ( unsigned long long ) m* md) >> W) ;
if ( t >= md) {
t - = md;
}
return t;
}
unsigned reduce( unsigned long long T) {
unsigned m= ( unsigned ) T * mdninv, t= ( unsigned ) ( ( T + ( unsigned long long ) m* md) >> W) ;
if ( t >= md) {
t - = md;
}
return t;
}
unsigned get( ) {
return reduce( val) ;
}
mint & operator+ = ( mint a) {
val + = a.val ;
if ( val >= md) {
val - = md;
}
return * this ;
}
mint & operator- = ( mint a) {
if ( val < a.val ) {
val = val + md - a.val ;
}
else {
val - = a.val ;
}
return * this ;
}
mint & operator* = ( mint a) {
val = reduce( ( unsigned long long ) val* a.val ) ;
return * this ;
}
mint & operator/ = ( mint a) {
return * this * = a.inverse ( ) ;
}
mint operator+ ( mint a) {
return mint( * this ) + = a;
}
mint operator- ( mint a) {
return mint( * this ) - = a;
}
mint operator* ( mint a) {
return mint( * this ) * = a;
}
mint operator/ ( mint a) {
return mint( * this ) / = a;
}
mint operator+ ( int a) {
return mint( * this ) + = mint( a) ;
}
mint operator- ( int a) {
return mint( * this ) - = mint( a) ;
}
mint operator* ( int a) {
return mint( * this ) * = mint( a) ;
}
mint operator/ ( int a) {
return mint( * this ) / = mint( a) ;
}
mint operator+ ( long long a) {
return mint( * this ) + = mint( a) ;
}
mint operator- ( long long a) {
return mint( * this ) - = mint( a) ;
}
mint operator* ( long long a) {
return mint( * this ) * = mint( a) ;
}
mint operator/ ( long long a) {
return mint( * this ) / = mint( a) ;
}
mint operator- ( void ) {
mint res;
if ( val) {
res.val = md- val;
}
else {
res.val = 0 ;
}
return res;
}
operator bool ( void ) {
return val! = 0 ;
}
operator int ( void ) {
return get( ) ;
}
operator long long ( void ) {
return get( ) ;
}
mint inverse( ) {
int a= val, b= md, t, u= 1 , v= 0 ;
mint res;
while ( b) {
t = a / b;
a - = t * b;
swap( a, b) ;
u - = t * v;
swap( u, v) ;
}
if ( u < 0 ) {
u + = md;
}
res.val = ( unsigned long long ) u* RR % md;
return res;
}
mint pw( unsigned long long b) {
mint a( * this ) , res;
res.val = R;
while ( b) {
if ( b& 1 ) {
res * = a;
}
b >>= 1 ;
a * = a;
}
return res;
}
bool operator== ( int a) {
return mulR( a) == val;
}
bool operator! = ( int a) {
return mulR( a) ! = val;
}
}
;
mint operator+ ( int a, mint b) {
return mint( a) + = b;
}
mint operator- ( int a, mint b) {
return mint( a) - = b;
}
mint operator* ( int a, mint b) {
return mint( a) * = b;
}
mint operator/ ( int a, mint b) {
return mint( a) / = b;
}
mint operator+ ( long long a, mint b) {
return mint( a) + = b;
}
mint operator- ( long long a, mint b) {
return mint( a) - = b;
}
mint operator* ( long long a, mint b) {
return mint( a) * = b;
}
mint operator/ ( long long a, mint b) {
return mint( a) / = b;
}
unsigned mint:: R , mint:: RR , mint:: Rinv , mint:: W , mint:: md , mint:: mdninv ;
#define main dummy_main
int main( ) {
{
mint x;
x.setmod ( MD) ;
}
return 0 ;
}
#undef main
mint dp[ 1001 ] ;
class Solution{
public :
int numRollsToTarget( int d, int f, int target) {
int Lj4PdHRW, i, j, k;
dummy_main( ) ;
for ( i= 0 ; i< ( 1001 ) ; i++ ) {
dp[ i] = 0 ;
}
dp[ 0 ] = 1 ;
for ( Lj4PdHRW= 0 ; Lj4PdHRW< ( d) ; Lj4PdHRW++ ) {
for ( i= 1000 ; i>= 0 ; i-- ) {
dp[ i] = 0 ;
for ( j= ( 1 ) ; j< ( f+ 1 ) ; j++ ) {
if ( i- j < 0 ) {
break ;
}
dp[ i] + = dp[ i- j] ;
}
}
}
return dp[ target] ;
}
}
;
// cLay varsion 20190818-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// mint dp[1001];
//
// class Solution {
// public:
// int numRollsToTarget(int d, int f, int target) {
// dummy_main();
//
// int i, j, k;
// rep(i,1001) dp[i] = 0;
// dp[0] = 1;
//
// rep(d){
// for(i=1000;i>=0;i--){
// dp[i] = 0;
// rep(j,1,f+1){
// if(i-j < 0) break;
// dp[i] += dp[i-j];
// }
// }
// }
//
// return dp[target];
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTUQgMTAwMDAwMDAwNwpzdHJ1Y3QgbWludHsKICBzdGF0aWMgdW5zaWduZWQgUiwgUlIsIFJpbnYsIFcsIG1kLCBtZG5pbnY7CiAgdW5zaWduZWQgdmFsOwogIG1pbnQoKXsKICB9CiAgbWludChpbnQgYSl7CiAgICB2YWwgPSBtdWxSKGEpOwogIH0KICBtaW50KHVuc2lnbmVkIGEpewogICAgdmFsID0gbXVsUihhKTsKICB9CiAgbWludChsb25nIGxvbmcgYSl7CiAgICB2YWwgPSBtdWxSKGEpOwogIH0KICBtaW50KHVuc2lnbmVkIGxvbmcgbG9uZyBhKXsKICAgIHZhbCA9IG11bFIoYSk7CiAgfQogIGludCBnZXRfaW52KGxvbmcgbG9uZyBhLCBpbnQgbWQpewogICAgbG9uZyBsb25nIGUsIHM9bWQsIHQ9YSwgdT0xLCB2PTA7CiAgICB3aGlsZShzKXsKICAgICAgZT10L3M7CiAgICAgIHQtPWUqczsKICAgICAgdS09ZSp2OwogICAgICBzd2FwKHQscyk7CiAgICAgIHN3YXAodSx2KTsKICAgIH0KICAgIGlmKHU8MCl7CiAgICAgIHUrPW1kOwogICAgfQogICAgcmV0dXJuIHU7CiAgfQogIHZvaWQgc2V0bW9kKHVuc2lnbmVkIG0pewogICAgaW50IGk7CiAgICB1bnNpZ25lZCB0OwogICAgVyA9IDMyOwogICAgbWQgPSBtOwogICAgUiA9ICgxVUxMIDw8IFcpICUgbWQ7CiAgICBSUiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpUipSICUgbWQ7CiAgICBzd2l0Y2gobSl7CiAgICAgIGNhc2UgMTA0ODU3NjAxOgogICAgICBSaW52ID0gMjU2MDAwMDsKICAgICAgbWRuaW52ID0gMTA0ODU3NTk5OwogICAgICBicmVhazsKICAgICAgY2FzZSA5OTgyNDQzNTM6CiAgICAgIFJpbnYgPSAyMzIwMTM4MjQ7CiAgICAgIG1kbmludiA9IDk5ODI0NDM1MTsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTAwMDAwMDAwNzoKICAgICAgUmludiA9IDUxODQyNDc3MDsKICAgICAgbWRuaW52ID0gMjIyNjYxNzQxN1U7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIDEwMDAwMDAwMDk6CiAgICAgIFJpbnYgPSAxNzE2MDE5OTk7CiAgICAgIG1kbmludiA9IDczNzAyNDk2NzsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTAwNDUzNTgwOToKICAgICAgUmludiA9IDIzNDk0NzU4NDsKICAgICAgbWRuaW52ID0gMTAwNDUzNTgwNzsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTAwNzY4MTUzNzoKICAgICAgUmludiA9IDIzNjQyMTM3NjsKICAgICAgbWRuaW52ID0gMTAwNzY4MTUzNTsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTAxMjkyNDQxNzoKICAgICAgUmludiA9IDIzODg4NzkzNjsKICAgICAgbWRuaW52ID0gMTAxMjkyNDQxNTsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTA0NTQzMDI3MzoKICAgICAgUmludiA9IDI1NDQ2NjMwNDsKICAgICAgbWRuaW52ID0gMTA0NTQzMDI3MTsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMTA1MTcyMTcyOToKICAgICAgUmludiA9IDI1NzUzODMwNDsKICAgICAgbWRuaW52ID0gMTA1MTcyMTcyNzsKICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgIFJpbnYgPSBnZXRfaW52KFIsIG1kKTsKICAgICAgbWRuaW52ID0gMDsKICAgICAgdCA9IDA7CiAgICAgIGZvcihpPTA7aTwoKGludClXKTtpKyspewogICAgICAgIGlmKHQlMj09MCl7CiAgICAgICAgICB0Kz1tZDsKICAgICAgICAgIG1kbmludiB8PSAoMVU8PGkpOwogICAgICAgIH0KICAgICAgICB0IC89IDI7CiAgICAgIH0KICAgIH0KICB9CiAgdW5zaWduZWQgbXVsUih1bnNpZ25lZCBhKXsKICAgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKWEqUiVtZDsKICB9CiAgdW5zaWduZWQgbXVsUihpbnQgYSl7CiAgICBpZihhIDwgMCl7CiAgICAgIGEgPSBhJW1kK21kOwogICAgfQogICAgcmV0dXJuIG11bFIoKHVuc2lnbmVkKWEpOwogIH0KICB1bnNpZ25lZCBtdWxSKHVuc2lnbmVkIGxvbmcgbG9uZyBhKXsKICAgIHJldHVybiBtdWxSKCh1bnNpZ25lZCkoYSVtZCkpOwogIH0KICB1bnNpZ25lZCBtdWxSKGxvbmcgbG9uZyBhKXsKICAgIGEgJT0gbWQ7CiAgICBpZihhIDwgMCl7CiAgICAgIGEgKz0gbWQ7CiAgICB9CiAgICByZXR1cm4gbXVsUigodW5zaWduZWQpYSk7CiAgfQogIHVuc2lnbmVkIHJlZHVjZSh1bnNpZ25lZCBUKXsKICAgIHVuc2lnbmVkIG09VCAqIG1kbmludiwgdD0odW5zaWduZWQpKChUICsgKHVuc2lnbmVkIGxvbmcgbG9uZyltKm1kKSA+PiBXKTsKICAgIGlmKHQgPj0gbWQpewogICAgICB0IC09IG1kOwogICAgfQogICAgcmV0dXJuIHQ7CiAgfQogIHVuc2lnbmVkIHJlZHVjZSh1bnNpZ25lZCBsb25nIGxvbmcgVCl7CiAgICB1bnNpZ25lZCBtPSh1bnNpZ25lZClUICogbWRuaW52LCB0PSh1bnNpZ25lZCkoKFQgKyAodW5zaWduZWQgbG9uZyBsb25nKW0qbWQpID4+IFcpOwogICAgaWYodCA+PSBtZCl7CiAgICAgIHQgLT0gbWQ7CiAgICB9CiAgICByZXR1cm4gdDsKICB9CiAgdW5zaWduZWQgZ2V0KCl7CiAgICByZXR1cm4gcmVkdWNlKHZhbCk7CiAgfQogIG1pbnQgJm9wZXJhdG9yKz0obWludCBhKXsKICAgIHZhbCArPSBhLnZhbDsKICAgIGlmKHZhbCA+PSBtZCl7CiAgICAgIHZhbCAtPSBtZDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CiAgbWludCAmb3BlcmF0b3ItPShtaW50IGEpewogICAgaWYodmFsIDwgYS52YWwpewogICAgICB2YWwgPSB2YWwgKyBtZCAtIGEudmFsOwogICAgfQogICAgZWxzZXsKICAgICAgdmFsIC09IGEudmFsOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KICBtaW50ICZvcGVyYXRvcio9KG1pbnQgYSl7CiAgICB2YWwgPSByZWR1Y2UoKHVuc2lnbmVkIGxvbmcgbG9uZyl2YWwqYS52YWwpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBtaW50ICZvcGVyYXRvci89KG1pbnQgYSl7CiAgICByZXR1cm4gKnRoaXMgKj0gYS5pbnZlcnNlKCk7CiAgfQogIG1pbnQgb3BlcmF0b3IrKG1pbnQgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcykrPWE7CiAgfQogIG1pbnQgb3BlcmF0b3ItKG1pbnQgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcyktPWE7CiAgfQogIG1pbnQgb3BlcmF0b3IqKG1pbnQgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcykqPWE7CiAgfQogIG1pbnQgb3BlcmF0b3IvKG1pbnQgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcykvPWE7CiAgfQogIG1pbnQgb3BlcmF0b3IrKGludCBhKXsKICAgIHJldHVybiBtaW50KCp0aGlzKSs9bWludChhKTsKICB9CiAgbWludCBvcGVyYXRvci0oaW50IGEpewogICAgcmV0dXJuIG1pbnQoKnRoaXMpLT1taW50KGEpOwogIH0KICBtaW50IG9wZXJhdG9yKihpbnQgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcykqPW1pbnQoYSk7CiAgfQogIG1pbnQgb3BlcmF0b3IvKGludCBhKXsKICAgIHJldHVybiBtaW50KCp0aGlzKS89bWludChhKTsKICB9CiAgbWludCBvcGVyYXRvcisobG9uZyBsb25nIGEpewogICAgcmV0dXJuIG1pbnQoKnRoaXMpKz1taW50KGEpOwogIH0KICBtaW50IG9wZXJhdG9yLShsb25nIGxvbmcgYSl7CiAgICByZXR1cm4gbWludCgqdGhpcyktPW1pbnQoYSk7CiAgfQogIG1pbnQgb3BlcmF0b3IqKGxvbmcgbG9uZyBhKXsKICAgIHJldHVybiBtaW50KCp0aGlzKSo9bWludChhKTsKICB9CiAgbWludCBvcGVyYXRvci8obG9uZyBsb25nIGEpewogICAgcmV0dXJuIG1pbnQoKnRoaXMpLz1taW50KGEpOwogIH0KICBtaW50IG9wZXJhdG9yLSh2b2lkKXsKICAgIG1pbnQgcmVzOwogICAgaWYodmFsKXsKICAgICAgcmVzLnZhbD1tZC12YWw7CiAgICB9CiAgICBlbHNlewogICAgICByZXMudmFsPTA7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KICBvcGVyYXRvciBib29sKHZvaWQpewogICAgcmV0dXJuIHZhbCE9MDsKICB9CiAgb3BlcmF0b3IgaW50KHZvaWQpewogICAgcmV0dXJuIGdldCgpOwogIH0KICBvcGVyYXRvciBsb25nIGxvbmcodm9pZCl7CiAgICByZXR1cm4gZ2V0KCk7CiAgfQogIG1pbnQgaW52ZXJzZSgpewogICAgaW50IGE9dmFsLCBiPW1kLCB0LCB1PTEsIHY9MDsKICAgIG1pbnQgcmVzOwogICAgd2hpbGUoYil7CiAgICAgIHQgPSBhIC8gYjsKICAgICAgYSAtPSB0ICogYjsKICAgICAgc3dhcChhLCBiKTsKICAgICAgdSAtPSB0ICogdjsKICAgICAgc3dhcCh1LCB2KTsKICAgIH0KICAgIGlmKHUgPCAwKXsKICAgICAgdSArPSBtZDsKICAgIH0KICAgIHJlcy52YWwgPSAodW5zaWduZWQgbG9uZyBsb25nKXUqUlIgJSBtZDsKICAgIHJldHVybiByZXM7CiAgfQogIG1pbnQgcHcodW5zaWduZWQgbG9uZyBsb25nIGIpewogICAgbWludCBhKCp0aGlzKSwgcmVzOwogICAgcmVzLnZhbCA9IFI7CiAgICB3aGlsZShiKXsKICAgICAgaWYoYiYxKXsKICAgICAgICByZXMgKj0gYTsKICAgICAgfQogICAgICBiID4+PSAxOwogICAgICBhICo9IGE7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KICBib29sIG9wZXJhdG9yPT0oaW50IGEpewogICAgcmV0dXJuIG11bFIoYSk9PXZhbDsKICB9CiAgYm9vbCBvcGVyYXRvciE9KGludCBhKXsKICAgIHJldHVybiBtdWxSKGEpIT12YWw7CiAgfQp9CjsKbWludCBvcGVyYXRvcisoaW50IGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkrPWI7Cn0KbWludCBvcGVyYXRvci0oaW50IGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSktPWI7Cn0KbWludCBvcGVyYXRvciooaW50IGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkqPWI7Cn0KbWludCBvcGVyYXRvci8oaW50IGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkvPWI7Cn0KbWludCBvcGVyYXRvcisobG9uZyBsb25nIGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkrPWI7Cn0KbWludCBvcGVyYXRvci0obG9uZyBsb25nIGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSktPWI7Cn0KbWludCBvcGVyYXRvcioobG9uZyBsb25nIGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkqPWI7Cn0KbWludCBvcGVyYXRvci8obG9uZyBsb25nIGEsIG1pbnQgYil7CiAgcmV0dXJuIG1pbnQoYSkvPWI7Cn0KdW5zaWduZWQgbWludDo6UiwgbWludDo6UlIsIG1pbnQ6OlJpbnYsIG1pbnQ6OlcsIG1pbnQ6Om1kLCBtaW50OjptZG5pbnY7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgewogICAgbWludCB4OwogICAgeC5zZXRtb2QoTUQpOwogIH0KICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgptaW50IGRwWzEwMDFdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG51bVJvbGxzVG9UYXJnZXQoaW50IGQsIGludCBmLCBpbnQgdGFyZ2V0KXsKICAgIGludCBMajRQZEhSVywgaSwgaiwgazsKICAgIGR1bW15X21haW4oKTsKICAgIGZvcihpPTA7aTwoMTAwMSk7aSsrKXsKICAgICAgZHBbaV0gPSAwOwogICAgfQogICAgZHBbMF0gPSAxOwogICAgZm9yKExqNFBkSFJXPTA7TGo0UGRIUlc8KGQpO0xqNFBkSFJXKyspewogICAgICBmb3IoaT0xMDAwO2k+PTA7aS0tKXsKICAgICAgICBkcFtpXSA9IDA7CiAgICAgICAgZm9yKGo9KDEpO2o8KGYrMSk7aisrKXsKICAgICAgICAgIGlmKGktaiA8IDApewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRwW2ldICs9IGRwW2ktal07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZHBbdGFyZ2V0XTsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAxOTA4MTgtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBtaW50IGRwWzEwMDFdOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG51bVJvbGxzVG9UYXJnZXQoaW50IGQsIGludCBmLCBpbnQgdGFyZ2V0KSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICAKLy8gICAgIGludCBpLCBqLCBrOwovLyAgICAgcmVwKGksMTAwMSkgZHBbaV0gPSAwOwovLyAgICAgZHBbMF0gPSAxOwovLyAKLy8gICAgIHJlcChkKXsKLy8gICAgICAgZm9yKGk9MTAwMDtpPj0wO2ktLSl7Ci8vICAgICAgICAgZHBbaV0gPSAwOwovLyAgICAgICAgIHJlcChqLDEsZisxKXsKLy8gICAgICAgICAgIGlmKGktaiA8IDApIGJyZWFrOwovLyAgICAgICAgICAgZHBbaV0gKz0gZHBbaS1qXTsKLy8gICAgICAgICB9Ci8vICAgICAgIH0KLy8gICAgIH0KLy8gCi8vICAgICByZXR1cm4gZHBbdGFyZ2V0XTsKLy8gICB9Ci8vIH07Cg==