blob: 528a466b7c35adb9cf70586db2b281a1fb51b9dc [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
#include <dirent.h>
#include <dlfcn.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "base64.h"
#include "heap.h"
#include "thread.h"
#include "stringprintf.h"
#include "class_linker.h"
#include "dex_file.h"
#include "unicode/uclean.h"
#include "unicode/uvernum.h"
#include "gtest/gtest.h"
namespace art {
//class IntMath {
//
// private int foo_;
//
// public IntMath(int stuff) {
// foo_ = stuff;
// }
//
// public IntMath() {
// foo_ = 123;
// }
//
// /*
// * Try to cause some unary operations.
// */
// static int unopTest(int x) {
// x = -x;
// x ^= 0xffffffff;
// return x;
// }
//
// static int shiftTest1() {
// final int[] mBytes = {
// 0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
// };
// long l;
// int i1, i2;
//
// if (mBytes[0] != 0x11) return 20;
// if (mBytes[1] != 0x22) return 21;
// if (mBytes[2] != 0x33) return 22;
// if (mBytes[3] != 0x44) return 23;
// if (mBytes[4] != 0x88) return 24;
// if (mBytes[5] != 0x99) return 25;
// if (mBytes[6] != 0xaa) return 26;
// if (mBytes[7] != 0xbb) return 27;
//
// i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
// i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
// l = i1 | ((long)i2 << 32);
//
// if (i1 != 0x44332211) { return 0x80000000 | i1; }
// if (i2 != 0xbbaa9988) { return 2; }
// if (l != 0xbbaa998844332211L) { return 3; }
//
// l = (long)mBytes[0]
// | (long)mBytes[1] << 8
// | (long)mBytes[2] << 16
// | (long)mBytes[3] << 24
// | (long)mBytes[4] << 32
// | (long)mBytes[5] << 40
// | (long)mBytes[6] << 48
// | (long)mBytes[7] << 56;
//
// if (l != 0xbbaa998844332211L) { return 4; }
// return 0;
// }
//
// static int shiftTest2() {
//
// long a = 0x11;
// long b = 0x22;
// long c = 0x33;
// long d = 0x44;
// long e = 0x55;
// long f = 0x66;
// long g = 0x77;
// long h = 0x88;
//
// long result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
// (e << 24) | (f << 16) | (g << 8) | h);
//
// if (result != 0x1122334455667788L) { return 1; }
// return 0;
// }
//
// static int unsignedShiftTest() {
// byte b = -4;
// short s = -4;
// char c = 0xfffc;
// int i = -4;
//
// b >>>= 4;
// s >>>= 4;
// c >>>= 4;
// i >>>= 4;
//
// if ((int) b != -1) { return 1; }
// if ((int) s != -1) { return 2; }
// if ((int) c != 0x0fff) { return 3; }
// if (i != 268435455) { return 4; }
// return 0;
// }
//
// static int convTest() {
//
// float f;
// double d;
// int i;
// long l;
//
// /* int --> long */
// i = 7654;
// l = (long) i;
// if (l != 7654L) { return 1; }
//
// i = -7654;
// l = (long) i;
// if (l != -7654L) { return 2; }
//
// /* long --> int (with truncation) */
// l = 5678956789L;
// i = (int) l;
// if (i != 1383989493) { return 3; }
//
// l = -5678956789L;
// i = (int) l;
// if (i != -1383989493) { return 4; }
// return 0;
// }
//
// static int charSubTest() {
//
// char char1 = 0x00e9;
// char char2 = 0xffff;
// int i;
//
// /* chars are unsigned-expanded to ints before subtraction */
// i = char1 - char2;
// if (i != 0xffff00ea) { return 1; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000, y=-3)
// */
// static int intOperTest(int x, int y) {
// int[] results = new int[10];
//
// /* this seems to generate "op-int" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
//
// /* this seems to generate "op-int/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
//
// /* check this edge case while we're here (div-int/2addr) */
// int minInt = -2147483648;
// int negOne = -results[5];
// int plusOne = 1;
// int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
//
// if (result != minInt) { return 1;};
// if (results[0] != 69997) { return 2;};
// if (results[1] != 70003) { return 3;};
// if (results[2] != -210000) { return 4;};
// if (results[3] != 605032704) { return 5;};
// if (results[4] != -23333) { return 6;};
// if (results[5] != 1) { return 7;};
// if (results[6] != 70000) { return 8;};
// if (results[7] != -3) { return 9;};
// if (results[8] != -70003) { return 10;};
// if (results[9] != 70000) { return 11;};
//
// return 0;
// }
//
// /*
// * More operations, this time with 16-bit constants. (x=77777)
// */
// static int lit16Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit16" instructions */
// results[0] = x + 1000;
// results[1] = 1000 - x;
// results[2] = x * 1000;
// results[3] = x / 1000;
// results[4] = x % 1000;
// results[5] = x & 1000;
// results[6] = x | -1000;
// results[7] = x ^ -1000;
//
// if (results[0] != 78777) { return 1; }
// if (results[1] != -76777) { return 2; }
// if (results[2] != 77777000) { return 3; }
// if (results[3] != 77) { return 4; }
// if (results[4] != 777) { return 5; }
// if (results[5] != 960) { return 6; }
// if (results[6] != -39) { return 7; }
// if (results[7] != -76855) { return 8; }
// return 0;
// }
//
// /*
// * More operations, this time with 8-bit constants. (x=-55555)
// */
// static int lit8Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit8" instructions */
// results[0] = x + 10;
// results[1] = 10 - x;
// results[2] = x * 10;
// results[3] = x / 10;
// results[4] = x % 10;
// results[5] = x & 10;
// results[6] = x | -10;
// results[7] = x ^ -10;
// int minInt = -2147483648;
// int result = minInt / -1;
// if (result != minInt) {return 1; }
// if (results[0] != -55545) {return 2; }
// if (results[1] != 55565) {return 3; }
// if (results[2] != -555550) {return 4; }
// if (results[3] != -5555) {return 5; }
// if (results[4] != -5) {return 6; }
// if (results[5] != 8) {return 7; }
// if (results[6] != -1) {return 8; }
// if (results[7] != 55563) {return 9; }
// return 0;
// }
//
//
// /*
// * Shift some data. (value=0xff00aa01, dist=8)
// */
// static int intShiftTest(int value, int dist) {
// int results[] = new int[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x00aa0100) {return 1; }
// if (results[1] != 0xffff00aa) {return 2; }
// if (results[2] != 0x00ff00aa) {return 3; }
// if (results[3] != 0xaa00) {return 4; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000000000, y=-3)
// */
// static int longOperTest(long x, long y) {
// long[] results = new long[10];
//
// /* this seems to generate "op-long" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
// /* this seems to generate "op-long/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
// /* check this edge case while we're here (div-long/2addr) */
// long minLong = -9223372036854775808L;
// long negOne = -results[5];
// long plusOne = 1;
// long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
// if (result != minLong) { return 1; }
// if (results[0] != 69999999997L) { return 2; }
// if (results[1] != 70000000003L) { return 3; }
// if (results[2] != -210000000000L) { return 4; }
// if (results[3] != -6833923606740729856L) { return 5; } // overflow
// if (results[4] != -23333333333L) { return 6; }
// if (results[5] != 1) { return 7; }
// if (results[6] != 70000000000L) { return 8; }
// if (results[7] != -3) { return 9; }
// if (results[8] != -70000000003L) { return 10; }
// if (results[9] != 70000000000L) { return 11; }
// if (results.length != 10) { return 12; }
// return 0;
// }
//
// /*
// * Shift some data. (value=0xd5aa96deff00aa01, dist=16)
// */
// static long longShiftTest(long value, int dist) {
// long results[] = new long[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x96deff00aa010000L) { return results[0]; }
// if (results[1] != 0xffffd5aa96deff00L) { return results[1]; }
// if (results[2] != 0x0000d5aa96deff00L) { return results[2]; }
// if (results[3] != 0xffff96deff000000L) { return results[3]; }
// if (results.length != 4) { return 5; }
//
// return results[0]; // test return-long
// }
//
// static int switchTest(int a) {
// int res = 1234;
//
// switch (a) {
// case -1: res = 1; return res;
// case 0: res = 2; return res;
// case 1: /*correct*/ break;
// case 2: res = 3; return res;
// case 3: res = 4; return res;
// case 4: res = 5; return res;
// default: res = 6; return res;
// }
// switch (a) {
// case 3: res = 7; return res;
// case 4: res = 8; return res;
// default: /*correct*/ break;
// }
//
// a = 0x12345678;
//
// switch (a) {
// case 0x12345678: /*correct*/ break;
// case 0x12345679: res = 9; return res;
// default: res = 1; return res;
// }
// switch (a) {
// case 57: res = 10; return res;
// case -6: res = 11; return res;
// case 0x12345678: /*correct*/ break;
// case 22: res = 12; return res;
// case 3: res = 13; return res;
// default: res = 14; return res;
// }
// switch (a) {
// case -6: res = 15; return res;
// case 3: res = 16; return res;
// default: /*correct*/ break;
// }
//
// a = -5;
// switch (a) {
// case 12: res = 17; return res;
// case -5: /*correct*/ break;
// case 0: res = 18; return res;
// default: res = 19; return res;
// }
//
// switch (a) {
// default: /*correct*/ break;
// }
// return res;
// }
// /*
// * Test the integer comparisons in various ways.
// */
// static int testIntCompare(int minus, int plus, int plus2, int zero) {
// int res = 1111;
//
// if (minus > plus)
// return 1;
// if (minus >= plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus <= minus)
// return 4;
// if (plus == minus)
// return 5;
// if (plus != plus2)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// if (minus > 0)
// return 8;
// if (minus >= 0)
// return 9;
// if (plus < 0)
// return 10;
// if (plus <= 0)
// return 11;
// if (plus == 0)
// return 12;
// if (zero != 0)
// return 13;
//
// if (zero == 0) {
// res = res;
// } else {
// return 14;
// }
// return res;
// }
//
// /*
// * Test cmp-long.
// *
// * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
// */
// static int testLongCompare(long minus, long alsoMinus, long plus,
// long alsoPlus) {
// int res = 2222;
//
// if (minus > plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus == minus)
// return 4;
//
// if (plus >= plus+1)
// return 5;
// if (minus >= minus+1)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// /* compare when high words are equal but low words differ */
// if (plus > alsoPlus)
// return 8;
// if (alsoPlus < plus)
// return 9;
// if (alsoPlus == plus)
// return 10;
//
// /* high words are equal, low words have apparently different signs */
// if (minus < alsoMinus) // bug!
// return 11;
// if (alsoMinus > minus)
// return 12;
// if (alsoMinus == minus)
// return 13;
//
// return res;
// }
//
// /*
// * Test cmpl-float and cmpg-float.
// */
// static int testFloatCompare(float minus, float plus, float plus2,
// float nan) {
//
// int res = 3333;
// if (minus > plus)
// res = 1;
// if (plus < minus)
// res = 2;
// if (plus == minus)
// res = 3;
// if (plus != plus2)
// res = 4;
//
// if (plus <= nan)
// res = 5;
// if (plus >= nan)
// res = 6;
// if (minus <= nan)
// res = 7;
// if (minus >= nan)
// res = 8;
// if (nan >= plus)
// res = 9;
// if (nan <= plus)
// res = 10;
//
// if (nan == nan)
// res = 1212;
//
// return res;
// }
//
// static int testDoubleCompare(double minus, double plus, double plus2,
// double nan) {
//
// int res = 4444;
//
// if (minus > plus)
// return 1;
// if (plus < minus)
// return 2;
// if (plus == minus)
// return 3;
// if (plus != plus2)
// return 4;
//
// if (plus <= nan)
// return 5;
// if (plus >= nan)
// return 6;
// if (minus <= nan)
// return 7;
// if (minus >= nan)
// return 8;
// if (nan >= plus)
// return 9;
// if (nan <= plus)
// return 10;
//
// if (nan == nan)
// return 11;
// return res;
// }
//
// static int fibonacci(int n) {
// if (n == 0) {
// return 0;
// } else if (n == 1) {
// return 1;
// } else {
// return fibonacci(n - 1) + fibonacci(n - 2);
// }
// }
//
///*
// static void throwNullPointerException() {
// throw new NullPointerException("first throw");
// }
//
// static int throwAndCatch() {
// try {
// throwNullPointerException();
// return 1;
// } catch (NullPointerException npe) {
// return 0;
// }
// }
//*/
//
// static int manyArgs(int a0, long a1, int a2, long a3, int a4, long a5,
// int a6, int a7, double a8, float a9, double a10, short a11, int a12,
// char a13, int a14, int a15, byte a16, boolean a17, int a18, int a19,
// long a20, long a21, int a22, int a23, int a24, int a25, int a26)
// {
// if (a0 != 0) return 0;
// if (a1 != 1L) return 1;
// if (a2 != 2) return 2;
// if (a3 != 3L) return 3;
// if (a4 != 4) return 4;
// if (a5 != 5L) return 5;
// if (a6 != 6) return 6;
// if (a7 != 7) return 7;
// if (a8 != 8.0) return 8;
// if (a9 != 9.0f) return 9;
// if (a10 != 10.0) return 10;
// if (a11 != (short)11) return 11;
// if (a12 != 12) return 12;
// if (a13 != (char)13) return 13;
// if (a14 != 14) return 14;
// if (a15 != 15) return 15;
// if (a16 != (byte)-16) return 16;
// if (a17 != true) return 17;
// if (a18 != 18) return 18;
// if (a19 != 19) return 19;
// if (a20 != 20L) return 20;
// if (a21 != 21L) return 21;
// if (a22 != 22) return 22;
// if (a23 != 23) return 23;
// if (a24 != 24) return 24;
// if (a25 != 25) return 25;
// if (a26 != 26) return 26;
// return -1;
// }
//
// int virtualCall(int a)
// {
// return a * 2;
// }
//
// void setFoo(int a)
// {
// foo_ = a;
// }
//
// int getFoo()
// {
// return foo_;
// }
//
// static int staticCall(int a)
// {
// IntMath foo = new IntMath();
// return foo.virtualCall(a);
// }
//
// static int testIGetPut(int a)
// {
// IntMath foo = new IntMath(99);
// IntMath foo123 = new IntMath();
// int z = foo.getFoo();
// z += a;
// z += foo123.getFoo();
// foo.setFoo(z);
// return foo.getFoo();
// }
//
// public static void main(String[] args) {
// int res = unopTest(38);
// if (res == 37) {
// System.out.printf("unopTest PASSED\n");
// } else {
// System.out.printf("unopTest FAILED: %d\n", res);
// }
// res = shiftTest1();
// if (res == 0) {
// System.out.printf("shiftTest1 PASSED\n");
// } else {
// System.out.printf("shiftTest1 FAILED: %d\n", res);
// }
// res = shiftTest2();
// if (res == 0) {
// System.out.printf("shiftTest2 PASSED\n");
// } else {
// System.out.printf("shiftTest2 FAILED: %d\n", res);
// }
// res = unsignedShiftTest();
// if (res == 0) {
// System.out.printf("unsignedShiftTest PASSED\n");
// } else {
// System.out.printf("unsignedShiftTest FAILED: %d\n", res);
// }
// res = convTest();
// if (res == 0) {
// System.out.printf("convTest PASSED\n");
// } else {
// System.out.printf("convTest FAILED: %d\n", res);
// }
// res = charSubTest();
// if (res == 0) {
// System.out.printf("charSubTest PASSED\n");
// } else {
// System.out.printf("charSubTest FAILED: %d\n", res);
// }
// res = intOperTest(70000, -3);
// if (res == 0) {
// System.out.printf("intOperTest PASSED\n");
// } else {
// System.out.printf("intOperTest FAILED: %d\n", res);
// }
// res = longOperTest(70000000000L, -3L);
// if (res == 0) {
// System.out.printf("longOperTest PASSED\n");
// } else {
// System.out.printf("longOperTest FAILED: %d\n", res);
// }
// long lres = longShiftTest(0xd5aa96deff00aa01L, 16);
// if (lres == 0x96deff00aa010000L) {
// System.out.printf("longShiftTest PASSED\n");
// } else {
// System.out.printf("longShiftTest FAILED: %d\n", res);
// }
//
// res = switchTest(1);
// if (res == 1234) {
// System.out.printf("switchTest PASSED\n");
// } else {
// System.out.printf("switchTest FAILED: %d\n", res);
// }
//
// res = testIntCompare(-5, 4, 4, 0);
// if (res == 1111) {
// System.out.printf("testIntCompare PASSED\n");
// } else {
// System.out.printf("testIntCompare FAILED: %d\n", res);
// }
//
// res = testLongCompare(-5L, -4294967287L, 4L, 8L);
// if (res == 2222) {
// System.out.printf("testLongCompare PASSED\n");
// } else {
// System.out.printf("testLongCompare FAILED: %d\n", res);
// }
//
// res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
// if (res == 3333) {
// System.out.printf("testFloatCompare PASSED\n");
// } else {
// System.out.printf("testFloatCompare FAILED: %d\n", res);
// }
//
// res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
// if (res == 4444) {
// System.out.printf("testDoubleCompare PASSED\n");
// } else {
// System.out.printf("testDoubleCompare FAILED: %d\n", res);
// }
//
// res = fibonacci(10);
// if (res == 55) {
// System.out.printf("fibonacci PASSED\n");
// } else {
// System.out.printf("fibonacci FAILED: %d\n", res);
// }
//
///*
// res = throwAndCatch();
// if (res == 0) {
// System.out.printf("throwAndCatch PASSED\n");
// } else {
// System.out.printf("throwAndCatch FAILED: %d\n", res);
// }
//*/
//
// res = manyArgs(0, 1L, 2, 3L, 4, 5L, 6, 7, 8.0, 9.0f, 10.0,
// (short)11, 12, (char)13, 14, 15, (byte)-16, true, 18,
// 19, 20L, 21L, 22, 23, 24, 25, 26);
// if (res == -1) {
// System.out.printf("manyArgs PASSED\n");
// } else {
// System.out.printf("manyArgs FAILED: %d\n", res);
// }
//
// res = staticCall(3);
// if (res == 6) {
// System.out.printf("virtualCall PASSED\n");
// } else {
// System.out.printf("virtualCall FAILED: %d\n", res);
// }
//
// res = testIGetPut(111);
// if (res == 333) {
// System.out.printf("testGetPut PASSED\n");
// } else {
// System.out.printf("testGetPut FAILED: %d\n", res);
// }
// }
//}
static const char kIntMathDex[] =
"ZGV4CjAzNQC7e4Y087eJCugxNYogYY46TkuaUfNBl5W8KgAAcAAAAHhWNBIAAAAAAAAAABwqAACp"
"AAAAcAAAABMAAAAUAwAADwAAAGADAAACAAAAFAQAAB4AAAAkBAAAAgAAABQFAABoJQAAVAUAAKYd"
"AACuHQAAsR0AALQdAAC3HQAAuh0AAL0dAADEHQAAyx0AAM8dAADUHQAA2x0AAPkdAAD+HQAABR4A"
"ABMeAAAWHgAAGx4AAB8eAAAqHgAALx4AAEYeAABbHgAAbx4AAIMeAACXHgAApB4AAKceAACqHgAA"
"rh4AALIeAAC1HgAAuR4AAL0eAADSHgAA5x4AAOoeAADuHgAA8h4AAPceAAD8HgAAAR8AAAYfAAAL"
"HwAAEB8AABUfAAAaHwAAHx8AACQfAAAoHwAALR8AADIfAAA3HwAAPB8AAEEfAABGHwAASx8AAE8f"
"AABTHwAAVx8AAFsfAABfHwAAYx8AAGcfAAByHwAAfB8AAIIfAACFHwAAiB8AAI8fAACWHwAAox8A"
"ALwfAADRHwAA2x8AAPEfAAADIAAABiAAAAwgAAAPIAAAEiAAAB0gAAA0IAAARyAAAEwgAABUIAAA"
"WiAAAF0gAABlIAAAaCAAAGsgAABvIAAAcyAAAIAgAACZIAAAriAAALwgAAC/IAAAyiAAANQgAADi"
"IAAA/CAAABIhAAAhIQAAPCEAAFMhAABZIQAAYSEAAGchAABxIQAAhyEAAJkhAAChIQAAqiEAALEh"
"AAC0IQAAuSEAAMEhAADGIQAAzCEAANMhAADcIQAA5CEAAOkhAADxIQAA+iEAAP0hAAAFIgAAESIA"
"ACkiAAA9IgAASSIAAGEiAAB1IgAAgSIAAIgiAACUIgAArCIAAMAiAADTIgAA8iIAAA0jAAAfIwAA"
"PSMAAFcjAABvIwAAgyMAAJAjAACgIwAAvCMAANQjAADlIwAAAiQAABskAAAhJAAAKyQAAEEkAABT"
"JAAAZiQAAIUkAACgJAAApyQAALAkAAC9JAAA1iQAAOskAADuJAAA8SQAAPQkAAABAAAAAgAAAAMA"
"AAAEAAAABQAAAA8AAAASAAAAFAAAABUAAAAWAAAAFwAAABgAAAAaAAAAGwAAAB4AAAAfAAAAIAAA"
"ACEAAAAiAAAABQAAAAQAAAAAAAAABgAAAAQAAAAMHQAABwAAAAQAAAAYHQAACAAAAAQAAAAkHQAA"
"CQAAAAQAAAAsHQAACgAAAAQAAAA0HQAACwAAAAQAAABAHQAADAAAAAQAAAB8HQAADQAAAAQAAACE"
"HQAAEAAAAAUAAACQHQAAEwAAAAcAAACYHQAAEQAAAAgAAAAkHQAAGwAAAA0AAAAAAAAAHAAAAA0A"
"AAAkHQAAHQAAAA0AAACgHQAABgAEAFUAAAALAAcAdQAAAAYADAAAAAAABgANAAAAAAAGAAAARgAA"
"AAYAAABJAAAABgADAFAAAAAGAAAAVwAAAAYABABcAAAABgAEAF8AAAAGAAMAYQAAAAYAAwBiAAAA"
"BgAHAGMAAAAGAAkAZgAAAAYADgBrAAAABgAGAGwAAAAGAA0AfgAAAAYAAAB/AAAABgAAAIIAAAAG"
"AAMAhQAAAAYAAwCHAAAABgABAIoAAAAGAAIAjQAAAAYAAwCSAAAABgAFAJMAAAAGAAgAlgAAAAYA"
"AwCaAAAABgAAAJ0AAAAGAAMAogAAAAcACgB5AAAACAALAKEAAAAJAAwAAAAAAAkAAAABAAAA////"
"/wAAAAAZAAAAAAAAAJopAAAAAAAABgAAAAAAAAAJAAAAAAAAAA4AAAAAAAAApCkAAAAAAAABAAEA"
"AAAAAPokAAABAAAADgAAAAIAAQABAAAA/yQAAAgAAABwEB0AAQATAHsAWRAAAA4AAgACAAEAAAAG"
"JQAABgAAAHAQHQAAAFkBAAAOAAQAAAAAAAAADyUAABAAAAATAOkAFAH//wAAkQIAARQD6gD//zIy"
"BAASEw8DEgMo/gUAAAAAAAAAJCUAADIAAAATAOYdgQEWA+YdMQMBAzgDBAASEw8DEwAa4oEBFgMa"
"4jEDAQM4AwQAEiMo9RgB9QB+UgEAAACEEBQD9QB+UjIwBAASMyjoGAEL/4Gt/v///4QQFAML/4Gt"
"MjAEABJDKNsSAyjZAwABAAEAAABCJQAAFQAAABIQOQIEABIADwAyAv//2AAC/3EQBAAAAAoA2AEC"
"/nEQBAABAAoBsBAo8AAADgACAAAAAABNJQAAsAAAABI3EiYSCRJYEhUTCgoAI6QPAJAKDA1LCgQJ"
"kQoMDUsKBAWSCgwNSwoEBpIKDAxLCgQHEkqTCwwNSwsECnvalAoMCksKBAgSapULDA1LCwQKEnqW"
"CwwNSwsEChMKCACXCwwNSwsEChMKCQCQCwwNsduy27PbtNu127bbt9uwy0sLBAoVAACARAoECHuh"
"EhIVCgCAsxqTAwoBMgMDAA8FRAoECRQLbREBADK6BAABZSj3RAoEBRQLcxEBADK6BAABdSjuRAYE"
"BhQKsMv8/zKmBAASRSjlRAYEBxQHABEQJDJ2BAABhSjcEkZEBgQGEwfbpDJ2BAASZSjTRAYECDJW"
"BAASdSjNEmVEBQQFFAZwEQEAMmUFABMFCAAowhJ1RAUEBRLWMmUFABMFCQAouRMFCABEBQQFFAaN"
"7v7/MmUFABMFCgAorRMFCQBEBQQFFAZwEQEAMmUFABMFCwAooQGVKJ8KAAIAAAAAAIolAAA/AAAA"
"EkQSMxIiEhESBSNADwCYBggJSwYABZkGCAlLBgABmgYICUsGAAKYBggJuZa6lriWSwYAA0QGAAUU"
"BwABqgAydgMADwFEAQABFAaqAP//MmEEAAEhKPdEAQACFAKqAP8AMiEEAAExKO5EAQADFAIAqgAA"
"MiEEAAFBKOUBUSjjAAAJAAEAAAAAAKElAAB1AAAAEkQSMxIiEhESBRMGCAAjYA8A0IboA0sGAAXR"
"hugDSwYAAdKG6ANLBgAC04boA0sGAAPUhugDSwYABBJW1YfoA0sHAAYSZtaHGPxLBwAGEnbXhxj8"
"SwcABkQGAAUUB7kzAQAydgMADwFEAQABFAYX1P7/MmEEAAEhKPdEAQACFAJoyKIEMiEEAAExKO5E"
"AQADEwJNADIhBAABQSjmRAEABBMCCQMyIQQAElEo3hJRRAEAARMCwAMyIQQAEmEo1RJhRAEAARMC"
"2f8yIQQAEnEozBJxRAEAARQCydP+/zIhBQATAQgAKMEBUSi/AAALAAEAAAAAAMElAAB8AAAAEkYS"
"NRIkEhMSBxMICAAjgg8A2AgKCksIAgfZCAoKSwgCA9oICgpLCAIE2wgKCksIAgXcCAoKSwgCBhJY"
"3QkKCksJAggSaN4JCvZLCQIIEnjfCQr2SwkCCBUAAIDbAQD/MgEDAA8DRAgCBxQJByf//zKYBAAB"
"Qyj3RAMCAxQIDdkAADKDBAABUyjuRAMCBBQE4oX3/zJDBAABYyjlRAMCBRMETeoyQwQAElMo3UQD"
"AgYStDJDBAASYyjWElNEAwIDEwQIADJDBAAScyjNEmNEAwIDEvQyQwUAEwMIACjEEnNEAwIDFAQL"
"2QAAMkMFABMDCQAouQFzKLcRAAQAAAAAAOwlAADuAAAAEwkKACOYEAASCZsKDQ9MCggJEhmcCg0P"
"TAoICRIpnQoND0wKCAkSOZ0KDQ1MCggJEkmeCg0PTAoICRJZffqfCg0KTAoICRJpoAoND0wKCAkS"
"eaEKDQ9MCggJEwkIAKIKDQ9MCggJEwkJAJsKDQ+8+r36vvq/+sD6wfrC+rvaTAoICRkAAIASWUUJ"
"CAl9khYEAQCbCQAEvEm+KZ4GCQIxCQYAOAkEABIZDwkSCUUJCAkYC/07U0wQAAAAMQkJCzgJBAAS"
"KSjyEhlFCQgJGAsDPFNMEAAAADEJCQs4CQQAEjko5BIpRQkICRgLAEwGG8////8xCQkLOAkEABJJ"
"KNYSOUUJCAkYCwAAEPavBimhMQkJCzgJBAASWSjIEklFCQgJGAurljmR+v///zEJCQs4CQQAEmko"
"uhJZRQkICRYLAQAxCQkLOAkEABJ5KK8SaUUJCAkYCwA8U0wQAAAAMQkJCzgJBQATCQgAKKASeUUJ"
"CAkWC/3/MQkJCzgJBQATCQkAKJQTCQgARQkICRgL/cOss+////8xCQkLOAkFABMJCgAohBMJCQBF"
"CQgJGAsAPFNMEAAAADEJCQs4CQYAEwkLACkAdP8hiRMKCgAyqQYAEwkMACkAa/8SCSkAaP8NAAMA"
"AAAAACwmAABbAAAAEkkSOBInEhYSBSOQEACjAQoMTAEABaQBCgxMAQAGpQEKDEwBAAejAQoMxMHF"
"wcPBTAEACEUBAAUYAwAAAaoA/96WMQEBAzgBBQBFAQAFEAFFAQAGGAMA/96WqtX//zEBAQM4AQUA"
"RQEABijyRQEABxgDAP/elqrVAAAxAQEDOAEFAEUBAAco5EUBAAgYAwAAAP/elv//MQEBAzgBBQBF"
"AQAIKNYhATKRBQAWAQUAKNBFAQAFKM0AACcAAQAiAAAARiYAAA4DAAATASYAcRAYAAEACiUTASUA"
"AgAlADMQrgFiAQEAGgKcABIDIzMRAG4wGwAhA3EADwAAAAolOSWxAWIBAQAaAoEAEgMjMxEAbjAb"
"ACEDcQAQAAAACiU5JbQBYgEBABoChAASAyMzEQBuMBsAIQNxABkAAAAKJTkltwFiAQEAGgKfABID"
"IzMRAG4wGwAhA3EAAwAAAAolOSW6AWIBAQAaAksAEgMjMxEAbjAbACEDcQACAAAACiU5Jb0BYgEB"
"ABoCSAASAyMzEQBuMBsAIQMUAXARAQAS0nEgBgAhAAolOSW8AWIBAQAaAl4AEgMjMxEAbjAbACED"
"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"
"EvUUBP///w8SwBLDFAH8/wAAEsKNQI9DjmHiAgIEMlAEABIUDwQyUwQAEiQo/DJhBAASNCj4MkIE"
"ABJEKPQSBCjyAAACAAEAAAAAAIUpAAADAAAAUhAAAA8AAAACAAIAAAAAAIspAAADAAAAWQEAAA4A"
"AAADAAIAAAAAAJMpAAADAAAA2gACAg8AAAAEAAAAAgACAAIAAgAEAAAAAwADAAMAAwABAAAABAAA"
"AAIAAAAEAAQABAAAAAQABAAEAAQAGwAAAAQABQAEAAUABAAFAAQABAACAAMAAgAMAAQAAQAEAAQA"
"AAAOAAQABAAFAAUABAAEAAQABAAEAAAAAgAAAAUABQAEAAAABQAFAAUABQACAAAABQAEAAIAAAAK"
"ABEAAQAAABIABjxpbml0PgABQgABQwABRAABRgABSQAFSUREREQABUlGRkZGAAJJSQADSUlJAAVJ"
"SUlJSQAcSUlKSUpJSklJREZEU0lDSUlCWklJSkpJSUlJSQADSUpKAAVJSkpKSgAMSW50TWF0aC5q"
"YXZhAAFKAANKSkkAAkxJAAlMSW50TWF0aDsAA0xMTAAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABNM"
"amF2YS9sYW5nL0ludGVnZXI7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5n"
"OwASTGphdmEvbGFuZy9TeXN0ZW07AAtPYmplY3QuamF2YQABUwABVgACVkkAAlZMAAFaAAJbSQAC"
"W0oAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsAAWEAAmEwAAJhMQAD"
"YTEwAANhMTEAA2ExMgADYTEzAANhMTQAA2ExNQADYTE2AANhMTcAA2ExOAADYTE5AAJhMgADYTIw"
"AANhMjEAA2EyMgADYTIzAANhMjQAA2EyNQADYTI2AAJhMwACYTQAAmE1AAJhNgACYTcAAmE4AAJh"
"OQAJYWxzb01pbnVzAAhhbHNvUGx1cwAEYXJncwABYgABYwAFY2hhcjEABWNoYXIyAAtjaGFyU3Vi"
"VGVzdAAXY2hhclN1YlRlc3QgRkFJTEVEOiAlZAoAE2NoYXJTdWJUZXN0IFBBU1NFRAoACGNvbnZU"
"ZXN0ABRjb252VGVzdCBGQUlMRUQ6ICVkCgAQY29udlRlc3QgUEFTU0VECgABZAAEZGlzdAABZQAB"
"ZgAJZmlib25hY2NpABVmaWJvbmFjY2kgRkFJTEVEOiAlZAoAEWZpYm9uYWNjaSBQQVNTRUQKAANm"
"b28ABmZvbzEyMwAEZm9vXwABZwAGZ2V0Rm9vAAFoAAFpAAJpMQACaTIAC2ludE9wZXJUZXN0ABdp"
"bnRPcGVyVGVzdCBGQUlMRUQ6ICVkCgATaW50T3BlclRlc3QgUEFTU0VECgAMaW50U2hpZnRUZXN0"
"AAFsAAlsaXQxNlRlc3QACGxpdDhUZXN0AAxsb25nT3BlclRlc3QAGGxvbmdPcGVyVGVzdCBGQUlM"
"RUQ6ICVkCgAUbG9uZ09wZXJUZXN0IFBBU1NFRAoADWxvbmdTaGlmdFRlc3QAGWxvbmdTaGlmdFRl"
"c3QgRkFJTEVEOiAlZAoAFWxvbmdTaGlmdFRlc3QgUEFTU0VECgAEbHJlcwAGbUJ5dGVzAARtYWlu"
"AAhtYW55QXJncwAUbWFueUFyZ3MgRkFJTEVEOiAlZAoAEG1hbnlBcmdzIFBBU1NFRAoABm1pbklu"
"dAAHbWluTG9uZwAFbWludXMAAW4AA25hbgAGbmVnT25lAANvdXQABHBsdXMABXBsdXMyAAdwbHVz"
"T25lAAZwcmludGYAA3JlcwAGcmVzdWx0AAdyZXN1bHRzAAFzAAZzZXRGb28ACnNoaWZ0VGVzdDEA"
"FnNoaWZ0VGVzdDEgRkFJTEVEOiAlZAoAEnNoaWZ0VGVzdDEgUEFTU0VECgAKc2hpZnRUZXN0MgAW"
"c2hpZnRUZXN0MiBGQUlMRUQ6ICVkCgASc2hpZnRUZXN0MiBQQVNTRUQKAApzdGF0aWNDYWxsAAVz"
"dHVmZgAKc3dpdGNoVGVzdAAWc3dpdGNoVGVzdCBGQUlMRUQ6ICVkCgASc3dpdGNoVGVzdCBQQVNT"
"RUQKABF0ZXN0RG91YmxlQ29tcGFyZQAddGVzdERvdWJsZUNvbXBhcmUgRkFJTEVEOiAlZAoAGXRl"
"c3REb3VibGVDb21wYXJlIFBBU1NFRAoAEHRlc3RGbG9hdENvbXBhcmUAHHRlc3RGbG9hdENvbXBh"
"cmUgRkFJTEVEOiAlZAoAGHRlc3RGbG9hdENvbXBhcmUgUEFTU0VECgAWdGVzdEdldFB1dCBGQUlM"
"RUQ6ICVkCgASdGVzdEdldFB1dCBQQVNTRUQKAAt0ZXN0SUdldFB1dAAOdGVzdEludENvbXBhcmUA"
"GnRlc3RJbnRDb21wYXJlIEZBSUxFRDogJWQKABZ0ZXN0SW50Q29tcGFyZSBQQVNTRUQKAA90ZXN0"
"TG9uZ0NvbXBhcmUAG3Rlc3RMb25nQ29tcGFyZSBGQUlMRUQ6ICVkCgAXdGVzdExvbmdDb21wYXJl"
"IFBBU1NFRAoABHRoaXMACHVub3BUZXN0ABR1bm9wVGVzdCBGQUlMRUQ6ICVkCgAQdW5vcFRlc3Qg"
"UEFTU0VECgARdW5zaWduZWRTaGlmdFRlc3QAHXVuc2lnbmVkU2hpZnRUZXN0IEZBSUxFRDogJWQK"
"ABl1bnNpZ25lZFNoaWZ0VGVzdCBQQVNTRUQKAAV2YWx1ZQAHdmFsdWVPZgALdmlydHVhbENhbGwA"
"F3ZpcnR1YWxDYWxsIEZBSUxFRDogJWQKABN2aXJ0dWFsQ2FsbCBQQVNTRUQKAAF4AAF5AAF6AAR6"
"ZXJvAAMABw4ACQAHDjxLAAUBhwEHDjwtAHwABw4tAwBFAj8DAUYCLQMCWgVpAGcABw4tAwBaBR4D"
"AWEGAg53AnQdLR6JWh55Wh54AIoEAXMHHS0hGi8AiwECpgGnAQdZTQMEfRBLS0tLWlpaWmvjLQMA"
"cAU8AwF1BR4DAnkFWwMDfAUCDCwCdR2WlpaWlmm0lsPTAO8BAqEBTgdZLQMAfRBLS0t4exqWlqUA"
"tQEBpgEHWU0DAH0QS0tLS0taWlt/AnkdlpaHh5aWwwDRAQGmAQdZTQMCfRBLS0tLS1paWi0DAHAF"
"LQMBfAU1AngdlpaWh3iWlsMAgAICpgGnAQcOTQMIfRFaWlpaWmlaWmriLQMAcQZLAwJ1Bi0DBHkG"
"aQMGfAYCDFkCdR3h4eHh4bTww/8BEQ+WAKYCAqEBTgdZLQMAfRFLS0t41wJ7HeHh4WoA5gQBQgcO"
"aQMlewVpqEstqEstqEstqEstqEstqIctqLQtqLQDI2oGlqlaaamHaanwaanDaanDaalpaQIOpAE1"
"EVqpWlqpaWmoAoR/HQUjARMUARMUARMUARMUARMUARMUARMUARMUBiMBExUBExUBExUBExUBExUB"
"ExUCEgETDgETFQETFQCnBBslJjE5Ojs8PT4/JygpKissLS4vMDIzNDU2NzgHDgIbOwJmHYdah1qH"
"WlqWlpaWlpaWlpaWpaWlpaWlpaWlABcAB1l9AwRrEAIbhgJmHZaWlpalpaYBEg8DAFsFARUPAwFc"
"BXkDAmEGllrEATgX0gJfLAA9AAcOLQMAJAYtAwJDBi0DBEQGLQMGTQYtAwhPBi0DClAGLQMMVwYu"
"Aw5ZBgEqEQMQfAa0ANYEASQHDloDAFQHALUCASQHDi4DAHsFQgIoLAUAAwF7BQJSHQUBBgABAgUA"
"BgEeBQEGAAECBQAGAR8FAQYAAQIFAAYBHgUBBgABAgUABgEeBQEGAAECBQAGASAFAQYAQT0+AQIF"
"AAYBAnYdBQEGAAECBQAGAR4FAQYAAQMFAAYBJQUBBgABAwUABgEgBQEGAEEBAwUABgECex0FAQYA"
"AQMFAAYBHgUBBgABAwUABgEfBQEGAAEDBQAGAR4FAQYAAQMFAAYBIAUBBgBBHj8BAwUABgECdh0F"
"AQYAAQMFAAYBHgUBBgABAwUABgEjBQEGAAEDBQAGAR8FAQYAAQMFAAYBAQEFAQYAJAUABgECUR0B"
"EBeOiwEWFqsA7AMEcnd4dAcOLgMAewVLAhcdBQACah0GAEstSy1LLkstSy1LLUs8SzxLPUsAzAME"
"cnd4dAcOLQMAewVLHkseSx5LH0seSx5LHkstSy1LLksuANwEASQHDngDAFQHWgMBVQdLAwKoAQUe"
"WjwA7AIEcnd4qQEHDi4DAHsFLQIlHQJcHS0tLS0tLS0tLS8yLTcxLTwtPC08LTwtPUAbAJ4DBHJA"
"d0EHLC4DAHsFSwIiHQJfHUstSy5pLWkvUUsCezsySzxLPks8SzxLTAARAaYBBw4eLQBOAAdoHgMA"
"QwEeAwN+DTwDAUQCHwMCWgUeHh4uPxpLS0sA0QQABw4AzAQBJAcOLQDHBAEkBw4AAAABAB2BgATU"
"CgABGAMAAgCBgAToCgGBgASICwEIpAsBCNQLAQjIDAIIhA0BCPQPAQiEEQEIgBMBCIgVAQj0GAEJ"
"vBoBCOgmAgjIKgEIzC4BCPAvAQiUMAEIhDMBCKQ0AQiwNQEI/DUBCJQ3AQjUOAEI7DgFAMQ5CQDc"
"OQwA9DkAAA0AAAAAAAAAAQAAAAAAAAABAAAAqQAAAHAAAAACAAAAEwAAABQDAAADAAAADwAAAGAD"
"AAAEAAAAAgAAABQEAAAFAAAAHgAAACQEAAAGAAAAAgAAABQFAAABIAAAHAAAAFQFAAABEAAACwAA"
"AAwdAAACIAAAqQAAAKYdAAADIAAAHAAAAPokAAAAIAAAAgAAAJopAAAAEAAAAQAAABwqAAA=";
} // namespace art