# Re: Removing constant-able macros inside of the loop

e\$B6b0f\$G\$9!#e(B

2009e\$BG/e(B9e\$B7ne(B29e\$BF|e(B10:08 Yukihiro M.
[email protected]:

|e\$BBP1~\$,2DG=\$G\$7\$?!#e(B(e\$B4{\$KBP1~\$5\$l\$F\$^\$7\$?!#e(B)
|
|
|e\$B=\$@58e\$N%Q%C%A\$O!"0J2<\$NDL\$j\$G\$9!#e(B

e\$B;n\$7\$F\$_\$h\$&\$H;W\$\$\$^\$9\$,!“;DG0\$J\$,\$ie(Bfolde\$B\$5\$l\$F\$\$\$F%Q%C%A\$,2ue(B
e\$B\$l\$F\$^\$9!#;d\$,<j\$G=\$@5\$9\$k\$3\$H\$O\$b\$A\$m\$s2DG=\$G\$9\$,!”:#8e\$N\$?e(B
e\$B\$a\$K\$b!“\$<\$Re(Bfolde\$B\$7\$J\$\$\$h\$&\$K\$7\$F:FEj9F\$7\$F\$\$\$?\$@\$1\$k\$H\$”\$j\$,e(B
e\$B\$?\$\$\$G\$9!#e(B

e\$B?=\$7Lu\$“\$j\$^\$;\$s\$G\$7\$?!#e(B
e\$B@_Dj\$r3NG’\$7\$F!”:FE:IU\$7\$^\$7\$?!#e(B

e\$B\$“\$H!“e(BChangeLoge\$B%(%s%H%j\$b\$\$\$?\$@\$1\$k\$H\$9\$4\$/\$h\$\$\$G\$9\$,!”\$3\$Ae(B
e\$B\$i\$OI,?\$G\$O\$”\$j\$^\$;\$s!#e(B

e\$B2a5n\$Ne(BChangeLoge\$B\$d!"0J2<\$N%Z!<%8\$Ne(BChangeLoge\$B\$N9`L\$r;29M\$K\$7\$J\$,\$i=q\$\$\$F\$_\$^\$7\$?!#e(B

http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=CommitterHowto
e\$B@[\$\$J8>O\$G\$9\$,!&!&!&e(B

• array.c (rb_ary_{times, shuffle_bang, sample}):
removing constant-able macros inside of the loop. a patch from
Masahiro Kanai (CanI) at [ruby-dev:number]. It was found out
and fixed at Security and Programming camp 2009.

• string.c (rb_str_{times, split_m}): ditto.

• struct.c (rb_struct_{getmember, set, aref_id, aset_id},
{make, inspect}struct, recursive{equal, hash, eql}): ditto.

e\$B%Q%C%A\$O!"0J2<\$G\$9!#e(B

— array.c (revision 25052)
+++ array.c (working copy)
@@ -2708,8 +2708,8 @@
static VALUE
rb_ary_times(VALUE ary, VALUE times)
{

• VALUE ary2, tmp;
• long i, len;
• VALUE ary2, tmp, *ptr, *ptr2;

• long i, t, len;

tmp = rb_check_string_type(times);
if (!NIL_P(tmp)) {
@@ -2732,8 +2732,11 @@
ary2 = ary_new(rb_obj_class(ary), len);
ARY_SET_LEN(ary2, len);

• for (i=0; i<len; i+=RARRAY_LEN(ary)) {
• MEMCPY(RARRAY_PTR(ary2)+i, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
• ptr = RARRAY_PTR(ary);

• ptr2 = RARRAY_PTR(ary2);

• t = RARRAY_LEN(ary);

• for (i=0; i<len; i+=t) {

• MEMCPY(ptr2+i, ptr, VALUE, t);
}
out:
OBJ_INFECT(ary2, ary);
@@ -3491,14 +3494,16 @@
static VALUE
rb_ary_shuffle_bang(VALUE ary)
{

• VALUE *ptr;
long i = RARRAY_LEN(ary);

rb_ary_modify(ary);

• ptr = RARRAY_PTR(ary);
while (i) {
long j = (long)(rb_genrand_real()*i);

• VALUE tmp = RARRAY_PTR(ary)[–i];
• RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
• RARRAY_PTR(ary)[j] = tmp;
• VALUE tmp = ptr[–i];
• ptr[i] = ptr[j];
• ptr[j] = tmp;
}
return ary;
}
@@ -3576,6 +3581,7 @@
return rb_ary_new3(3, ptr[i], ptr[j], ptr[k]);
}
if ((size_t)n < sizeof(idx)/sizeof(idx[0])) {
• VALUE *ptr_result;
long sorted[sizeof(idx)/sizeof(idx[0])];
sorted[0] = idx[0] = (long)(rb_genrand_real()*len);
for (i=1; i<n; i++) {
@@ -3588,18 +3594,21 @@
sorted[j] = idx[i] = k;
}
result = rb_ary_new2(n);
• ptr_result = RARRAY_PTR(result);
for (i=0; i<n; i++) {
• ``````RARRAY_PTR(result)[i] = RARRAY_PTR(ary)[idx[i]];
``````
• ``````ptr_result[i] = ptr[idx[i]];
``````
}
}
else {
• VALUE *ptr_result;
result = rb_ary_new4(len, ptr);
• ptr_result = RARRAY_PTR(result);
RB_GC_GUARD(ary);
for (i=0; i<n; i++) {
j = (long)(rb_genrand_real()*(len-i)) + i;
• ``````nv = RARRAY_PTR(result)[j];
``````
• ``````RARRAY_PTR(result)[j] = RARRAY_PTR(result)[i];
``````
• ``````RARRAY_PTR(result)[i] = nv;
``````
• ``````nv = ptr_result[j];
``````
• ``````ptr_result[j] = ptr_result[i];
``````
• ``````ptr_result[i] = nv;
``````

}
}
ARY_SET_LEN(result, n);
— string.c (revision 25052)
+++ string.c (working copy)
@@ -1159,6 +1159,7 @@
{
VALUE str2;
long n, len;

• char *ptr2;

len = NUM2LONG(times);
if (len < 0) {
@@ -1169,16 +1170,17 @@
}

str2 = rb_str_new5(str, 0, len *= RSTRING_LEN(str));

• ptr2 = RSTRING_PTR(str2);
if (len) {
n = RSTRING_LEN(str);

• ``````   memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), n);
``````
• ``````   memcpy(ptr2, RSTRING_PTR(str), n);
while (n <= len/2) {
``````
• ``````       memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), n);
``````
• ``````       memcpy(ptr2 + n, ptr2, n);
n *= 2;
}
``````
• ``````   memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), len-n);
``````
• ``````   memcpy(ptr2 + n, ptr2, len-n);
``````
}
• RSTRING_PTR(str2)[RSTRING_LEN(str2)] = ‘\0’;
• ptr2[RSTRING_LEN(str2)] = ‘\0’;
OBJ_INFECT(str2, str);
rb_enc_cr_str_copy_for_substr(str2, str);

@@ -5701,6 +5703,7 @@
}
else if (split_type == string) {
char *ptr = RSTRING_PTR(str);

• char *temp = ptr;
char *eptr = RSTRING_END(str);
char *sptr = RSTRING_PTR(spat);
long slen = RSTRING_LEN(spat);
@@ -5720,13 +5723,15 @@
ptr = t;
continue;
}
• ``````rb_ary_push(result, rb_str_subseq(str, ptr - RSTRING_PTR(str),
``````

end));

• ``````rb_ary_push(result, rb_str_subseq(str, ptr - temp, end));
ptr += end + slen;
if (!NIL_P(limit) && lim <= ++i) break;
``````
}
• beg = ptr - RSTRING_PTR(str);
• beg = ptr - temp;
}
else {
• char *ptr = RSTRING_PTR(str);
• long len = RSTRING_LEN(str);
long start = beg;
long idx;
int last_null = 0;
@@ -5735,22 +5740,22 @@
while ((end = rb_reg_search(spat, str, start, 0)) >= 0) {
regs = RMATCH_REGS(rb_backref_get());
if (start == end && BEG(0) == END(0)) {
• if (!RSTRING_PTR(str)) {
• if (!ptr) {
rb_ary_push(result, rb_str_new(“”, 0));
break;
}
else if (last_null == 1) {
rb_ary_push(result, rb_str_subseq(str, beg,
• ``````       rb_enc_fast_mbclen(RSTRING_PTR(str)+beg,
``````
• ``````     RSTRING_END(str),
``````
• ``````       rb_enc_fast_mbclen(ptr+beg,
``````
• ``````     ptr+len,
enc)));
beg = start;
``````
}
else {
• ``````               if (RSTRING_PTR(str)+start == RSTRING_END(str))
``````
• ``````               if (ptr+start == ptr+len)
start++;
else
``````
• ``````                   start +=
``````

rb_enc_fast_mbclen(RSTRING_PTR(str)+start,RSTRING_END(str),enc);

• ``````                   start +=
``````

rb_enc_fast_mbclen(ptr+start,ptr+len,enc);
last_null = 1;
continue;
}
— struct.c (revision 25052)
+++ struct.c (working copy)
@@ -98,14 +98,17 @@
VALUE
rb_struct_getmember(VALUE obj, ID id)
{

• VALUE members, slot;
• long i;
• VALUE members, slot, *ptr, *ptr_members;

• long i, len;

• ptr = RSTRUCT_PTR(obj);
members = rb_struct_members(obj);

• ptr_members = RARRAY_PTR(members);
slot = ID2SYM(id);

• for (i=0; i<RARRAY_LEN(members); i++) {
• if (RARRAY_PTR(members)[i] == slot) {
• ``````return RSTRUCT_PTR(obj)[i];
``````
• len = RARRAY_LEN(members);
• for (i=0; i<len; i++) {
• if (ptr_members[i] == slot) {
• ``````return ptr[i];
``````
}
}
rb_name_error(id, “%s is not struct member”, rb_id2name(id));
@@ -156,15 +159,18 @@
static VALUE
rb_struct_set(VALUE obj, VALUE val)
{
• VALUE members, slot;
• long i;
• VALUE members, slot, *ptr, *ptr_members;

• long i, len;

members = rb_struct_members(obj);

• ptr_members = RARRAY_PTR(members);

• len = RARRAY_LEN(members);
rb_struct_modify(obj);

• for (i=0; i<RARRAY_LEN(members); i++) {
• slot = RARRAY_PTR(members)[i];
• ptr = RSTRUCT_PTR(obj);
• for (i=0; i<len; i++) {
• slot = ptr_members[i];
if (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) {
• ``````return RSTRUCT_PTR(obj)[i] = val;
``````
• ``````return ptr[i] = val;
``````
}
}
rb_name_error(rb_frame_this_func(), “`%s’ is not a struct member”,
@@ -175,9 +181,9 @@
static VALUE
make_struct(VALUE name, VALUE members, VALUE klass)
{
• VALUE nstr;
• VALUE nstr, *ptr_members;
ID id;
• long i;
• long i, len;

OBJ_FREEZE(members);
if (NIL_P(name)) {
@@ -204,8 +210,10 @@
rb_define_singleton_method(nstr, “new”, rb_class_new_instance, -1);
rb_define_singleton_method(nstr, “[]”, rb_class_new_instance, -1);
rb_define_singleton_method(nstr, “members”, rb_struct_s_members_m,
0);

• for (i=0; i< RARRAY_LEN(members); i++) {
• ID id = SYM2ID(RARRAY_PTR(members)[i]);
• ptr_members = RARRAY_PTR(members);
• len = RARRAY_LEN(members);
• for (i=0; i< len; i++) {
• ID id = SYM2ID(ptr_members[i]);
if (rb_is_local_id(id) || rb_is_const_id(id)) {
if (i < N_REF_FUNC) {
rb_define_method_id(nstr, id, ref_func[i], 0);
@@ -498,7 +506,8 @@
{
VALUE cname = rb_class_name(rb_obj_class(s));
VALUE members, str = rb_str_new2("#<struct ");
• long i;
• VALUE *ptr, *ptr_members;

• long i, len;
char first = RSTRING_PTR(cname)[0];

if (recur || first != ‘#’) {
@@ -509,7 +518,10 @@
}

members = rb_struct_members(s);

• for (i=0; i<RSTRUCT_LEN(s); i++) {
• ptr_members = RARRAY_PTR(members);
• ptr = RSTRUCT_PTR(s);
• len = RSTRUCT_LEN(s);
• for (i=0; i<len; i++) {
VALUE slot;
ID id;

@@ -519,7 +531,7 @@
else if (first != ‘#’) {
rb_str_cat2(str, " ");
}

• slot = RARRAY_PTR(members)[i];
• slot = ptr_members[i];
id = SYM2ID(slot);
if (rb_is_local_id(id) || rb_is_const_id(id)) {
rb_str_append(str, rb_id2str(id));
@@ -528,7 +540,7 @@
rb_str_append(str, rb_inspect(slot));
}
rb_str_cat2(str, “=”);
• rb_str_append(str, rb_inspect(RSTRUCT_PTR(s)[i]));
• rb_str_append(str, rb_inspect(ptr[i]));
}
rb_str_cat2(str, “>”);
OBJ_INFECT(str, s);
@@ -588,14 +600,16 @@
static VALUE
rb_struct_aref_id(VALUE s, ID id)
{
• VALUE members;
• VALUE *ptr, members, *ptr_members;
long i, len;

• ptr = RSTRUCT_PTR(s);
members = rb_struct_members(s);

• ptr_members = RARRAY_PTR(members);
len = RARRAY_LEN(members);
for (i=0; i<len; i++) {

• if (SYM2ID(RARRAY_PTR(members)[i]) == id) {
• ``````return RSTRUCT_PTR(s)[i];
``````
• if (SYM2ID(ptr_members[i]) == id) {
• ``````return ptr[i];
``````
}
}
rb_name_error(id, “no member ‘%s’ in struct”, rb_id2name(id));
@@ -644,19 +658,21 @@
static VALUE
rb_struct_aset_id(VALUE s, ID id, VALUE val)
{
• VALUE members;
• VALUE members, *ptr, *ptr_members;
long i, len;

members = rb_struct_members(s);

• rb_struct_modify(s);
len = RARRAY_LEN(members);
• if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
• rb_struct_modify(s);
• if (RSTRUCT_LEN(s) != len) {
rb_raise(rb_eTypeError, “struct size differs (%ld required %ld
given)”,
• RARRAY_LEN(members), RSTRUCT_LEN(s));
• len, RSTRUCT_LEN(s));
}
• ptr = RSTRUCT_PTR(s);
• ptr_members = RARRAY_PTR(members);
for (i=0; i<len; i++) {
• if (SYM2ID(RARRAY_PTR(members)[i]) == id) {
• ``````RSTRUCT_PTR(s)[i] = val;
``````
• if (SYM2ID(ptr_members[i]) == id) {
• ``````ptr[i] = val;
return val;
``````
}
}
@@ -771,11 +787,15 @@
static VALUE
recursive_equal(VALUE s, VALUE s2, int recur)
{
• long i;
• VALUE *ptr, *ptr2;

• long i, len;

if (recur) return Qtrue; /* Subtle! */

• for (i=0; i<RSTRUCT_LEN(s); i++) {
• if (!rb_equal(RSTRUCT_PTR(s)[i], RSTRUCT_PTR(s2)[i])) return Qfalse;
• ptr = RSTRUCT_PTR(s);
• ptr2 = RSTRUCT_PTR(s2);
• len = RSTRUCT_LEN(s);
• for (i=0; i<len; i++) {
• if (!rb_equal(ptr[i], ptr2[i])) return Qfalse;
}
return Qtrue;
}
@@ -813,14 +833,16 @@
static VALUE
recursive_hash(VALUE s, VALUE dummy, int recur)
{
• long i;
• long i, len;
st_index_t h;
• VALUE n;
• VALUE n, *ptr;

h = rb_hash_start(rb_hash(rb_obj_class(s)));
if (!recur) {

• for (i = 0; i < RSTRUCT_LEN(s); i++) {
• ``````n = rb_hash(RSTRUCT_PTR(s)[i]);
``````
• ptr = RSTRUCT_PTR(s);
• len = RSTRUCT_LEN(s);
• for (i = 0; i < len; i++) {
• ``````n = rb_hash(ptr[i]);
h = rb_hash_uint(h, NUM2LONG(n));
``````
}
}
@@ -844,11 +866,15 @@
static VALUE
recursive_eql(VALUE s, VALUE s2, int recur)
{
• long i;
• VALUE *ptr, *ptr2;

• long i, len;

if (recur) return Qtrue; /* Subtle! */

• for (i=0; i<RSTRUCT_LEN(s); i++) {
• if (!rb_eql(RSTRUCT_PTR(s)[i], RSTRUCT_PTR(s2)[i])) return Qfalse;
• ptr = RSTRUCT_PTR(s);
• ptr2 = RSTRUCT_PTR(s2);
• len = RSTRUCT_LEN(s);
• for (i=0; i<len; i++) {
• if (!rb_eql(ptr[i], ptr2[i])) return Qfalse;
}
return Qtrue;
}

e\$B\$^\$D\$b\$He(B e\$B\$f\$-\$R\$m\$G\$9e(B

e\$BHt9T5!\$NCf\$G\$9!#EE8;\$,;H\$(\$k\$N\$G2wE,!#e(B

In message “Re: [ruby-dev:39415] Re: Removing constant-able macros
inside of the loop.”
on Fri, 2 Oct 2009 00:53:34 +0900, “Masahiro Kanai (CanI)”
[email protected] writes:

|e\$B\$"\$l\$+\$i!“MM!9\$JJ}K!\$r;n\$7\$^\$7\$?\$,!”\$I\$&\$b\$&\$^\$/Aw?.\$G\$-\$J\$\$\$h\$&\$J\$N\$G!"e(B
|patche\$B\$NJ8;zNs\$re(Bbase64e\$B%(%s%3!<%I\$7\$?J8;zNs\$H!"e(B
|e\$B%Q%C%A\$r:\$;\$?30It%5%\$%H\$Ne(BURLe\$B\$rAw\$j\$^\$9!#e(B

e\$B\$U!<\$`!"\$J\$s\$G@^\$jJV\$7\$A\$c\$&\$s\$G\$7\$g\$&\$M!#\$*8_\$\$\$K\$H\$C\$FLLE]e(B
e\$B\$J\$N\$GD>\$;\$k\$H\$h\$\$\$G\$9\$M!#2a5n\$N7P83\$+\$i\$@\$He(Btext/plaine\$B\$H\$7\$Fe(B
e\$B%Q%C%A\$rE:IU%U%!%\$%k\$K\$9\$k\$H\$&\$^\$/\$\$\$C\$?\$j\$7\$^\$9!#e(B

|e\$B\$h\$m\$7\$/\$*4j\$\$\$\$\$?\$7\$^\$9!#e(B

e\$B<h\$j9~\$_\$^\$7\$?!#e(B

e\$B6b0f\$G\$9!#e(B

2009e\$BG/e(B9e\$B7ne(B30e\$BF|e(B1:04 Masahiro Kanai (CanI)
[email protected]:

e\$B@_Dj\$r3NG’\$7\$F!":FE:IU\$7\$^\$7\$?!#e(B

e\$B?=\$7Lu\$"\$j\$^\$;\$s!#e(B
e\$B@hF|!“AwIU\$7\$?%Q%C%A\$G\$9\$,!”:F\$Se(Bfolde\$B\$5\$l\$F\$\$\$k\$3\$H\$r3NG’\$7\$^\$7\$?!#e(B
e\$B\$3\$A\$i\$N%a!<%i!<\$NAw?.:Q%a!<%k\$N9`L\$G\$O!"e(Bfolde\$B\$5\$l\$F\$\$\$J\$+\$C\$?\$?\$a!"e(B
e\$BL}CG\$7\$F\$\$\$^\$7\$?!#e(B

e\$B\$"\$l\$+\$i!“MM!9\$JJ}K!\$r;n\$7\$^\$7\$?\$,!”\$I\$&\$b\$&\$^\$/Aw?.\$G\$-\$J\$\$\$h\$&\$J\$N\$G!"e(B
patche\$B\$NJ8;zNs\$re(Bbase64e\$B%(%s%3!<%I\$7\$?J8;zNs\$H!"e(B
e\$B%Q%C%A\$r:\$;\$?30It%5%\$%H\$Ne(BURLe\$B\$rAw\$j\$^\$9!#e(B

e\$B\$h\$m\$7\$/\$*4j\$\$\$\$\$?\$7\$^\$9!#e(B

http://www.friendpaste.com/4x9n0ORQbUxewOQsvnRUcj

Ci0tLSBhcnJheS5jCShyZXZpc2lvbiAyNTA1MikKKysrIGFycmF5LmMJKHdvcmtpbmcgY2
9weSkKQEAgLTI3MDgsOCArMjcwOCw4IEBACiBzdGF0aWMgVkFMVUUKIHJiX2FyeV90aW1l
cyhWQUxVRSBhcnksIFZBTFVFIHRpbWVzKQogewotICAgIFZBTFVFIGFyeTIsIHRtcDsKLS
AgICBsb25nIGksIGxlbjsKKyAgICBWQUxVRSBhcnkyLCB0bXAsICpwdHIsICpwdHIyOwor
ICAgIGxvbmcgaSwgdCwgbGVuOwoKICAgICB0bXAgPSByYl9jaGVja19zdHJpbmdfdHlwZS
h0aW1lcyk7CiAgICAgaWYgKCFOSUxfUCh0bXApKSB7CkBAIC0yNzMyLDggKzI3MzIsMTEg
QEAKICAgICBhcnkyID0gYXJ5X25ldyhyYl9vYmpfY2xhc3MoYXJ5KSwgbGVuKTsKICAgIC
BBUllfU0VUX0xFTihhcnkyLCBsZW4pOwoKLSAgICBmb3IgKGk9MDsgaTxsZW47IGkrPVJB
UlJBWV9MRU4oYXJ5KSkgewotCU1FTUNQWShSQVJSQVlfUFRSKGFyeTIpK2ksIFJBUlJBWV
9QVFIoYXJ5KSwgVkFMVUUsIFJBUlJBWV9MRU4oYXJ5KSk7CisgICAgcHRyID0gUkFSUkFZ
X1BUUihhcnkpOworICAgIHB0cjIgPSBSQVJSQVlfUFRSKGFyeTIpOworICAgIHQgPSBSQV
JSQVlfTEVOKGFyeSk7CisgICAgZm9yIChpPTA7IGk8bGVuOyBpKz10KSB7CisJTUVNQ1BZ
KHB0cjIraSwgcHRyLCBWQUxVRSwgdCk7CiAgICAgfQogICBvdXQ6CiAgICAgT0JKX0lORk
VDVChhcnkyLCBhcnkpOwpAQCAtMzQ5MSwxNCArMzQ5NCwxNiBAQAogc3RhdGljIFZBTFVF
CiByYl9hcnlfc2h1ZmZsZV9iYW5nKFZBTFVFIGFyeSkKIHsKKyAgICBWQUxVRSAqcHRyOw
ogICAgIGxvbmcgaSA9IFJBUlJBWV9MRU4oYXJ5KTsKCiAgICAgcmJfYXJ5X21vZGlmeShh
xvbmcgaiA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSppKTsKLQlWQUxVRSB0bXAgPSBS
QVJSQVlfUFRSKGFyeSlbLS1pXTsKLQlSQVJSQVlfUFRSKGFyeSlbaV0gPSBSQVJSQVlfUF
RSKGFyeSlbal07Ci0JUkFSUkFZX1BUUihhcnkpW2pdID0gdG1wOworCVZBTFVFIHRtcCA9
IHB0clstLWldOworCXB0cltpXSA9IHB0cltqXTsKKwlwdHJbal0gPSB0bXA7CiAgICAgfQ
ogICAgIHJldHVybiBhcnk7CiB9CkBAIC0zNTc2LDYgKzM1ODEsNyBAQAogCXJldHVybiBy
Yl9hcnlfbmV3MygzLCBwdHJbaV0sIHB0cltqXSwgcHRyW2tdKTsKICAgICB9CiAgICAgaW
YgKChzaXplX3QpbiA8IHNpemVvZihpZHgpL3NpemVvZihpZHhbMF0pKSB7CisJVkFMVUUg
KnB0cl9yZXN1bHQ7CiAJbG9uZyBzb3J0ZWRbc2l6ZW9mKGlkeCkvc2l6ZW9mKGlkeFswXS
ldOwogCXNvcnRlZFswXSA9IGlkeFswXSA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSps
ZW4pOwogCWZvciAoaT0xOyBpPG47IGkrKykgewpAQCAtMzU4OCwxOCArMzU5NCwyMSBAQA
ogCSAgICBzb3J0ZWRbal0gPSBpZHhbaV0gPSBrOwogCX0KIAlyZXN1bHQgPSByYl9hcnlf
bmV3MihuKTsKKwlwdHJfcmVzdWx0ID0gUkFSUkFZX1BUUihyZXN1bHQpOwogCWZvciAoaT
0wOyBpPG47IGkrKykgewotCSAgICBSQVJSQVlfUFRSKHJlc3VsdClbaV0gPSBSQVJSQVlf
UFRSKGFyeSlbaWR4W2ldXTsKKwkgICAgcHRyX3Jlc3VsdFtpXSA9IHB0cltpZHhbaV1dOw
ogCX0KICAgICB9CiAgICAgZWxzZSB7CisJVkFMVUUgKnB0cl9yZXN1bHQ7CiAJcmVzdWx0
ID0gcmJfYXJ5X25ldzQobGVuLCBwdHIpOworCXB0cl9yZXN1bHQgPSBSQVJSQVlfUFRSKH
Jlc3VsdCk7CiAJUkJfR0NfR1VBUkQoYXJ5KTsKIAlmb3IgKGk9MDsgaTxuOyBpKyspIHsK
IAkgICAgaiA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSoobGVuLWkpKSArIGk7Ci0JIC
AgIG52ID0gUkFSUkFZX1BUUihyZXN1bHQpW2pdOwotCSAgICBSQVJSQVlfUFRSKHJlc3Vs
dClbal0gPSBSQVJSQVlfUFRSKHJlc3VsdClbaV07Ci0JICAgIFJBUlJBWV9QVFIocmVzdW
x0KVtpXSA9IG52OworCSAgICBudiA9IHB0cl9yZXN1bHRbal07CisJICAgIHB0cl9yZXN1
bHRbal0gPSBwdHJfcmVzdWx0W2ldOworCSAgICBwdHJfcmVzdWx0W2ldID0gbnY7CiAJfQ
ogICAgIH0KICAgICBBUllfU0VUX0xFTihyZXN1bHQsIG4pOwotLS0gc3RyaW5nLmMJKHJl
dmlzaW9uIDI1MDUyKQorKysgc3RyaW5nLmMJKHdvcmtpbmcgY29weSkKQEAgLTExNTksNi
ArMTE1OSw3IEBACiB7CiAgICAgVkFMVUUgc3RyMjsKICAgICBsb25nIG4sIGxlbjsKKyAg
ICBjaGFyICpwdHIyOwoKICAgICBsZW4gPSBOVU0yTE9ORyh0aW1lcyk7CiAgICAgaWYgKG
xlbiA8IDApIHsKQEAgLTExNjksMTYgKzExNzAsMTcgQEAKICAgICB9CgogICAgIHN0cjIg
BwdHIyID0gUlNUUklOR19QVFIoc3RyMik7CiAgICAgaWYgKGxlbikgewogICAgICAgICBu
ID0gUlNUUklOR19MRU4oc3RyKTsKLSAgICAgICAgbWVtY3B5KFJTVFJJTkdfUFRSKHN0cj
TkdfUFRSKHN0ciksIG4pOwogICAgICAgICB3aGlsZSAobiA8PSBsZW4vMikgewotICAgIC
AgICAgICAgbWVtY3B5KFJTVFJJTkdfUFRSKHN0cjIpICsgbiwgUlNUUklOR19QVFIoc3Ry
MiksIG4pOworICAgICAgICAgICAgbWVtY3B5KHB0cjIgKyBuLCBwdHIyLCBuKTsKICAgIC
AgICAgICAgIG4gKj0gMjsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoUlNUUklOR19Q
1jcHkocHRyMiArIG4sIHB0cjIsIGxlbi1uKTsKICAgICB9Ci0gICAgUlNUUklOR19QVFIo
c3RyMilbUlNUUklOR19MRU4oc3RyMildID0gJ1wwJzsKKyAgICBwdHIyW1JTVFJJTkdfTE
VOKHN0cjIpXSA9ICdcMCc7CiAgICAgT0JKX0lORkVDVChzdHIyLCBzdHIpOwogICAgIHJi
X2VuY19jcl9zdHJfY29weV9mb3Jfc3Vic3RyKHN0cjIsIHN0cik7CgpAQCAtNTcwMSw2IC
s1NzAzLDcgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoc3BsaXRfdHlwZSA9PSBzdHJpbmcp
I7CiAJY2hhciAqZXB0ciA9IFJTVFJJTkdfRU5EKHN0cik7CiAJY2hhciAqc3B0ciA9IFJT
VFJJTkdfUFRSKHNwYXQpOwogCWxvbmcgc2xlbiA9IFJTVFJJTkdfTEVOKHNwYXQpOwpAQC
AtNTcyMCwxMyArNTcyMywxNSBAQAogCQlwdHIgPSB0OwogCQljb250aW51ZTsKIAkgICAg
fQotCSAgICByYl9hcnlfcHVzaChyZXN1bHQsIHJiX3N0cl9zdWJzZXEoc3RyLCBwdHIgLS
Yl9zdHJfc3Vic2VxKHN0ciwgcHRyIC0gdGVtcCwgZW5kKSk7CiAJICAgIHB0ciArPSBlbm
QgKyBzbGVuOwogCSAgICBpZiAoIU5JTF9QKGxpbWl0KSAmJiBsaW0gPD0gKytpKSBicmVh
azsKIAl9Ci0JYmVnID0gcHRyIC0gUlNUUklOR19QVFIoc3RyKTsKKwliZWcgPSBwdHIgLS
dHIpOworCWxvbmcgbGVuID0gUlNUUklOR19MRU4oc3RyKTsKIAlsb25nIHN0YXJ0ID0gYm
VnOwogCWxvbmcgaWR4OwogCWludCBsYXN0X251bGwgPSAwOwpAQCAtNTczNSwyMiArNTc0
MCwyMiBAQAogCXdoaWxlICgoZW5kID0gcmJfcmVnX3NlYXJjaChzcGF0LCBzdHIsIHN0YX
J0LCAwKSkgPj0gMCkgewogCSAgICByZWdzID0gUk1BVENIX1JFR1MocmJfYmFja3JlZl9n
ZXQoKSk7CiAJICAgIGlmIChzdGFydCA9PSBlbmQgJiYgQkVHKDApID09IEVORCgwKSkgew
otCQlpZiAoIVJTVFJJTkdfUFRSKHN0cikpIHsKKwkJaWYgKCFwdHIpIHsKIAkJICAgIHJi
X2FyeV9wdXNoKHJlc3VsdCwgcmJfc3RyX25ldygiIiwgMCkpOwogCQkgICAgYnJlYWs7Ci
AJCX0KIAkJZWxzZSBpZiAobGFzdF9udWxsID09IDEpIHsKIAkJICAgIHJiX2FyeV9wdXNo
KHJlc3VsdCwgcmJfc3RyX3N1YnNlcShzdHIsIGJlZywKLQkJCQkJCSAgICAgIHJiX2VuY1
X0VORChzdHIpLAorCQkJCQkJICAgICAgcmJfZW5jX2Zhc3RfbWJjbGVuKHB0citiZWcsCi
sJCQkJCQkJCQkgcHRyK2xlbiwKIAkJCQkJCQkJCSBlbmMpKSk7CiAJCSAgICBiZWcgPSBz
dGFydDsKIAkJfQogCQllbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJTVFJJTk
dfUFRSKHN0cikrc3RhcnQgPT0gUlNUUklOR19FTkQoc3RyKSkKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHB0citzdGFydCA9PSBwdHIrbGVuKQogICAgICAgICAgICAgICAgICAgIC
AgICAgc3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhcnQgKz0gcmJfZW5jX2Zhc3RfbWJjbGVuKFJTVFJJTkdfUFRSKH
N0cikrc3RhcnQsUlNUUklOR19FTkQoc3RyKSxlbmMpOworICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhcnQgKz0gcmJfZW5jX2Zhc3RfbWJjbGVuKHB0citzdGFydCxwdHIrbGVuLG
VuYyk7CiAJCSAgICBsYXN0X251bGwgPSAxOwogCQkgICAgY29udGludWU7CiAJCX0KLS0t
IHN0cnVjdC5jCShyZXZpc2lvbiAyNTA1MikKKysrIHN0cnVjdC5jCSh3b3JraW5nIGNvcH
kpCkBAIC05OCwxNCArOTgsMTcgQEAKIFZBTFVFCiByYl9zdHJ1Y3RfZ2V0bWVtYmVyKFZB
TFVFIG9iaiwgSUQgaWQpCiB7Ci0gICAgVkFMVUUgbWVtYmVycywgc2xvdDsKLSAgICBsb2
5nIGk7CisgICAgVkFMVUUgbWVtYmVycywgc2xvdCwgKnB0ciwgKnB0cl9tZW1iZXJzOwor
ICAgIGxvbmcgaSwgbGVuOwoKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihvYmopOwogICAgIG
1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYmVycyhvYmopOworICAgIHB0cl9tZW1iZXJzID0g
UkFSUkFZX1BUUihtZW1iZXJzKTsKICAgICBzbG90ID0gSUQyU1lNKGlkKTsKLSAgICBmb3
IgKGk9MDsgaTxSQVJSQVlfTEVOKG1lbWJlcnMpOyBpKyspIHsKLQlpZiAoUkFSUkFZX1BU
UihtZW1iZXJzKVtpXSA9PSBzbG90KSB7Ci0JICAgIHJldHVybiBSU1RSVUNUX1BUUihvYm
opW2ldOworICAgIGxlbiA9IFJBUlJBWV9MRU4obWVtYmVycyk7CisgICAgZm9yIChpPTA7
IGk8bGVuOyBpKyspIHsKKwlpZiAocHRyX21lbWJlcnNbaV0gPT0gc2xvdCkgeworCSAgIC
ByZXR1cm4gcHRyW2ldOwogCX0KICAgICB9CiAgICAgcmJfbmFtZV9lcnJvcihpZCwgIiVz
IGlzIG5vdCBzdHJ1Y3QgbWVtYmVyIiwgcmJfaWQybmFtZShpZCkpOwpAQCAtMTU2LDE1IC
sxNTksMTggQEAKIHN0YXRpYyBWQUxVRQogcmJfc3RydWN0X3NldChWQUxVRSBvYmosIFZB
TFVFIHZhbCkKIHsKLSAgICBWQUxVRSBtZW1iZXJzLCBzbG90OwotICAgIGxvbmcgaTsKKy
AgICBWQUxVRSBtZW1iZXJzLCBzbG90LCAqcHRyLCAqcHRyX21lbWJlcnM7CisgICAgbG9u
ZyBpLCBsZW47CgogICAgIG1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYmVycyhvYmopOworIC
AgIHB0cl9tZW1iZXJzID0gUkFSUkFZX1BUUihtZW1iZXJzKTsKKyAgICBsZW4gPSBSQVJS
QVlfTEVOKG1lbWJlcnMpOwogICAgIHJiX3N0cnVjdF9tb2RpZnkob2JqKTsKLSAgICBmb3
IgKGk9MDsgaTxSQVJSQVlfTEVOKG1lbWJlcnMpOyBpKyspIHsKLQlzbG90ID0gUkFSUkFZ
X1BUUihtZW1iZXJzKVtpXTsKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihvYmopOworICAgIG
ZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJc2xvdCA9IHB0cl9tZW1iZXJzW2ldOwogCWlm
IChyYl9pZF9hdHRyc2V0KFNZTTJJRChzbG90KSkgPT0gcmJfZnJhbWVfdGhpc19mdW5jKC
kpIHsKLQkgICAgcmV0dXJuIFJTVFJVQ1RfUFRSKG9iailbaV0gPSB2YWw7CisJICAgIHJl
dHVybiBwdHJbaV0gPSB2YWw7CiAJfQogICAgIH0KICAgICByYl9uYW1lX2Vycm9yKHJiX2
ZyYW1lX3RoaXNfZnVuYygpLCAiYCVzJyBpcyBub3QgYSBzdHJ1Y3QgbWVtYmVyIiwKQEAg
1lLCBWQUxVRSBtZW1iZXJzLCBWQUxVRSBrbGFzcykKIHsKLSAgICBWQUxVRSBuc3RyOwor
ICAgIFZBTFVFIG5zdHIsICpwdHJfbWVtYmVyczsKICAgICBJRCBpZDsKLSAgICBsb25nIG
k7CisgICAgbG9uZyBpLCBsZW47CgogICAgIE9CSl9GUkVFWkUobWVtYmVycyk7CiAgICAg
aWYgKE5JTF9QKG5hbWUpKSB7CkBAIC0yMDQsOCArMjEwLDEwIEBACiAgICAgcmJfZGVmaW
5lX3NpbmdsZXRvbl9tZXRob2QobnN0ciwgIm5ldyIsIHJiX2NsYXNzX25ld19pbnN0YW5j
ZSwgLTEpOwogICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKG5zdHIsICJbXSIsIH
JiX2NsYXNzX25ld19pbnN0YW5jZSwgLTEpOwogICAgIHJiX2RlZmluZV9zaW5nbGV0b25f
bWV0aG9kKG5zdHIsICJtZW1iZXJzIiwgcmJfc3RydWN0X3NfbWVtYmVyc19tLCAwKTsKLS
AgICBmb3IgKGk9MDsgaTwgUkFSUkFZX0xFTihtZW1iZXJzKTsgaSsrKSB7Ci0JSUQgaWQg
PSBTWU0ySUQoUkFSUkFZX1BUUihtZW1iZXJzKVtpXSk7CisgICAgcHRyX21lbWJlcnMgPS
BSQVJSQVlfUFRSKG1lbWJlcnMpOworICAgIGxlbiA9IFJBUlJBWV9MRU4obWVtYmVycyk7
CisgICAgZm9yIChpPTA7IGk8IGxlbjsgaSsrKSB7CisJSUQgaWQgPSBTWU0ySUQocHRyX2
1lbWJlcnNbaV0pOwogCWlmIChyYl9pc19sb2NhbF9pZChpZCkgfHwgcmJfaXNfY29uc3Rf
aWQoaWQpKSB7CiAJICAgIGlmIChpIDwgTl9SRUZfRlVOQykgewogCQlyYl9kZWZpbmVfbW
V0aG9kX2lkKG5zdHIsIGlkLCByZWZfZnVuY1tpXSwgMCk7CkBAIC00OTgsNyArNTA2LDgg
QEAKIHsKICAgICBWQUxVRSBjbmFtZSA9IHJiX2NsYXNzX25hbWUocmJfb2JqX2NsYXNzKH
MpKTsKICAgICBWQUxVRSBtZW1iZXJzLCBzdHIgPSByYl9zdHJfbmV3MigiIzxzdHJ1Y3Qg
Iik7Ci0gICAgbG9uZyBpOworICAgIFZBTFVFICpwdHIsICpwdHJfbWVtYmVyczsKKyAgIC
Bsb25nIGksIGxlbjsKICAgICBjaGFyIGZpcnN0ID0gUlNUUklOR19QVFIoY25hbWUpWzBd
OwoKICAgICBpZiAocmVjdXIgfHwgZmlyc3QgIT0gJyMnKSB7CkBAIC01MDksNyArNTE4LD
EwIEBACiAgICAgfQoKICAgICBtZW1iZXJzID0gcmJfc3RydWN0X21lbWJlcnMocyk7Ci0g
ICAgZm9yIChpPTA7IGk8UlNUUlVDVF9MRU4ocyk7IGkrKykgeworICAgIHB0cl9tZW1iZX
JzID0gUkFSUkFZX1BUUihtZW1iZXJzKTsKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihzKTsK
KyAgICBsZW4gPSBSU1RSVUNUX0xFTihzKTsKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKy
kgewogCVZBTFVFIHNsb3Q7CiAJSUQgaWQ7CgpAQCAtNTE5LDcgKzUzMSw3IEBACiAJZWxz
ZSBpZiAoZmlyc3QgIT0gJyMnKSB7CiAJICAgIHJiX3N0cl9jYXQyKHN0ciwgIiAiKTsKIA
l9Ci0Jc2xvdCA9IFJBUlJBWV9QVFIobWVtYmVycylbaV07CisJc2xvdCA9IHB0cl9tZW1i
ZXJzW2ldOwogCWlkID0gU1lNMklEKHNsb3QpOwogCWlmIChyYl9pc19sb2NhbF9pZChpZC
kgfHwgcmJfaXNfY29uc3RfaWQoaWQpKSB7CiAJICAgIHJiX3N0cl9hcHBlbmQoc3RyLCBy
Yl9pZDJzdHIoaWQpKTsKQEAgLTUyOCw3ICs1NDAsNyBAQAogCSAgICByYl9zdHJfYXBwZW
5kKHN0ciwgcmJfaW5zcGVjdChzbG90KSk7CiAJfQogCXJiX3N0cl9jYXQyKHN0ciwgIj0i
KTsKLQlyYl9zdHJfYXBwZW5kKHN0ciwgcmJfaW5zcGVjdChSU1RSVUNUX1BUUihzKVtpXS
kpOworCXJiX3N0cl9hcHBlbmQoc3RyLCByYl9pbnNwZWN0KHB0cltpXSkpOwogICAgIH0K
ICAgICByYl9zdHJfY2F0MihzdHIsICI+Iik7CiAgICAgT0JKX0lORkVDVChzdHIsIHMpOw
pAQCAtNTg4LDE0ICs2MDAsMTYgQEAKIHN0YXRpYyBWQUxVRQogcmJfc3RydWN0X2FyZWZf
aWQoVkFMVUUgcywgSUQgaWQpCiB7Ci0gICAgVkFMVUUgbWVtYmVyczsKKyAgICBWQUxVRS
AqcHRyLCBtZW1iZXJzLCAqcHRyX21lbWJlcnM7CiAgICAgbG9uZyBpLCBsZW47CgorICAg
IHB0ciA9IFJTVFJVQ1RfUFRSKHMpOwogICAgIG1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYm
VycyhzKTsKKyAgICBwdHJfbWVtYmVycyA9IFJBUlJBWV9QVFIobWVtYmVycyk7CiAgICAg
bGVuID0gUkFSUkFZX0xFTihtZW1iZXJzKTsKICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKy
kgewotCWlmIChTWU0ySUQoUkFSUkFZX1BUUihtZW1iZXJzKVtpXSkgPT0gaWQpIHsKLQkg
ICAgcmV0dXJuIFJTVFJVQ1RfUFRSKHMpW2ldOworCWlmIChTWU0ySUQocHRyX21lbWJlcn
NbaV0pID09IGlkKSB7CisJICAgIHJldHVybiBwdHJbaV07CiAJfQogICAgIH0KICAgICBy
Yl9uYW1lX2Vycm9yKGlkLCAibm8gbWVtYmVyICclcycgaW4gc3RydWN0IiwgcmJfaWQybm
FtZShpZCkpOwpAQCAtNjQ0LDE5ICs2NTgsMjEgQEAKIHN0YXRpYyBWQUxVRQogcmJfc3Ry
dWN0X2FzZXRfaWQoVkFMVUUgcywgSUQgaWQsIFZBTFVFIHZhbCkKIHsKLSAgICBWQUxVRS
BtZW1iZXJzOworICAgIFZBTFVFIG1lbWJlcnMsICpwdHIsICpwdHJfbWVtYmVyczsKICAg
ICBsb25nIGksIGxlbjsKCiAgICAgbWVtYmVycyA9IHJiX3N0cnVjdF9tZW1iZXJzKHMpOw
otICAgIHJiX3N0cnVjdF9tb2RpZnkocyk7CiAgICAgbGVuID0gUkFSUkFZX0xFTihtZW1i
ZXJzKTsKLSAgICBpZiAoUlNUUlVDVF9MRU4ocykgIT0gUkFSUkFZX0xFTihtZW1iZXJzKS
kgeworICAgIHJiX3N0cnVjdF9tb2RpZnkocyk7CisgICAgaWYgKFJTVFJVQ1RfTEVOKHMp
ICE9IGxlbikgewogCXJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJzdHJ1Y3Qgc2l6ZSBkaW
ZmZXJzICglbGQgcmVxdWlyZWQgJWxkIGdpdmVuKSIsCi0JCSBSQVJSQVlfTEVOKG1lbWJl
cnMpLCBSU1RSVUNUX0xFTihzKSk7CisJCSBsZW4sIFJTVFJVQ1RfTEVOKHMpKTsKICAgIC
B9CisgICAgcHRyID0gUlNUUlVDVF9QVFIocyk7CisgICAgcHRyX21lbWJlcnMgPSBSQVJS
QVlfUFRSKG1lbWJlcnMpOwogICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7Ci0JaWYgKF
NZTTJJRChSQVJSQVlfUFRSKG1lbWJlcnMpW2ldKSA9PSBpZCkgewotCSAgICBSU1RSVUNU
X1BUUihzKVtpXSA9IHZhbDsKKwlpZiAoU1lNMklEKHB0cl9tZW1iZXJzW2ldKSA9PSBpZC
kgeworCSAgICBwdHJbaV0gPSB2YWw7CiAJICAgIHJldHVybiB2YWw7CiAJfQogICAgIH0K
QEAgLTc3MSwxMSArNzg3LDE1IEBACiBzdGF0aWMgVkFMVUUKIHJlY3Vyc2l2ZV9lcXVhbC
hWQUxVRSBzLCBWQUxVRSBzMiwgaW50IHJlY3VyKQogewotICAgIGxvbmcgaTsKKyAgICBW
QUxVRSAqcHRyLCAqcHRyMjsKKyAgICBsb25nIGksIGxlbjsKCiAgICAgaWYgKHJlY3VyKS
ByZXR1cm4gUXRydWU7IC8qIFN1YnRsZSEgKi8KLSAgICBmb3IgKGk9MDsgaTxSU1RSVUNU
X0xFTihzKTsgaSsrKSB7Ci0JaWYgKCFyYl9lcXVhbChSU1RSVUNUX1BUUihzKVtpXSwgUl
NUUlVDVF9QVFIoczIpW2ldKSkgcmV0dXJuIFFmYWxzZTsKKyAgICBwdHIgPSBSU1RSVUNU
X1BUUihzKTsKKyAgICBwdHIyID0gUlNUUlVDVF9QVFIoczIpOworICAgIGxlbiA9IFJTVF
JVQ1RfTEVOKHMpOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJaWYgKCFyYl9l
cXVhbChwdHJbaV0sIHB0cjJbaV0pKSByZXR1cm4gUWZhbHNlOwogICAgIH0KICAgICByZX
R1cm4gUXRydWU7CiB9CkBAIC04MTMsMTQgKzgzMywxNiBAQAogc3RhdGljIFZBTFVFCiBy
ZWN1cnNpdmVfaGFzaChWQUxVRSBzLCBWQUxVRSBkdW1teSwgaW50IHJlY3VyKQogewotIC
AgIGxvbmcgaTsKKyAgICBsb25nIGksIGxlbjsKICAgICBzdF9pbmRleF90IGg7Ci0gICAg
VkFMVUUgbjsKKyAgICBWQUxVRSBuLCAqcHRyOwoKICAgICBoID0gcmJfaGFzaF9zdGFydC
hyYl9oYXNoKHJiX29ial9jbGFzcyhzKSkpOwogICAgIGlmICghcmVjdXIpIHsKLQlmb3Ig
KGkgPSAwOyBpIDwgUlNUUlVDVF9MRU4ocyk7IGkrKykgewotCSAgICBuID0gcmJfaGFzaC
hSU1RSVUNUX1BUUihzKVtpXSk7CisJcHRyID0gUlNUUlVDVF9QVFIocyk7CisJbGVuID0g
UlNUUlVDVF9MRU4ocyk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJICAgIG
4gPSByYl9oYXNoKHB0cltpXSk7CiAJICAgIGggPSByYl9oYXNoX3VpbnQoaCwgTlVNMkxP
TkcobikpOwogCX0KICAgICB9CkBAIC04NDQsMTEgKzg2NiwxNSBAQAogc3RhdGljIFZBTF
VFCiByZWN1cnNpdmVfZXFsKFZBTFVFIHMsIFZBTFVFIHMyLCBpbnQgcmVjdXIpCiB7Ci0g
ICAgbG9uZyBpOworICAgIFZBTFVFICpwdHIsICpwdHIyOworICAgIGxvbmcgaSwgbGVuOw
oKICAgICBpZiAocmVjdXIpIHJldHVybiBRdHJ1ZTsgLyogU3VidGxlISAqLwotICAgIGZv
ciAoaT0wOyBpPFJTVFJVQ1RfTEVOKHMpOyBpKyspIHsKLQlpZiAoIXJiX2VxbChSU1RSVU
NUX1BUUihzKVtpXSwgUlNUUlVDVF9QVFIoczIpW2ldKSkgcmV0dXJuIFFmYWxzZTsKKyAg
ICBwdHIgPSBSU1RSVUNUX1BUUihzKTsKKyAgICBwdHIyID0gUlNUUlVDVF9QVFIoczIpOw
orICAgIGxlbiA9IFJTVFJVQ1RfTEVOKHMpOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsr
KSB7CisJaWYgKCFyYl9lcWwocHRyW2ldLCBwdHIyW2ldKSkgcmV0dXJuIFFmYWxzZTsKIC
AgICB9CiAgICAgcmV0dXJuIFF0cnVlOwogfQo=