//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = -42214;
b = -58304;
c = -5756;
d = 10488;
e = 43950;
f = -21539;
g = -38904;
h = -35931;
obj0.a = 8977;
obj0.b = -41945;
obj0.c = -16919;
obj0.d = -33613;
obj0.e = 23799;
ary[0] = 61999;
ary[1] = 10094;
ary[100] = 51054;
if((((obj0.e * (42148 + -27475)) & f) == (((63711 + 31107) & obj0.d) ^ 47575))) {
  obj0.e = ((((g <= obj0.b) ? (2338 - 51484) : e) - ((40975 ? 10151 : 33287) | f)) == (((g ? 25786 : obj0.e) ^ (60342 | -39191)) ^ obj0.c));
  if(((d & b) < ((d + (20580 * b)) + (! (c | 11551))))) {
    if(((e - (++ f)) == (e | -60078))) {
      e = d;
      d = (((+ (- 45909)) * ((g != obj0.d) ? (-35031 * g) : obj0.a)) ? (((-25913 + obj0.a) ^ (obj0.d ? c : h)) | ((e ? -7996 : 44418) >= 48142)) : (obj0.e * obj0.d));
    } else {
    }
    f = e;
    g = ((obj0.d & ((+ -56962) | g)) | (((e + b) * (obj0.a + 27766)) + (obj0.a <= f)));
  } else {
    f = ((((obj0.d ? d : 22231) - c) + ((30223 & obj0.c) + (-62448 + d))) + ((obj0.e + -177) + (obj0.b - -39560)));
    if(((((obj0.b <= e) ? b : h) | ((obj0.d + obj0.a) < (obj0.b ^ obj0.d))) != ((- e) & (h == (-65303 ? 31319 : g))))) {
      g = (((obj0.e * (-3170 != -64128)) & f) ^ (a * (f++ )));
      e = ((h * f) + (((e > d) * obj0.b) ^ ((34088 * b) * (- b))));
      obj0.a = ((((-9670 != h) ? (c ^ 42944) : f) + f) ^ (24088 - a));
    } else {
      c = ((((2950 >= -24418) ? (f >= 56967) : (obj0.e > c)) & obj0.a) == (((27431 | -32062) & d) | (42081 >= (f ? 19958 : f))));
      c = (++ d);
      obj0.d = ((obj0.a | ((d - e) ^ (39338 != g))) ^ (((27387 ? c : obj0.e) | g) & (g + -53174)));
    }
    b = g;
  }
  if((((2960 ^ (-5877 ? -59494 : 15302)) * (a != (2436 <= obj0.e))) >= (g & ((44844 & obj0.e) & (-60040 | obj0.a))))) {
  } else {
  }
} else {
  if(((((c - -19700) & b) - (- (obj0.e ^ -40261))) < ((e ^ (obj0.d++ )) | (a - (10918 | b))))) {
    d = ((((-37586 != obj0.c) ? c : (obj0.e | obj0.e)) | -20553) ^ ((+ (obj0.e * 21407)) * ((-47034 * f) | f)));
    if(((((obj0.d++ ) & (-37941 - -8104)) + 8097) == (-61356 + c))) {
      a = g;
    } else {
      g = h;
      f = c;
    }
  } else {
    if(((obj0.e - ((obj0.a | 267) & (d + f))) > (((-41463 | 63793) + obj0.e) - ((e ? 8466 : 5404) ^ b)))) {
      obj0.d = d;
      d = ((((-7961 - b) - (obj0.d - 61514)) - obj0.e) + (obj0.b + ((-41231 * h) | d)));
      obj0.e = h;
    } else {
      a = ((((+ -60942) | (d == -27803)) | ((7019 | 41881) * g)) * (((-13343 & -55526) * b) & obj0.b));
      g = e;
      obj0.c = ((obj0.b - ((b + e) ^ d)) * (((obj0.b > -43155) ? (47890 != obj0.e) : obj0.b) | ((e - 29465) * (e * -32053))));
    }
  }
}
if(((43433 | ((obj0.c - c) & h)) > (e | ((c <= obj0.d) ? (+ -31512) : obj0.e)))) {
  if(((c - ((f & 43060) * obj0.e)) > (((- 13365) - (h * -26379)) + ((-10851 == -36370) ? (-7869 & obj0.b) : e)))) {
    if(((((obj0.a * -14129) | (++ d)) & (b & obj0.c)) != (g & ((-24449 & -29164) - (-56516 + -12359))))) {
      d = f;
      obj0.e = ((((-65133 <= obj0.b) ? obj0.b : (44270 & -17836)) | obj0.a) | ((obj0.a != d) | ((-11080 < obj0.a) ? (a - -32086) : (d - 14316))));
      g = (((- (+ e)) + (h <= (obj0.c - 20290))) > (obj0.b * ((39809 <= obj0.a) ? (a ^ e) : (obj0.a + b))));
    } else {
      f = ((obj0.d - obj0.b) * (63177 + ((-11485 | -47824) + (31538 > obj0.c))));
      f = (- (obj0.c | -25731));
    }
  } else {
    f = obj0.d;
    if(((a - ((h != obj0.a) ? obj0.c : b)) >= ((+ (h + 46655)) - (obj0.a++ )))) {
    } else {
      d = ((((h ? 7439 : c) == f) * ((58886 >= 2804) ? a : obj0.d)) - (b ^ ((-54518 | c) ^ -28989)));
    }
    d = (((b & obj0.e) | obj0.d) == (((49579 > d) != (+ a)) ^ (c ^ -189)));
  }
  a = b;
} else {
  if(((obj0.e | (h | (obj0.d & -49016))) != (((h & 41613) * (-55202 | g)) | ((13589 ? obj0.e : h) * obj0.a)))) {
    obj0.e = -51659;
    c = obj0.b;
  } else {
    a = d;
  }
  g = c;
}
obj0.a = c;
if(((obj0.d | f) <= (35044 + (obj0.a & g)))) {
  if(((((-4178 * 48682) & (-55059 + -5878)) + (obj0.e - h)) > (4926 * (58198 ^ obj0.d)))) {
  } else {
    a = ((((-14217 > b) ? a : g) & (-19444 * obj0.e)) * (obj0.d - obj0.e));
  }
  if(((((-6529 ? f : 51653) | (-62117 & 22701)) + -53781) >= (obj0.c & (obj0.e - d)))) {
    if(((f + g) <= ((obj0.c + g) & ((b ^ h) ^ (20725 + c))))) {
    } else {
      f = (((-33730 | (d | obj0.d)) * -18670) < (obj0.e ^ f));
      f = (((obj0.d >= (-2718 & obj0.a)) & e) ? ((+ (c >= d)) + obj0.a) : (((1849 > -63162) ? (obj0.e ^ obj0.a) : g) - ((obj0.b & f) ^ (f < 28095))));
    }
    obj0.c = ((d & (! obj0.e)) + (obj0.a - ((29761 ? e : g) > (obj0.d * obj0.c))));
  } else {
    f = (+ (((++ obj0.a) & (4869 & a)) ^ obj0.a));
    h = e;
    if(((((++ obj0.b) * obj0.d) & ((b - obj0.c) * c)) != (36183 & (obj0.a++ )))) {
      obj0.e = e;
    } else {
    }
  }
} else {
  if(((obj0.b ^ ((obj0.e != -62115) ? -14608 : obj0.d)) >= ((obj0.d ^ a) * g))) {
    obj0.d = ((h + (h & (64569 | -50374))) | (((22497 | obj0.c) & (c + a)) + -18368));
    f = (((obj0.d ^ (obj0.e * 48167)) + obj0.e) | (((-56505 == -32189) ? d : (-64347 - 56429)) * (obj0.e - (! 45447))));
    obj0.a = ((obj0.e - (obj0.a ^ (-52420 ? -16360 : 59391))) + ((48260 >= a) ^ obj0.d));
  } else {
  }
  b = ((obj0.d * 37354) + (c * 40154));
  if((((++ obj0.a) | h) > (((e <= h) ? (obj0.d | obj0.e) : obj0.d) | d))) {
    c = ((e - ((+ c) | 56325)) | ((f++ ) & (+ obj0.e)));
    c = ((((h <= -41812) ? (-3125 - d) : (53159 ^ b)) - g) ? ((+ (53207 + 57759)) * -53129) : ((obj0.b <= (- -24463)) | (b ^ e)));
    if(((((16674 > obj0.b) ? e : (-53466 * obj0.c)) ^ obj0.a) < (((g < d) ? a : obj0.d) * obj0.c))) {
      obj0.b = -30571;
    } else {
    }
  } else {
    if(((((h < 44507) ? obj0.d : (e ^ obj0.c)) | (++ a)) >= (((23003 - 44070) < (h ? 24721 : 39193)) * obj0.e))) {
      obj0.b = obj0.c;
      b = (((obj0.c | obj0.a) & (48835 * b)) - (((28290 | -50520) * (++ g)) & ((e <= 11278) ? obj0.d : c)));
    } else {
      f = ((((e <= g) ? (63275 & -45398) : (42613 == g)) + ((21514 * e) & (-38533 < -53303))) < (((c ? -10366 : obj0.d) | (-4830 ? -16960 : -46048)) + -41349));
    }
    if(((-30510 ^ e) == (c & obj0.b))) {
      c = h;
      d = (((- (d - obj0.a)) - g) >= (((c | h) ^ d) & (g++ )));
      obj0.b = ((((-50325 | -19882) - (e + g)) - ((45638 > -52432) ^ (-63623 ? f : 41404))) & (((53195 | 52163) & (-11459 & 16946)) & 63460));
    } else {
      c = ((-61297 & -36577) == ((+ c) | ((obj0.e != -8986) ? obj0.b : (e >= -22437))));
      b = ((obj0.d | ((61143 ^ -41220) != g)) * (((-28788 + -5443) >= (-60279 & -64766)) + ((-10959 != obj0.c) ? obj0.a : (-52718 ? -45050 : 64822))));
      obj0.d = ((e ^ -25587) != (((+ d) * (-61371 + h)) & h));
    }
  }
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
