/*
*************************************************************************
* $ Author : honeyslawyer $
* $ Name : shashank gupta $
*************************************************************************
*
* Copyright 2013 @ honeyslawyer and shashank gupta
*
************************************************************************/
#include<cstdio>
#include<iostream>
#include<cmath>
//#include<conio.h>
#include<cstring>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<climits>
#define mod 1000000007
#define ll long long
#define total 100005
using namespace std;
ll gcd(ll a,ll b) {if(b==0) return a; return gcd(b,a%b);}
#define gc getchar_unlocked
void scan(int &x)
{
register int c = gc();
x = 0;
int neg = 0;
for(;((c<48 || c>57) && c != '-');c = gc());
if(c=='-') {neg=1;c=gc();}
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
if(neg) x=-x;
}
ll power(ll b,ll exp,ll m)
{ll ans=1;
b%=m;
while(exp)
{if(exp&1)
ans=(ans*b)%m;
exp>>=1;
b=(b*b)%m;
}
return ans;
}
struct node{
int msum;
int m;
void merge(node& l, node& r){
msum=max(l.msum,max(r.msum,r.m+l.m));
m=max(r.m,l.m);
}
void split(node& l, node& r){
}
};
template<class node>
class segtree{/*{{{*/
template<bool b>class param{};
inline void spltdwn(int idx,param<true>){splt(idx);}
inline void splt(int idx){/*{{{*/
idx>>=1;
if(idx>0)splt(idx);
tree[idx].split(tree[idx<<1],tree[(idx<<1)|1]);
}/*}}}*/
inline void spltdwn(int,param<false>){};
inline void split(node& a, node& b, node& c, param<true> ){return a.split(b,c);}
inline void split(node&, node&, node&, param<false>){}
template<typename t,void (t::*)(t&,t&)> class T{};
template<typename t> static char test(T<t,&t::split>*){return 0;}
template<typename t> static long double test(...){return 0;}
int u,v;
node query(int root, int left_range, int right_range){/*{{{*/
if(u<=left_range && right_range<=v)
return tree[root];
int mid = (left_range + right_range)>>1,
l = root<<1,
r = l|1;
if(has_split)split(tree[root],tree[l],tree[r],param<has_split>());
node res;
if(u>=mid)res=query(r,mid,right_range);
else if(v<=mid)res=query(l,left_range,mid);
else{
node n1 = query(l,left_range,mid),
n2 = query(r,mid,right_range);
res.merge(n1,n2);
}
if(has_split) tree[root].merge(tree[l],tree[r]);
return res;
}/*}}}*/
template<void(*fn)(node&)>
void local_update(int root, int left_range,int right_range){/*{{{*/
if(u<=left_range && right_range<=v){
return fn(tree[root]);
}
int mid = (left_range + right_range)>>1,
l = root<<1,
r = l|1;
if(has_split)split(tree[root],tree[l],tree[r],param<has_split>());
if(v>mid)local_update<fn>(r,mid,right_range);
if(u<mid)local_update<fn>(l,left_range,mid);
tree[root].merge(tree[l],tree[r]);
}/*}}}*/
void mrgup(int idx){/*{{{*/
idx>>=1;
while(idx>0)
tree[idx].merge(tree[idx<<1],tree[(idx<<1)|1]),
idx>>=1;
}/*}}}*/
public:
static bool const has_split = (sizeof(test<node>(0))==sizeof(char));
int N;
int leftmost_leaf, rightmost_leaf;
node* tree;
node identity;
segtree(){ tree=0; }
~segtree(){
if(tree) delete[] tree;
}
void init(int n, const node a[], const node& identity){/*{{{*/
if(tree) delete[] tree;
this->identity = identity;
N=0;
while((1<<N)<n)N++;
leftmost_leaf = 1<<N;
rightmost_leaf = leftmost_leaf<<1;
tree = new node[rightmost_leaf];
for(int i=0;i<n;i++)
tree[i+leftmost_leaf] = a[i];
for(int i=n+leftmost_leaf;i<rightmost_leaf;i++)
tree[i]=identity;
for(int i=leftmost_leaf-1;i;i--)
tree[i].merge(tree[i<<1],tree[(i<<1)|1]);
}/*}}}*/
node query(int u, int v){//[u,v]/*{{{*/
this->u=u+leftmost_leaf;
this->v=v+leftmost_leaf+1;
return query(1,leftmost_leaf,rightmost_leaf);
}/*}}}*/
node query(int u){//faster version of query(u,u)/*{{{*/
//indexing starts from 0
u+=leftmost_leaf;
spltdwn(u,param<has_split>());
return tree[u];
}/*}}}*/
template<void(*fn)(node&)>
void update(int u, int v){/*{{{*/
//0-indexed
this->u=u+leftmost_leaf;
this->v=v+leftmost_leaf+1;
return local_update<fn>(1,leftmost_leaf,rightmost_leaf);
}/*}}}*/
template<void(*fn)(node&)>
void update(int u){//faster version of update(u,u)/*{{{*/
//indexing starts from 0
u+=leftmost_leaf;
spltdwn(u,param<has_split>());
fn(tree[u]);
mrgup(u);
}/*}}}*/
void split_down(int leaf_idx){/*{{{*/
spltdwn(leaf_idx+leftmost_leaf,param<has_split>());
}/*}}}*/
void merge_up(int leaf_idx){/*{{{*/
mrgup(leaf_idx+leftmost_leaf);
}/*}}}*/
bool is_leaf(int tree_idx){return tree_idx>=leftmost_leaf;}
int binary_search(node k){/*{{{*/
//search the last place i, such that merge( everyting to the left of i(including i) ) compares less than k
int root = 1;
node n=identity;
//identity satisfies merge(identity,y) = merge(y,identity) = y for all y.
assert(!(k<identity));
while(!is_leaf(root)){
int left_child = root<<1,
right_child = left_child|1;
if(has_split)
split(tree[root],tree[left_child],tree[right_child],param<has_split>());
node m;
m.merge(n,tree[left_child]);
if(m<k){//go to right side
n=m;
root=right_child;
}else root=left_child;
}
node m;
m.merge(n,tree[root]);
mrgup(root);
if(m<k)return root-leftmost_leaf;
else return root-1-leftmost_leaf;
}/*}}}*/
};/*}}}*/
int v,z;
void inc_by_v(node& n){
n.msum=v;
n.m=v;
}
int main(){
int N,q;
//scanf("%d %d",&N,&q);
scan(N);
node array[N+4];
for(int i=0;i<N;i++)
{
int temp;
scan(temp);
array[i].m=temp;array[i].msum=temp;
}
node identity;
identity.m=0,identity.msum=0;
segtree<node> s;
s.init(N,array,identity);
scan(q);
while(q--){
int t,a,b;
char e;
scanf("%c",&e);
//scanf("%d%d%d",&t,&a,&b);
//scan(t);
scan(a);
scan(b);
//printf("%d %d\n",a,b);
if(a>b)std::swap(a,b);
a--,b--;
if(e!='Q')
{
//scan(v),z=t;
v=b+1;
//printf("here\n");
s.update<&inc_by_v>(a);
}
else
{
node f=s.query(a,b);
printf("%d\n",f.msum);
}
}
return 0;
}
LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICQgQXV0aG9yIDogaG9uZXlzbGF3eWVyICAgJAoqICQgTmFtZSAgIDogc2hhc2hhbmsgZ3VwdGEgJAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBDb3B5cmlnaHQgMjAxMyBAIGhvbmV5c2xhd3llciBhbmQgc2hhc2hhbmsgZ3VwdGEKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlPGNzdGRpbz4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNtYXRoPgovLyNpbmNsdWRlPGNvbmlvLmg+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPGN0eXBlLmg+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxjbGltaXRzPgoKI2RlZmluZSBtb2QgMTAwMDAwMDAwNwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIHRvdGFsIDEwMDAwNQp1c2luZyBuYW1lc3BhY2Ugc3RkOwpsbCBnY2QobGwgYSxsbCBiKSB7aWYoYj09MCkgcmV0dXJuIGE7IHJldHVybiBnY2QoYixhJWIpO30KI2RlZmluZSBnYyBnZXRjaGFyX3VubG9ja2VkCnZvaWQgc2NhbihpbnQgJngpCnsKICAgIHJlZ2lzdGVyIGludCBjID0gZ2MoKTsKICAgIHggPSAwOwogICAgaW50IG5lZyA9IDA7CiAgICBmb3IoOygoYzw0OCB8fCBjPjU3KSAmJiBjICE9ICctJyk7YyA9IGdjKCkpOwogICAgaWYoYz09Jy0nKSB7bmVnPTE7Yz1nYygpO30KICAgIGZvcig7Yz40NyAmJiBjPDU4O2MgPSBnYygpKSB7eCA9ICh4PDwxKSArICh4PDwzKSArIGMgLSA0ODt9CiAgICBpZihuZWcpIHg9LXg7Cn0KbGwgcG93ZXIobGwgYixsbCBleHAsbGwgbSkKIHtsbCBhbnM9MTsKICBiJT1tOwogIHdoaWxlKGV4cCkKICAge2lmKGV4cCYxKQogICAgIGFucz0oYW5zKmIpJW07CiAgICBleHA+Pj0xOwoJYj0oYipiKSVtOwogICB9CiAgcmV0dXJuIGFuczsKIH0Kc3RydWN0IG5vZGV7CiAgaW50IG1zdW07CiAgaW50IG07Cgl2b2lkIG1lcmdlKG5vZGUmIGwsIG5vZGUmIHIpewogICAgICAgIG1zdW09bWF4KGwubXN1bSxtYXgoci5tc3VtLHIubStsLm0pKTsKICAgICAgICBtPW1heChyLm0sbC5tKTsKCX0KCXZvaWQgc3BsaXQobm9kZSYgbCwgbm9kZSYgcil7Cgl9Cn07CnRlbXBsYXRlPGNsYXNzIG5vZGU+CmNsYXNzIHNlZ3RyZWV7Lyp7e3sqLwoJdGVtcGxhdGU8Ym9vbCBiPmNsYXNzIHBhcmFte307CglpbmxpbmUgdm9pZCBzcGx0ZHduKGludCBpZHgscGFyYW08dHJ1ZT4pe3NwbHQoaWR4KTt9CglpbmxpbmUgdm9pZCBzcGx0KGludCBpZHgpey8qe3t7Ki8KCQlpZHg+Pj0xOwoJCWlmKGlkeD4wKXNwbHQoaWR4KTsKCQl0cmVlW2lkeF0uc3BsaXQodHJlZVtpZHg8PDFdLHRyZWVbKGlkeDw8MSl8MV0pOwoJfS8qfX19Ki8KCWlubGluZSB2b2lkIHNwbHRkd24oaW50LHBhcmFtPGZhbHNlPil7fTsKCWlubGluZSB2b2lkIHNwbGl0KG5vZGUmIGEsIG5vZGUmIGIsIG5vZGUmIGMsIHBhcmFtPHRydWU+ICl7cmV0dXJuIGEuc3BsaXQoYixjKTt9CglpbmxpbmUgdm9pZCBzcGxpdChub2RlJiwgbm9kZSYsIG5vZGUmLCBwYXJhbTxmYWxzZT4pe30KCXRlbXBsYXRlPHR5cGVuYW1lIHQsdm9pZCAodDo6KikodCYsdCYpPiBjbGFzcyBUe307Cgl0ZW1wbGF0ZTx0eXBlbmFtZSB0PiBzdGF0aWMgY2hhciB0ZXN0KFQ8dCwmdDo6c3BsaXQ+Kil7cmV0dXJuIDA7fQoJdGVtcGxhdGU8dHlwZW5hbWUgdD4gc3RhdGljIGxvbmcgZG91YmxlIHRlc3QoLi4uKXtyZXR1cm4gMDt9CglpbnQgdSx2OwoJbm9kZSBxdWVyeShpbnQgcm9vdCwgaW50IGxlZnRfcmFuZ2UsIGludCByaWdodF9yYW5nZSl7Lyp7e3sqLwoJCWlmKHU8PWxlZnRfcmFuZ2UgJiYgcmlnaHRfcmFuZ2U8PXYpCgkJCXJldHVybiB0cmVlW3Jvb3RdOwoJCWludCBtaWQgPSAobGVmdF9yYW5nZSArIHJpZ2h0X3JhbmdlKT4+MSwKCQkJbCA9IHJvb3Q8PDEsCgkJCXIgPSBsfDE7CgkJaWYoaGFzX3NwbGl0KXNwbGl0KHRyZWVbcm9vdF0sdHJlZVtsXSx0cmVlW3JdLHBhcmFtPGhhc19zcGxpdD4oKSk7CgkJbm9kZSByZXM7CgkJaWYodT49bWlkKXJlcz1xdWVyeShyLG1pZCxyaWdodF9yYW5nZSk7CgkJZWxzZSBpZih2PD1taWQpcmVzPXF1ZXJ5KGwsbGVmdF9yYW5nZSxtaWQpOwoJCWVsc2V7CgkJCW5vZGUgbjEgPSBxdWVyeShsLGxlZnRfcmFuZ2UsbWlkKSwKCQkJCSBuMiA9IHF1ZXJ5KHIsbWlkLHJpZ2h0X3JhbmdlKTsKCQkJcmVzLm1lcmdlKG4xLG4yKTsKCQl9CiAgICAgICAgICAgICAgICBpZihoYXNfc3BsaXQpIHRyZWVbcm9vdF0ubWVyZ2UodHJlZVtsXSx0cmVlW3JdKTsKCQlyZXR1cm4gcmVzOwoJfS8qfX19Ki8KIAl0ZW1wbGF0ZTx2b2lkKCpmbikobm9kZSYpPgoJdm9pZCBsb2NhbF91cGRhdGUoaW50IHJvb3QsIGludCBsZWZ0X3JhbmdlLGludCByaWdodF9yYW5nZSl7Lyp7e3sqLwoJCWlmKHU8PWxlZnRfcmFuZ2UgJiYgcmlnaHRfcmFuZ2U8PXYpewoJCQlyZXR1cm4gZm4odHJlZVtyb290XSk7CgkJfQoJCWludCBtaWQgPSAobGVmdF9yYW5nZSArIHJpZ2h0X3JhbmdlKT4+MSwKCQkJbCA9IHJvb3Q8PDEsCgkJCXIgPSBsfDE7CgkJaWYoaGFzX3NwbGl0KXNwbGl0KHRyZWVbcm9vdF0sdHJlZVtsXSx0cmVlW3JdLHBhcmFtPGhhc19zcGxpdD4oKSk7CgkJaWYodj5taWQpbG9jYWxfdXBkYXRlPGZuPihyLG1pZCxyaWdodF9yYW5nZSk7CgkJaWYodTxtaWQpbG9jYWxfdXBkYXRlPGZuPihsLGxlZnRfcmFuZ2UsbWlkKTsKCQl0cmVlW3Jvb3RdLm1lcmdlKHRyZWVbbF0sdHJlZVtyXSk7Cgl9Lyp9fX0qLwoJdm9pZCBtcmd1cChpbnQgaWR4KXsvKnt7eyovCgkJaWR4Pj49MTsKCQl3aGlsZShpZHg+MCkKCQkJdHJlZVtpZHhdLm1lcmdlKHRyZWVbaWR4PDwxXSx0cmVlWyhpZHg8PDEpfDFdKSwKCQkJaWR4Pj49MTsKCX0vKn19fSovCnB1YmxpYzoKCXN0YXRpYyBib29sIGNvbnN0IGhhc19zcGxpdCA9IChzaXplb2YodGVzdDxub2RlPigwKSk9PXNpemVvZihjaGFyKSk7CglpbnQgTjsKCWludCBsZWZ0bW9zdF9sZWFmLCByaWdodG1vc3RfbGVhZjsKCW5vZGUqIHRyZWU7Cglub2RlIGlkZW50aXR5OwoJc2VndHJlZSgpeyB0cmVlPTA7IH0KCX5zZWd0cmVlKCl7CiAgICAgICAgICAgICAgICBpZih0cmVlKSBkZWxldGVbXSB0cmVlOwoJfQoJdm9pZCBpbml0KGludCBuLCBjb25zdCBub2RlIGFbXSwgY29uc3Qgbm9kZSYgaWRlbnRpdHkpey8qe3t7Ki8KICAgICAgICAgICAgICAgIGlmKHRyZWUpIGRlbGV0ZVtdIHRyZWU7CgkJdGhpcy0+aWRlbnRpdHkgPSBpZGVudGl0eTsKCQlOPTA7CgkJd2hpbGUoKDE8PE4pPG4pTisrOwoJCWxlZnRtb3N0X2xlYWYgPSAxPDxOOwoJCXJpZ2h0bW9zdF9sZWFmID0gbGVmdG1vc3RfbGVhZjw8MTsKCQl0cmVlID0gbmV3IG5vZGVbcmlnaHRtb3N0X2xlYWZdOwoJCWZvcihpbnQgaT0wO2k8bjtpKyspCgkJCXRyZWVbaStsZWZ0bW9zdF9sZWFmXSA9IGFbaV07CgkJZm9yKGludCBpPW4rbGVmdG1vc3RfbGVhZjtpPHJpZ2h0bW9zdF9sZWFmO2krKykKCQkJdHJlZVtpXT1pZGVudGl0eTsKCQlmb3IoaW50IGk9bGVmdG1vc3RfbGVhZi0xO2k7aS0tKQoJCQl0cmVlW2ldLm1lcmdlKHRyZWVbaTw8MV0sdHJlZVsoaTw8MSl8MV0pOwoJfS8qfX19Ki8KCW5vZGUgcXVlcnkoaW50IHUsIGludCB2KXsvL1t1LHZdLyp7e3sqLwoJCXRoaXMtPnU9dStsZWZ0bW9zdF9sZWFmOwoJCXRoaXMtPnY9ditsZWZ0bW9zdF9sZWFmKzE7CgkJcmV0dXJuIHF1ZXJ5KDEsbGVmdG1vc3RfbGVhZixyaWdodG1vc3RfbGVhZik7Cgl9Lyp9fX0qLwoJbm9kZSBxdWVyeShpbnQgdSl7Ly9mYXN0ZXIgdmVyc2lvbiBvZiBxdWVyeSh1LHUpLyp7e3sqLwoJCS8vaW5kZXhpbmcgc3RhcnRzIGZyb20gMAoJCXUrPWxlZnRtb3N0X2xlYWY7CgkJc3BsdGR3bih1LHBhcmFtPGhhc19zcGxpdD4oKSk7CgkJcmV0dXJuIHRyZWVbdV07Cgl9Lyp9fX0qLwoJdGVtcGxhdGU8dm9pZCgqZm4pKG5vZGUmKT4KCXZvaWQgdXBkYXRlKGludCB1LCBpbnQgdil7Lyp7e3sqLwoJCS8vMC1pbmRleGVkCgkJdGhpcy0+dT11K2xlZnRtb3N0X2xlYWY7CgkJdGhpcy0+dj12K2xlZnRtb3N0X2xlYWYrMTsKCQlyZXR1cm4gbG9jYWxfdXBkYXRlPGZuPigxLGxlZnRtb3N0X2xlYWYscmlnaHRtb3N0X2xlYWYpOwoJfS8qfX19Ki8KCXRlbXBsYXRlPHZvaWQoKmZuKShub2RlJik+Cgl2b2lkIHVwZGF0ZShpbnQgdSl7Ly9mYXN0ZXIgdmVyc2lvbiBvZiB1cGRhdGUodSx1KS8qe3t7Ki8KCQkvL2luZGV4aW5nIHN0YXJ0cyBmcm9tIDAKCQl1Kz1sZWZ0bW9zdF9sZWFmOwoJCXNwbHRkd24odSxwYXJhbTxoYXNfc3BsaXQ+KCkpOwoJCWZuKHRyZWVbdV0pOwoJCW1yZ3VwKHUpOwoJfS8qfX19Ki8KCXZvaWQgc3BsaXRfZG93bihpbnQgbGVhZl9pZHgpey8qe3t7Ki8KCQlzcGx0ZHduKGxlYWZfaWR4K2xlZnRtb3N0X2xlYWYscGFyYW08aGFzX3NwbGl0PigpKTsKCX0vKn19fSovCgl2b2lkIG1lcmdlX3VwKGludCBsZWFmX2lkeCl7Lyp7e3sqLwoJCW1yZ3VwKGxlYWZfaWR4K2xlZnRtb3N0X2xlYWYpOwoJfS8qfX19Ki8KCWJvb2wgaXNfbGVhZihpbnQgdHJlZV9pZHgpe3JldHVybiB0cmVlX2lkeD49bGVmdG1vc3RfbGVhZjt9CglpbnQgYmluYXJ5X3NlYXJjaChub2RlIGspey8qe3t7Ki8KCS8vc2VhcmNoIHRoZSBsYXN0IHBsYWNlIGksIHN1Y2ggdGhhdCBtZXJnZSggZXZlcnl0aW5nIHRvIHRoZSBsZWZ0IG9mIGkoaW5jbHVkaW5nIGkpICkgY29tcGFyZXMgbGVzcyB0aGFuIGsKICAgICAgICBpbnQgcm9vdCA9IDE7CiAgICAgICAgbm9kZSBuPWlkZW50aXR5OwoJCS8vaWRlbnRpdHkgc2F0aXNmaWVzIG1lcmdlKGlkZW50aXR5LHkpID0gbWVyZ2UoeSxpZGVudGl0eSkgPSB5IGZvciBhbGwgeS4KCQlhc3NlcnQoIShrPGlkZW50aXR5KSk7CiAgICAgICAgd2hpbGUoIWlzX2xlYWYocm9vdCkpewogICAgICAgICAgICAgICAgaW50IGxlZnRfY2hpbGQgPSByb290PDwxLAoJCQkJCXJpZ2h0X2NoaWxkID0gbGVmdF9jaGlsZHwxOwogICAgICAgICAgICAgICAgaWYoaGFzX3NwbGl0KQoJCQkJCXNwbGl0KHRyZWVbcm9vdF0sdHJlZVtsZWZ0X2NoaWxkXSx0cmVlW3JpZ2h0X2NoaWxkXSxwYXJhbTxoYXNfc3BsaXQ+KCkpOwogICAgICAgICAgICAgICAgbm9kZSBtOwogICAgICAgICAgICAgICAgbS5tZXJnZShuLHRyZWVbbGVmdF9jaGlsZF0pOwogICAgICAgICAgICAgICAgaWYobTxrKXsvL2dvIHRvIHJpZ2h0IHNpZGUKICAgICAgICAgICAgICAgICAgICAgICAgbj1tOwogICAgICAgICAgICAgICAgICAgICAgICByb290PXJpZ2h0X2NoaWxkOwogICAgICAgICAgICAgICAgfWVsc2Ugcm9vdD1sZWZ0X2NoaWxkOwogICAgICAgIH0KICAgICAgICBub2RlIG07CiAgICAgICAgbS5tZXJnZShuLHRyZWVbcm9vdF0pOwoJCW1yZ3VwKHJvb3QpOwogICAgICAgIGlmKG08aylyZXR1cm4gcm9vdC1sZWZ0bW9zdF9sZWFmOwogICAgICAgIGVsc2UgcmV0dXJuIHJvb3QtMS1sZWZ0bW9zdF9sZWFmOwoJfS8qfX19Ki8KfTsvKn19fSovCmludCB2LHo7CnZvaWQgaW5jX2J5X3Yobm9kZSYgbil7CiAgICBuLm1zdW09djsKICAgIG4ubT12OwogICAgCgp9CmludCBtYWluKCl7CgkJaW50IE4scTsKCQkvL3NjYW5mKCIlZCAlZCIsJk4sJnEpOwoJCXNjYW4oTik7CgkJCgkJbm9kZSBhcnJheVtOKzRdOwoJCWZvcihpbnQgaT0wO2k8TjtpKyspCgkJewogICAgICAgICAgICBpbnQgdGVtcDsKICAgICAgICAgICAgc2Nhbih0ZW1wKTsKCQkJYXJyYXlbaV0ubT10ZW1wO2FycmF5W2ldLm1zdW09dGVtcDsKCiAgICAgICAgfQoJCW5vZGUgaWRlbnRpdHk7CiAgICAgICAgaWRlbnRpdHkubT0wLGlkZW50aXR5Lm1zdW09MDsKCQlzZWd0cmVlPG5vZGU+IHM7CgkJcy5pbml0KE4sYXJyYXksaWRlbnRpdHkpOwoJCXNjYW4ocSk7CgkJd2hpbGUocS0tKXsKCQkJaW50IHQsYSxiOwoJCQljaGFyIGU7CgkJCXNjYW5mKCIlYyIsJmUpOwoJCQkvL3NjYW5mKCIlZCVkJWQiLCZ0LCZhLCZiKTsKCQkJLy9zY2FuKHQpOwoJCQlzY2FuKGEpOwoJCQlzY2FuKGIpOwoJCQkvL3ByaW50ZigiJWQgJWRcbiIsYSxiKTsKCQkJaWYoYT5iKXN0ZDo6c3dhcChhLGIpOwoJCQlhLS0sYi0tOwoJCQlpZihlIT0nUScpCgkJCXsKCQkJCS8vc2Nhbih2KSx6PXQ7CgkJCQl2PWIrMTsKCQkJCS8vcHJpbnRmKCJoZXJlXG4iKTsKCQkJCXMudXBkYXRlPCZpbmNfYnlfdj4oYSk7CiAgICAgICAgICAgIH0KCQkJZWxzZQoJCQl7CgkJCQlub2RlIGY9cy5xdWVyeShhLGIpOwoJCQkJcHJpbnRmKCIlZFxuIixmLm1zdW0pOwoJCQkJCgkJCX0KCQl9CglyZXR1cm4gMDsKfQ==