//-------------------------------------------------------------------------------------------------------
// 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 = 39044;
b = -13178;
c = 4351;
d = 45649;
e = 45307;
f = -11346;
g = -42341;
h = -46030;
obj0.a = -29831;
obj0.b = 3728;
obj0.c = 62305;
obj0.d = 9226;
obj0.e = -51090;
ary[0] = -51818;
ary[1] = -497;
ary[100] = -34201;
f = e;
if(((f - b) <= (obj0.a | ((56452 * obj0.c) + 32772)))) {
  obj0.c = e;
  if(((((21312 | -8052) * (++ b)) | ((-16945 <= b) ? (-9856 - -63588) : h)) < (d & (- (42801 ^ -41922))))) {
    if(((f & 35086) < (((obj0.c <= f) ? (obj0.e * 7725) : -16800) & (++ a)))) {
      obj0.d = ((((obj0.d ^ h) - (-8853 ^ d)) - ((-3624 == -7289) + obj0.b)) < (obj0.e + ((b++ ) & obj0.b)));
      f = h;
    } else {
      b = 16867;
    }
    if(((obj0.e - c) > (((14468 == -64500) ? (c ? g : g) : (27672 | obj0.a)) + d))) {
      c = obj0.e;
      obj0.d = d;
    } else {
    }
  } else {
    b = d;
  }
} else {
  if(((obj0.c + 51362) != (b - d))) {
    if(((obj0.b * d) <= ((+ (b * -5414)) * ((-24856 <= f) ? -27362 : (d - g))))) {
      obj0.b = ((((g ^ -44333) - (+ obj0.a)) ^ ((58934 - -52676) | obj0.a)) & (h - a));
      h = a;
      d = 8382;
    } else {
      e = 44230;
      f = obj0.b;
      a = ((obj0.d * obj0.d) * ((f + (61319 - 34518)) | (b * f)));
    }
    if((((d++ ) + ((-58655 < obj0.c) ? (d * h) : g)) < ((g ^ (9464 & obj0.b)) ^ b))) {
    } else {
      obj0.a = h;
      f = ((((52544 | obj0.e) ^ obj0.c) - (e <= (e++ ))) + ((d == (- a)) + ((obj0.e == -50707) ? h : (g & 20001))));
      obj0.a = c;
    }
    if(((h | (++ obj0.b)) != (((h - obj0.b) | (d ? g : obj0.b)) & (obj0.e ^ -42324)))) {
      c = ((obj0.e ^ ((-12898 ^ b) ^ (-2732 + 2842))) & (((-37082 != obj0.b) ? obj0.e : e) + (c - (31550 ? -24692 : obj0.a))));
    } else {
      obj0.e = ((a * ((obj0.d + -23105) ^ c)) & (a & obj0.b));
    }
  } else {
    obj0.b = f;
  }
  if(((50732 - ((obj0.a & h) & (g & 58098))) == (((obj0.e ^ -12196) ^ (-57724 * h)) - ((g - -10127) * (f | 63922))))) {
    if(((c * obj0.b) <= (45071 * g))) {
      e = e;
      d = (((21559 < -42435) | (c | (-34381 ^ a))) & ((+ (obj0.e++ )) & (23243 - h)));
    } else {
      obj0.e = f;
      obj0.c = ((a + e) * (f ^ g));
    }
    c = obj0.e;
  } else {
  }
  if(((((+ obj0.a) + (obj0.b++ )) - (f == e)) > (e - f))) {
    if(((((37254 ? a : -44946) == (obj0.a ^ obj0.e)) - b) >= ((d ^ (obj0.d & obj0.e)) ^ ((- -1218) ^ (obj0.b > d))))) {
      d = c;
      c = ((((a < a) ? 63782 : (-13455 <= 3298)) - d) + (c | (- obj0.a)));
    } else {
    }
  } else {
    if(((6812 * ((5572 == b) + (h & b))) == ((a * (37411 & -9931)) ^ (- b)))) {
      c = c;
      e = ((((-1935 - -50760) == (obj0.c ? 4202 : f)) ^ -20743) * ((obj0.e | g) - ((2810 - obj0.c) | 21639)));
      a = ((-22871 * ((49768 != -15523) ? e : (g++ ))) < (((-42962 - h) + (g - 54276)) | 9688));
    } else {
    }
  }
}
obj0.e = ((-10549 - (f + c)) | (f | ((- obj0.e) * b)));
if(((-27786 | ((-18230 < 63703) ? (obj0.c & -15755) : a)) < (51046 + ((- obj0.b) | obj0.a)))) {
} else {
  if((((obj0.b + (h ? 23772 : -52491)) & (a - (-11627 - obj0.b))) <= (((15573 ^ -26294) > 50586) * (obj0.d >= (h & a))))) {
    d = obj0.c;
    c = obj0.d;
  } else {
  }
  if(((((e <= obj0.a) ? 44347 : g) | f) >= (((a & b) | (4823 ? obj0.b : -62076)) ^ ((54865 + -41606) ^ (41573 | -11289))))) {
    if(((((-4735 * obj0.e) ^ obj0.a) + (+ -63825)) < ((obj0.d & e) - ((3035 & -62746) - (809 & c))))) {
    } else {
      c = ((g & ((a * h) + b)) & ((-38025 + (3291 ^ f)) ^ (d + (++ e))));
      obj0.d = ((d * d) & (e | ((b < 33453) ? (obj0.c & -33218) : (obj0.c & -63892))));
    }
    a = obj0.e;
  } else {
    c = obj0.d;
    a = (((h | (-19542 | a)) & (f ^ -34953)) * (((h * f) & obj0.c) * (obj0.a ^ b)));
  }
}
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');
})();
