#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
typedef long long ll;
using namespace std;
template<typename S, typename T>
ostream& operator<<(ostream& out,pair<S,T> const& p){out<<'('<<p.fi<<", "<<p.se<<')';return out;}
template<typename T>
ostream& operator<<(ostream& out,vector<T> const& v){
int l=v.size();for(int i=0;i<l-1;i++)out<<v[i]<<' ';if(l>0)out<<v[l-1];return out;}
void tr(){cout << endl;}
template<typename S, typename ... Strings>
void tr(S x, const Strings&... rest){cout<<x<<' ';tr(rest...);}
typedef long long ll;
typedef pair<int,int> pii;
const ll N = 50005;
int blksize;
struct line{
ll m, c;
ll get(ll x){
ll xx = 1LL*m*x;
return xx + c;
}
};
struct convexHull{
ll top;
line st[250];
bool smallerIntercept(const line &l1, const line &l2, const line &l3){
return (l3.c - l1.c) * (l1.m - l2.m) <= (l2.c - l1.c) * (l1.m - l3.m);
}
convexHull() : top(0) { }
void insert(ll m, ll c){
line l = {m, c};
while(top > 1 and smallerIntercept(st[top-2], st[top-1], l)) --top;
st[top++] = l;
return;
}
void clear_hull(){
top=0;
}
ll query(ll x){
ll lo = 0, hi = top-1, mid;
while(lo+1 <= hi){
mid = (lo + hi) >> 1;
if(st[mid].get(x) <= st[mid+1].get(x)) lo = mid+1; else hi = mid;
}
//ll mx=0;
//for(int i=0;i<=hi;i++) mx=max(mx,st[i].get(x));
return st[lo].get(x);
//return mx;
}
};
vector<pair<ll,ll> >v;
vector<pair<ll,ll> >vec[250];
vector<pair<ll,ll> >temp;
vector<ll>vaa;
ll n,q;
struct convexHull cht[250];
ll a[N], sum[N], total = 0;
ll aa[N];
ll tot_blk;
ll bb[N];
bool cmp(pair<ll,ll>v1,pair<ll,ll>v2)
{
if(v1.first<v2.first)
{
return 1;
}
else if(v1.first>v2.first)
{
return 0;
}
if(v1.second>v2.second)
{
return 1;
}
return 0;
}
void rebuild()
{
temp.clear();
for(int i=0;i<tot_blk;i++)
{
for(int j=0;j<vec[i].size();j++)
{
temp.pb({vec[i][j].first,vec[i][j].second});
}
vec[i].clear();
}
for(int i=0;i<temp.size();i++)
{
vec[i/blksize].pb({temp[i].first,temp[i].second});
}
temp.clear();
for(int i=0;i<tot_blk;i++)
{
temp.clear();
for(int j=0;j<vec[i].size();j++)
{
int fi = vec[i][j].first;
int se = vec[i][j].second;
temp.pb({fi,se});
}
sort(temp.begin(),temp.end(),cmp);
// cht[i].clear_hull();
cht[i] = (*new convexHull());
for(int j=0;j<temp.size();j++)
{
cht[i].insert(temp[j].first,temp[j].second);
}
}
}
int main(){
scanf("%lld",&n);
for(int i=0;i<n;i++)
{
ll x,y;
scanf("%lld %lld",&x,&y);
v.pb({x,y});
}
blksize = sqrt(n)+1;
for(int i=0;i<n;i++)
{
vec[i/blksize].pb({v[i].first,v[i].second});
}
tot_blk = n/blksize;
if(n%blksize!=0)
tot_blk++;
for(int i=0;i<tot_blk;i++)
{
temp.clear();
for(int j=0;j<vec[i].size();j++)
{
int fi = vec[i][j].first;
int se = vec[i][j].second;
temp.pb({fi,se});
}
sort(temp.begin(),temp.end(),cmp);
cht[i] = *(new convexHull());
for(int j=0;j<temp.size();j++)
{
cht[i].insert(temp[j].first,temp[j].second);
}
}
/*
cout<<cht[1].query(14188)<<endl;
temp.clear();
temp.pb({18173,2178});
temp.pb({32296,5322});
temp.pb({14230,29386});
sort(temp.begin(),temp.end(),cmp);
for(int j=0;j<temp.size();j++)
{
cht[4].insert(temp[j].first,temp[j].second);
}
cout<<cht[4].query(14188)<<endl;
*/
scanf("%lld",&q);
ll cnt = 0;
while(q--)
{
int type,l,r,x;
scanf("%d",&type);
if(type == 1)
{
scanf("%d %d",&l,&r);
if(cnt == blksize)
{
rebuild();
cnt=0;
}
cnt++;
int st=0,ed=0;
for(int i=0;i<tot_blk;i++)
{
if(vec[i].size()<l)
{
l-=vec[i].size();
}
else
{
st = i;
break;
}
}
for(int i=0;i<tot_blk;i++)
{
if(vec[i].size()<r)
{
r -= vec[i].size();
}
else
{
ed = i;
break;
}
}
//cout<<blksize<<" "<<tot_blk<<" "<<st<<" "<<ed<<" "<<l<<" "<<r<<endl;
if(st == ed)
{
pair<ll,ll> ele = vec[st][l-1];
vec[st].erase(vec[st].begin()+l-1);
vector<pair<ll,ll> >::iterator it = vec[st].begin();
vec[st].insert(vec[st].begin()+r-1,ele);
}
else
{
pair<ll,ll> ele = vec[st][l-1];
//cout<<"sd1"<<endl;
vec[st].erase(vec[st].begin()+l-1);
vector<pair<ll,ll> >::iterator it = vec[st].begin();
vec[ed].insert(vec[ed].begin()+r,ele);
//cout<<"sd2"<<endl;
temp.clear();
// cout<<"temp array"<<endl;
for(int i=0;i<vec[st].size();i++)
{
temp.pb({vec[st][i].first,vec[st][i].second});
// cout<<vec[st][i].first<<" "<<vec[st][i].second<<endl;
}
//cout<<endl;
sort(temp.begin(),temp.end(),cmp);
//cht[st].clear_hull();
cht[st]=*(new convexHull());
// cout<<"temp start"<<endl;
for(int i=0;i<temp.size();i++)
{
cht[st].insert(temp[i].first,temp[i].second);
// cout<<temp[i].first<<" "<<temp[i].second<<endl;
}
// cout<<st<<" "<<cht[st].query(14188)<<endl;
// cout<<"temp end"<<endl;
temp.clear();
for(int i=0;i<vec[ed].size();i++)
{
temp.pb({vec[ed][i].first,vec[ed][i].second});
//cout<<vec[ed][i].first<<" "<<vec[ed][i].second<<endl;
}
// cout<<"temp array end"<<endl;
sort(temp.begin(),temp.end(),cmp);
// cout<<cht[1].query(14188)<<endl;
//cht[ed].clear_hull();
cht[ed]=*(new convexHull());
// cout<<cht[1].query(14188)<<" "<<ed<<endl;
for(int i=0;i<temp.size();i++)
{
cht[ed].insert(temp[i].first,temp[i].second);
}
// cout<<cht[1].query(14188)<<endl;
}
}
else
{
scanf("%d %d %d",&l,&r,&x);
//cin>>l>>r>>x;
int st=0,ed=0;
for(int i=0;i<tot_blk;i++)
{
if(vec[i].size()<l)
{
l-=vec[i].size();
}
else
{
st = i;
break;
}
}
for(int i=0;i<tot_blk;i++)
{
if(vec[i].size()<r)
{
r -= vec[i].size();
}
else
{
ed = i;
break;
}
}
ll ans = -1;
// cout<<st<<" "<<ed<<" "<<l<<" "<<r<<" "<<blksize<<endl;
if(st == ed)
{
for(int i=l-1;i<=r-1;i++)
{
ll m = vec[st][i].first;
ll c = vec[st][i].second;
ll aa = 1LL*m*x+1LL*c;
ans = max(ans,aa);
}
}
else
{
for(int i=l-1;i<vec[st].size();i++)
{
ll m = vec[st][i].first;
ll c = vec[st][i].second;
ll aa = 1LL*m*x+1LL*c;
ans = max(ans,aa);
}
// cout<<ans<<endl;
for(int i=0;i<=r-1;i++)
{
ll m = vec[ed][i].first;
ll c = vec[ed][i].second;
ll aa = 1LL*m*x+1LL*c;
ans = max(ans,aa);
}
// cout<<ans<<endl;
// cout<<cht[1].query(14188);
for(int i=st+1;i<ed;i++)
{
ll aa = cht[i].query(x);
ans = max(ans,aa);
// cout<<"YES"<<i<<" "<<x<<" "<<aa<<endl;
//cout<<"blk "<<i<<" "<<aa<<endl;
}
}
printf("%lld\n",ans);
}
}
return 0;
}
ICAgICAgICNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgogCiAgICAgICAgI2RlZmluZSBwYiBwdXNoX2JhY2sKICAgICAgICAjZGVmaW5lIG1wIG1ha2VfcGFpcgogCiAgICAgICAgdHlwZWRlZiBsb25nIGxvbmcgbGw7CiAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CiAgICAgICAgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQscGFpcjxTLFQ+IGNvbnN0JiBwKXtvdXQ8PCcoJzw8cC5maTw8IiwgIjw8cC5zZTw8JyknO3JldHVybiBvdXQ7fQogCiAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCx2ZWN0b3I8VD4gY29uc3QmIHYpewogICAgICAgIGludCBsPXYuc2l6ZSgpO2ZvcihpbnQgaT0wO2k8bC0xO2krKylvdXQ8PHZbaV08PCcgJztpZihsPjApb3V0PDx2W2wtMV07cmV0dXJuIG91dDt9CiAKICAgICAgICB2b2lkIHRyKCl7Y291dCA8PCBlbmRsO30KICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSAuLi4gU3RyaW5ncz4KICAgICAgICB2b2lkIHRyKFMgeCwgY29uc3QgU3RyaW5ncyYuLi4gcmVzdCl7Y291dDw8eDw8JyAnO3RyKHJlc3QuLi4pO30KIAogICAgICAgIHR5cGVkZWYgbG9uZyBsb25nIGxsOwogICAgICAgIHR5cGVkZWYgcGFpcjxpbnQsaW50PiBwaWk7CiAKICAgICAgICBjb25zdCBsbCBOID0gNTAwMDU7CiAgICAgICAgaW50IGJsa3NpemU7CiAgICAgICAgc3RydWN0IGxpbmV7CiAgICAgICAgCWxsIG0sIGM7CiAgICAgICAgCWxsIGdldChsbCB4KXsKIAogICAgICAgICAgICAgICAgbGwgeHggPSAxTEwqbSp4OwogCiAgICAgICAgCQlyZXR1cm4geHggKyBjOwogICAgICAgIAl9CiAgICAgICAgfTsKIAogCiAKICAgICAgICBzdHJ1Y3QgY29udmV4SHVsbHsKICAgICAgICAJbGwgdG9wOwogICAgICAgICAgICBsaW5lIHN0WzI1MF07CiAgICAgICAgCWJvb2wgc21hbGxlckludGVyY2VwdChjb25zdCBsaW5lICZsMSwgY29uc3QgbGluZSAmbDIsIGNvbnN0IGxpbmUgJmwzKXsKICAgICAgICAJCXJldHVybiAobDMuYyAtIGwxLmMpICogKGwxLm0gLSBsMi5tKSA8PSAobDIuYyAtIGwxLmMpICogKGwxLm0gLSBsMy5tKTsKICAgICAgICAJfQogCiAgICAgICAgCWNvbnZleEh1bGwoKSA6IHRvcCgwKSB7CX0KIAogICAgICAgIAl2b2lkIGluc2VydChsbCBtLCBsbCBjKXsKICAgICAgICAJCWxpbmUgbCA9IHttLCBjfTsKIAogICAgICAgIAkJd2hpbGUodG9wID4gMSBhbmQgc21hbGxlckludGVyY2VwdChzdFt0b3AtMl0sIHN0W3RvcC0xXSwgbCkpIC0tdG9wOwogICAgICAgIAkJc3RbdG9wKytdID0gbDsKICAgICAgICAJCXJldHVybjsKICAgICAgICAJfQogICAgICAgIAl2b2lkIGNsZWFyX2h1bGwoKXsKICAgICAgICAJIHRvcD0wOwogICAgICAgIAl9CiAKICAgICAgICAJbGwgcXVlcnkobGwgeCl7CiAgICAgICAgCQlsbCBsbyA9IDAsIGhpID0gdG9wLTEsIG1pZDsKIAogICAgICAgIAkJd2hpbGUobG8rMSA8PSBoaSl7CiAgICAgICAgCQkJbWlkID0gKGxvICsgaGkpID4+IDE7CiAgICAgICAgCQkJaWYoc3RbbWlkXS5nZXQoeCkgPD0gc3RbbWlkKzFdLmdldCh4KSkgbG8gPSBtaWQrMTsgZWxzZSBoaSA9IG1pZDsKICAgICAgICAJCX0KIAogICAgICAgIAkJLy9sbCBteD0wOwogICAgICAgIAkJLy9mb3IoaW50IGk9MDtpPD1oaTtpKyspIG14PW1heChteCxzdFtpXS5nZXQoeCkpOwogCiAKICAgICAgICAgICAgICAgIHJldHVybiBzdFtsb10uZ2V0KHgpOwogICAgICAgIAkJLy9yZXR1cm4gbXg7CiAgICAgICAgCX0KICAgICAgICB9OwogICAgICAgIHZlY3RvcjxwYWlyPGxsLGxsPiA+djsKICAgICAgICB2ZWN0b3I8cGFpcjxsbCxsbD4gPnZlY1syNTBdOwogICAgICAgIHZlY3RvcjxwYWlyPGxsLGxsPiA+dGVtcDsKICAgICAgICB2ZWN0b3I8bGw+dmFhOwogCiAgICAgICAgbGwgbixxOwogCiAgICAgICAgc3RydWN0IGNvbnZleEh1bGwgY2h0WzI1MF07CiAgICAgICAgbGwgYVtOXSwgc3VtW05dLCB0b3RhbCA9IDA7CiAgICAgICAgbGwgYWFbTl07CiAgICAgICAgbGwgdG90X2JsazsKICAgICAgICBsbCBiYltOXTsKIAogICAgICAgIGJvb2wgY21wKHBhaXI8bGwsbGw+djEscGFpcjxsbCxsbD52MikKICAgICAgICB7CiAgICAgICAgICAgIGlmKHYxLmZpcnN0PHYyLmZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHYxLmZpcnN0PnYyLmZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih2MS5zZWNvbmQ+djIuc2Vjb25kKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgdm9pZCByZWJ1aWxkKCkKICAgICAgICB7CiAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTx0b3RfYmxrO2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yKGludCBqPTA7ajx2ZWNbaV0uc2l6ZSgpO2orKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wLnBiKHt2ZWNbaV1bal0uZmlyc3QsdmVjW2ldW2pdLnNlY29uZH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmVjW2ldLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGludCBpPTA7aTx0ZW1wLnNpemUoKTtpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZlY1tpL2Jsa3NpemVdLnBiKHt0ZW1wW2ldLmZpcnN0LHRlbXBbaV0uc2Vjb25kfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVtcC5jbGVhcigpOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPHRvdF9ibGs7aSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZW1wLmNsZWFyKCk7CiAgICAgICAgICAgICAgICBmb3IoaW50IGo9MDtqPHZlY1tpXS5zaXplKCk7aisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludCBmaSA9IHZlY1tpXVtqXS5maXJzdDsKICAgICAgICAgICAgICAgICAgICBpbnQgc2UgPSB2ZWNbaV1bal0uc2Vjb25kOwogICAgICAgICAgICAgICAgICAgIHRlbXAucGIoe2ZpLHNlfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3J0KHRlbXAuYmVnaW4oKSx0ZW1wLmVuZCgpLGNtcCk7CiAgICAgICAgICAgICAgIC8vIGNodFtpXS5jbGVhcl9odWxsKCk7CiAgICAgICAgICAgICAgICBjaHRbaV0gPSAoKm5ldyBjb252ZXhIdWxsKCkpOwogICAgICAgICAgICAgICAgZm9yKGludCBqPTA7ajx0ZW1wLnNpemUoKTtqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2h0W2ldLmluc2VydCh0ZW1wW2pdLmZpcnN0LHRlbXBbal0uc2Vjb25kKTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGludCBtYWluKCl7CiAKICAgICAgICAgICAgc2NhbmYoIiVsbGQiLCZuKTsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGwgeCx5OwogICAgICAgICAgICAgICAgc2NhbmYoIiVsbGQgJWxsZCIsJngsJnkpOwogICAgICAgICAgICAgICAgdi5wYih7eCx5fSk7CiAKICAgICAgICAgICAgfQogICAgICAgICAgICBibGtzaXplID0gc3FydChuKSsxOwogCiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZlY1tpL2Jsa3NpemVdLnBiKHt2W2ldLmZpcnN0LHZbaV0uc2Vjb25kfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG90X2JsayA9IG4vYmxrc2l6ZTsKICAgICAgICAgICAgaWYobiVibGtzaXplIT0wKQogICAgICAgICAgICAgICAgdG90X2JsaysrOwogCiAKICAgICAgICAgICAgZm9yKGludCBpPTA7aTx0b3RfYmxrO2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGVtcC5jbGVhcigpOwogICAgICAgICAgICAgICAgZm9yKGludCBqPTA7ajx2ZWNbaV0uc2l6ZSgpO2orKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZmkgPSB2ZWNbaV1bal0uZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgaW50IHNlID0gdmVjW2ldW2pdLnNlY29uZDsKICAgICAgICAgICAgICAgICAgICB0ZW1wLnBiKHtmaSxzZX0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc29ydCh0ZW1wLmJlZ2luKCksdGVtcC5lbmQoKSxjbXApOwogICAgICAgICAgICAgICAgY2h0W2ldID0gKihuZXcgY29udmV4SHVsbCgpKTsKIAogICAgICAgICAgICAgICAgZm9yKGludCBqPTA7ajx0ZW1wLnNpemUoKTtqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2h0W2ldLmluc2VydCh0ZW1wW2pdLmZpcnN0LHRlbXBbal0uc2Vjb25kKTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIGNvdXQ8PGNodFsxXS5xdWVyeSgxNDE4OCk8PGVuZGw7CiAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKICAgICAgICAgICAgdGVtcC5wYih7MTgxNzMsMjE3OH0pOwogICAgICAgICAgICB0ZW1wLnBiKHszMjI5Niw1MzIyfSk7CiAgICAgICAgICAgIHRlbXAucGIoezE0MjMwLDI5Mzg2fSk7CiAgICAgICAgICAgIHNvcnQodGVtcC5iZWdpbigpLHRlbXAuZW5kKCksY21wKTsKICAgICAgICAgICAgZm9yKGludCBqPTA7ajx0ZW1wLnNpemUoKTtqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2h0WzRdLmluc2VydCh0ZW1wW2pdLmZpcnN0LHRlbXBbal0uc2Vjb25kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY291dDw8Y2h0WzRdLnF1ZXJ5KDE0MTg4KTw8ZW5kbDsKICAgICAgICAgICovCiAgICAgICAgICAgc2NhbmYoIiVsbGQiLCZxKTsKICAgICAgICAgICAgbGwgY250ID0gMDsKIAogICAgICAgICAgICB3aGlsZShxLS0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCB0eXBlLGwscix4OwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmdHlwZSk7CiAgICAgICAgICAgICAgICBpZih0eXBlID09IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkICVkIiwmbCwmcik7CiAgICAgICAgICAgICAgICAgICAgaWYoY250ID09IGJsa3NpemUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNudD0wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgICAgICAgICBpbnQgc3Q9MCxlZD0wOwogICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8dG90X2JsaztpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZih2ZWNbaV0uc2l6ZSgpPGwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwtPXZlY1tpXS5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPHRvdF9ibGs7aSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodmVjW2ldLnNpemUoKTxyKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC09IHZlY1tpXS5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvL2NvdXQ8PGJsa3NpemU8PCIgIjw8dG90X2Jsazw8IiAiPDxzdDw8IiAiPDxlZDw8IiAiPDxsPDwiICI8PHI8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgaWYoc3QgPT0gZWQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwYWlyPGxsLGxsPiBlbGUgPSB2ZWNbc3RdW2wtMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZlY1tzdF0uZXJhc2UodmVjW3N0XS5iZWdpbigpK2wtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPGxsLGxsPiA+OjppdGVyYXRvciBpdCA9IHZlY1tzdF0uYmVnaW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmVjW3N0XS5pbnNlcnQodmVjW3N0XS5iZWdpbigpK3ItMSxlbGUpOwogCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8bGwsbGw+IGVsZSA9IHZlY1tzdF1bbC0xXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3V0PDwic2QxIjw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmVjW3N0XS5lcmFzZSh2ZWNbc3RdLmJlZ2luKCkrbC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8bGwsbGw+ID46Oml0ZXJhdG9yIGl0ID0gdmVjW3N0XS5iZWdpbigpOwogICAgICAgICAgICAgICAgICAgICAgICB2ZWNbZWRdLmluc2VydCh2ZWNbZWRdLmJlZ2luKCkrcixlbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvdXQ8PCJzZDIiPDxlbmRsOwogCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3V0PDwidGVtcCBhcnJheSI8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8dmVjW3N0XS5zaXplKCk7aSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnBiKHt2ZWNbc3RdW2ldLmZpcnN0LHZlY1tzdF1baV0uc2Vjb25kfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGNvdXQ8PHZlY1tzdF1baV0uZmlyc3Q8PCIgIjw8dmVjW3N0XVtpXS5zZWNvbmQ8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy9jb3V0PDxlbmRsOwogICAgICAgICAgICAgICAgICAgICAgICBzb3J0KHRlbXAuYmVnaW4oKSx0ZW1wLmVuZCgpLGNtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2h0W3N0XS5jbGVhcl9odWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2h0W3N0XT0qKG5ldyBjb252ZXhIdWxsKCkpOwogICAgICAgICAgICAgIC8vICAgICAgICAgIGNvdXQ8PCJ0ZW1wIHN0YXJ0Ijw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpPTA7aTx0ZW1wLnNpemUoKTtpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodFtzdF0uaW5zZXJ0KHRlbXBbaV0uZmlyc3QsdGVtcFtpXS5zZWNvbmQpOwogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBjb3V0PDx0ZW1wW2ldLmZpcnN0PDwiICI8PHRlbXBbaV0uc2Vjb25kPDxlbmRsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vICAgICAgY291dDw8c3Q8PCIgIjw8Y2h0W3N0XS5xdWVyeSgxNDE4OCk8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgY291dDw8InRlbXAgZW5kIjw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPHZlY1tlZF0uc2l6ZSgpO2krKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wYih7dmVjW2VkXVtpXS5maXJzdCx2ZWNbZWRdW2ldLnNlY29uZH0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvdXQ8PHZlY1tlZF1baV0uZmlyc3Q8PCIgIjw8dmVjW2VkXVtpXS5zZWNvbmQ8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vICBjb3V0PDwidGVtcCBhcnJheSBlbmQiPDxlbmRsOwogICAgICAgICAgICAgICAgICAgICAgICBzb3J0KHRlbXAuYmVnaW4oKSx0ZW1wLmVuZCgpLGNtcCk7CiAgICAgICAgICAgICAgICAgICAgICAvLyAgY291dDw8Y2h0WzFdLnF1ZXJ5KDE0MTg4KTw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jaHRbZWRdLmNsZWFyX2h1bGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNodFtlZF09KihuZXcgY29udmV4SHVsbCgpKTsKICAgICAgICAgICAgICAgICAgICAvLyAgIGNvdXQ8PGNodFsxXS5xdWVyeSgxNDE4OCk8PCIgIjw8ZWQ8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8dGVtcC5zaXplKCk7aSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHRbZWRdLmluc2VydCh0ZW1wW2ldLmZpcnN0LHRlbXBbaV0uc2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdXQ8PGNodFsxXS5xdWVyeSgxNDE4OCk8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgfQogCiAKIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCXNjYW5mKCIlZCAlZCAlZCIsJmwsJnIsJngpOwogICAgICAgICAgICAgICAgICAgIC8vY2luPj5sPj5yPj54OwogCiAgICAgICAgICAgICAgICAgICAgaW50IHN0PTAsZWQ9MDsKICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPHRvdF9ibGs7aSsrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodmVjW2ldLnNpemUoKTxsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLT12ZWNbaV0uc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpPTA7aTx0b3RfYmxrO2krKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZlY1tpXS5zaXplKCk8cikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtPSB2ZWNbaV0uc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGwgYW5zID0gLTE7CiAgICAvLyAgICAgICAgICAgICAgICBjb3V0PDxzdDw8IiAiPDxlZDw8IiAiPDxsPDwiICI8PHI8PCIgIjw8Ymxrc2l6ZTw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICBpZihzdCA9PSBlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaT1sLTE7aTw9ci0xO2krKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGwgbSA9IHZlY1tzdF1baV0uZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCBjID0gdmVjW3N0XVtpXS5zZWNvbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCBhYSA9IDFMTCptKngrMUxMKmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLGFhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9bC0xO2k8dmVjW3N0XS5zaXplKCk7aSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCBtID0gdmVjW3N0XVtpXS5maXJzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsIGMgPSB2ZWNbc3RdW2ldLnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsIGFhID0gMUxMKm0qeCsxTEwqYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsYWEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgIC8vICAgICAgICAgICAgICAgICAgY291dDw8YW5zPDxlbmRsOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPD1yLTE7aSsrKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCBtID0gdmVjW2VkXVtpXS5maXJzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsIGMgPSB2ZWNbZWRdW2ldLnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsIGFhID0gMUxMKm0qeCsxTEwqYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsYWEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAvLyAgICAgICAgICAgICAgICBjb3V0PDxhbnM8PGVuZGw7CiAgICAgICAgICAvLyAgICAgICAgICAgICAgY291dDw8Y2h0WzFdLnF1ZXJ5KDE0MTg4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpPXN0KzE7aTxlZDtpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsIGFhID0gY2h0W2ldLnF1ZXJ5KHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucyxhYSk7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGNvdXQ8PCJZRVMiPDxpPDwiICI8PHg8PCIgIjw8YWE8PGVuZGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvdXQ8PCJibGsgIjw8aTw8IiAiPDxhYTw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVsbGRcbiIsYW5zKTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICB9CiAKIAogICAgICAgICAgICByZXR1cm4gMDsKIAogICAgICAgIH0=