From 861988c1aa68e26246bbc3db27f3d76253e30730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20L=C3=BCtke=20Dreimann?= Date: Mon, 22 Aug 2022 12:23:33 +0200 Subject: [PATCH] added linear-algebra benchmarks --- .../hello_gpgpu/{ => benchmark/2mm}/2mm.cc | 14 +- .../src/hello_gpgpu/benchmark/2mm/2mm.cl | 51 ++ .../src/hello_gpgpu/{ => benchmark/2mm}/2mm.h | 2 +- .../{ => benchmark/2mm}/2mm_kernel.h | 0 .../src/hello_gpgpu/benchmark/3mm/3mm.cc | 451 +++++++++++ .../src/hello_gpgpu/benchmark/3mm/3mm.cl | 66 ++ .../src/hello_gpgpu/benchmark/3mm/3mm.h | 79 ++ .../hello_gpgpu/benchmark/3mm/3mm_kernel.h | 765 ++++++++++++++++++ .../src/hello_gpgpu/benchmark/atax/atax.cc | 358 ++++++++ .../src/hello_gpgpu/benchmark/atax/atax.cl | 46 ++ .../src/hello_gpgpu/benchmark/atax/atax.h | 61 ++ .../hello_gpgpu/benchmark/atax/atax_kernel.h | 434 ++++++++++ .../hello_gpgpu/benchmark/benchmark_extern.h | 42 + .../src/hello_gpgpu/benchmark/bicg/bicg.cc | 388 +++++++++ .../src/hello_gpgpu/benchmark/bicg/bicg.cl | 54 ++ .../src/hello_gpgpu/benchmark/bicg/bicg.h | 61 ++ .../hello_gpgpu/benchmark/bicg/bicg_kernel.h | 433 ++++++++++ .../hello_gpgpu/benchmark/doitgen/doitgen.cc | 400 +++++++++ .../hello_gpgpu/benchmark/doitgen/doitgen.cl | 46 ++ .../hello_gpgpu/benchmark/doitgen/doitgen.h | 66 ++ .../benchmark/doitgen/doitgen_kernel.h | 496 ++++++++++++ .../src/hello_gpgpu/benchmark/gemm/gemm.cc | 356 ++++++++ .../src/hello_gpgpu/benchmark/gemm/gemm.cl | 36 + .../src/hello_gpgpu/benchmark/gemm/gemm.h | 67 ++ .../hello_gpgpu/benchmark/gemm/gemm_kernel.h | 278 +++++++ .../hello_gpgpu/benchmark/gemver/gemver.cc | 464 +++++++++++ .../hello_gpgpu/benchmark/gemver/gemver.cl | 61 ++ .../src/hello_gpgpu/benchmark/gemver/gemver.h | 63 ++ .../benchmark/gemver/gemver_kernel.h | 741 +++++++++++++++++ .../hello_gpgpu/benchmark/gesummv/gesummv.cc | 348 ++++++++ .../hello_gpgpu/benchmark/gesummv/gesummv.cl | 36 + .../hello_gpgpu/benchmark/gesummv/gesummv.h | 55 ++ .../benchmark/gesummv/gesummv_kernel.h | 306 +++++++ .../src/hello_gpgpu/benchmark/mvt/mvt.cc | 366 +++++++++ .../src/hello_gpgpu/benchmark/mvt/mvt.cl | 47 ++ .../src/hello_gpgpu/benchmark/mvt/mvt.h | 55 ++ .../hello_gpgpu/benchmark/mvt/mvt_kernel.h | 414 ++++++++++ .../src/hello_gpgpu/benchmark/syr2k/syr2k.cc | 367 +++++++++ .../src/hello_gpgpu/benchmark/syr2k/syr2k.cl | 37 + .../src/hello_gpgpu/benchmark/syr2k/syr2k.h | 61 ++ .../benchmark/syr2k/syr2k_kernel.h | 286 +++++++ .../src/hello_gpgpu/benchmark/syrk/syrk.cc | 349 ++++++++ .../src/hello_gpgpu/benchmark/syrk/syrk.cl | 35 + .../src/hello_gpgpu/benchmark/syrk/syrk.h | 61 ++ .../hello_gpgpu/benchmark/syrk/syrk_kernel.h | 247 ++++++ repos/hello_gpgpu/src/hello_gpgpu/main.cc | 16 +- .../hello_gpgpu/src/hello_gpgpu/polybench.cc | 1 + repos/hello_gpgpu/src/hello_gpgpu/polybench.h | 1 + repos/hello_gpgpu/src/hello_gpgpu/target.mk | 4 +- 49 files changed, 9462 insertions(+), 9 deletions(-) rename repos/hello_gpgpu/src/hello_gpgpu/{ => benchmark/2mm}/2mm.cc (98%) create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cl rename repos/hello_gpgpu/src/hello_gpgpu/{ => benchmark/2mm}/2mm.h (98%) rename repos/hello_gpgpu/src/hello_gpgpu/{ => benchmark/2mm}/2mm_kernel.h (100%) create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/benchmark_extern.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k_kernel.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cc create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cl create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.h create mode 100644 repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk_kernel.h diff --git a/repos/hello_gpgpu/src/hello_gpgpu/2mm.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cc similarity index 98% rename from repos/hello_gpgpu/src/hello_gpgpu/2mm.cc rename to repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cc index 96e7390760..c290aa03ae 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/2mm.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cc @@ -19,7 +19,7 @@ #ifdef __APPLE__ #include #else -#include "CL/cl.h" +#include "../../CL/cl.h" #endif #define POLYBENCH_TIME 1 @@ -28,8 +28,8 @@ #define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU #include "2mm.h" -#include "polybench.h" -#include "polybenchUtilFuncts.h" +#include "../../polybench.h" +#include "../../polybenchUtilFuncts.h" //define the error threshold for the results "not matching" #define PERCENT_DIFF_ERROR_THRESHOLD 1.05 @@ -45,6 +45,10 @@ #include "2mm_kernel.h" +namespace ns_2mm { + + + char str_temp[1024]; cl_platform_id platform_id; @@ -415,4 +419,6 @@ int main(int argc, char *argv[]) return 0; } -#include "polybench.cc" \ No newline at end of file +} + +// #include "../../polybench.cc" \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cl new file mode 100644 index 0000000000..011b1015f4 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.cl @@ -0,0 +1,51 @@ +/** + * 2mm.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +/* Can switch DATA_TYPE between float and double */ +typedef float DATA_TYPE; + +__kernel void mm2_kernel1(__global DATA_TYPE *tmp, __global DATA_TYPE *A, __global DATA_TYPE *B, int ni, int nj, int nk, int nl, DATA_TYPE alpha, DATA_TYPE beta) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < ni) && (j < nj)) + { + tmp[i * nj + j] = 0; + int k; + for (k = 0; k < nk; k++) + { + tmp[i * nj + j] += alpha * A[i * nk + k] * B[k * nj + j]; + } + } +} + + +__kernel void mm2_kernel2(__global DATA_TYPE *tmp, __global DATA_TYPE *C, __global DATA_TYPE *D, int ni, int nj, int nk, int nl, DATA_TYPE alpha, DATA_TYPE beta) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < ni) && (j < nl)) + { + D[i * nl + j] *= beta; + int k; + for (k = 0; k < nj; k++) + { + D[i * nl + j] += tmp[i * nj + k] * C[k * nl + j]; + } + } +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/2mm.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.h similarity index 98% rename from repos/hello_gpgpu/src/hello_gpgpu/2mm.h rename to repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.h index 3f80f30cc0..ec1ba82032 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/2mm.h +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm.h @@ -13,7 +13,7 @@ /* Default to STANDARD_DATASET. */ # if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) -# define SMALL_DATASET +# define MINI_DATASET # endif /* Do not define anything if the user manually defines the size. */ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/2mm_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm_kernel.h similarity index 100% rename from repos/hello_gpgpu/src/hello_gpgpu/2mm_kernel.h rename to repos/hello_gpgpu/src/hello_gpgpu/benchmark/2mm/2mm_kernel.h diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cc new file mode 100644 index 0000000000..607fcb6138 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cc @@ -0,0 +1,451 @@ +/** + * 3mm.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + + + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "3mm.h" +#include "../../polybench.h" + + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 10.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +#include "3mm_kernel.h" + +namespace ns_3mm { + +#include "../../polybenchUtilFuncts.h" + + +char str_temp[1024]; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_kernel clKernel3; +cl_command_queue clCommandQue; +cl_program clProgram; +cl_mem a_mem_obj; +cl_mem b_mem_obj; +cl_mem c_mem_obj; +cl_mem d_mem_obj; +cl_mem e_mem_obj; +cl_mem f_mem_obj; +cl_mem g_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + + +void compareResults(int ni, int nl, DATA_TYPE POLYBENCH_2D(G, NI, NL, ni, nl), DATA_TYPE POLYBENCH_2D(G_outputFromGpu, NI, NL, ni, nl)) +{ + int i,j,fail; + fail = 0; + + for (i=0; i < ni; i++) + { + for (j=0; j < nl; j++) + { + if (percentDiff(G[i][j], G_outputFromGpu[i][j]) > PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + } + + // print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("3mm.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + +void init_array(int ni, int nj, int nk, int nl, int nm, DATA_TYPE POLYBENCH_2D(A, NI, NK, ni, nk), DATA_TYPE POLYBENCH_2D(B, NK, NJ, nk, nj), + DATA_TYPE POLYBENCH_2D(C, NJ, NM, nj, nm), DATA_TYPE POLYBENCH_2D(D, NM, NL, nm, nl)) +{ + int i, j; + + for (i = 0; i < ni; i++) + { + for (j = 0; j < nk; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / ni; + } + } + + for (i = 0; i < nk; i++) + { + for (j = 0; j < nj; j++) + { + B[i][j] = ((DATA_TYPE) i*(j+1)) / nj; + } + } + + for (i = 0; i < nj; i++) + { + for (j = 0; j < nm; j++) + { + C[i][j] = ((DATA_TYPE) i*(j+3)) / nl; + } + } + + for (i = 0; i < nm; i++) + { + for (j = 0; j < nl; j++) + { + D[i][j] = ((DATA_TYPE) i*(j+2)) / nk; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(B, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(C, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(D, NI, NJ, ni, nj), + DATA_TYPE POLYBENCH_2D(E, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(F, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(G, NI, NJ, ni, nj)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_ONLY, sizeof(DATA_TYPE) * NI * NK, NULL, &errcode); + b_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_ONLY, sizeof(DATA_TYPE) * NK * NJ, NULL, &errcode); + c_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NJ * NM, NULL, &errcode); + d_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NM * NL, NULL, &errcode); + e_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NJ, NULL, &errcode); + f_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NJ * NL, NULL, &errcode); + g_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NL, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NK, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, b_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NK * NJ, B, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NJ * NM, C, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, d_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NM * NL, D, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, e_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NJ, E, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, f_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NJ * NL, F, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, g_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NL, G, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); + } + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = __3mm_Gen9core_gen_len; + const unsigned char* kernel_bin = __3mm_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernels + clKernel1 = clCreateKernel(clProgram, "mm3_kernel1", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clKernel2 = clCreateKernel(clProgram, "mm3_kernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clKernel3 = clCreateKernel(clProgram, "mm3_kernel3", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clFinish(clCommandQue); +} + +void cl_launch_kernel(int ni, int nj, int nk, int nl, int nm) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NJ) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NI) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&e_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(int), (void *)&ni); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(int), (void *)&nj); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(int), (void *)&nk); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + // Execute the OpenCL kernel + + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clEnqueueBarrier(clCommandQue); + + globalWorkSize[0] = (size_t)ceil(((float)NL) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NJ) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + errcode = clSetKernelArg(clKernel2, 0, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(cl_mem), (void *)&d_mem_obj); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(cl_mem), (void *)&f_mem_obj); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(int), (void *)&nj); + errcode |= clSetKernelArg(clKernel2, 4, sizeof(int), (void *)&nl); + errcode |= clSetKernelArg(clKernel2, 5, sizeof(int), (void *)&nm); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clEnqueueBarrier(clCommandQue); + + globalWorkSize[0] = (size_t)ceil(((float)NL) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NI) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + errcode = clSetKernelArg(clKernel3, 0, sizeof(cl_mem), (void *)&e_mem_obj); + errcode |= clSetKernelArg(clKernel3, 1, sizeof(cl_mem), (void *)&f_mem_obj); + errcode |= clSetKernelArg(clKernel3, 2, sizeof(cl_mem), (void *)&g_mem_obj); + errcode |= clSetKernelArg(clKernel3, 3, sizeof(int), (void *)&ni); + errcode |= clSetKernelArg(clKernel3, 4, sizeof(int), (void *)&nl); + errcode |= clSetKernelArg(clKernel3, 5, sizeof(int), (void *)&nj); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel3, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseKernel(clKernel2); + errcode = clReleaseKernel(clKernel3); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(b_mem_obj); + errcode = clReleaseMemObject(c_mem_obj); + errcode = clReleaseMemObject(d_mem_obj); + errcode = clReleaseMemObject(e_mem_obj); + errcode = clReleaseMemObject(f_mem_obj); + errcode = clReleaseMemObject(g_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +/* Main computational kernel on CPU */ +void mm3_cpu(int ni, int nj, int nk, int nl, int nm, + DATA_TYPE POLYBENCH_2D(E,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), + DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), + DATA_TYPE POLYBENCH_2D(F,NJ,NL,nj,nl), + DATA_TYPE POLYBENCH_2D(C,NJ,NM,nj,nm), + DATA_TYPE POLYBENCH_2D(D,NM,NL,nm,nl), + DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl)) +{ + int i, j, k; + + /* E := A*B */ + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NJ; j++) + { + E[i][j] = 0; + for (k = 0; k < _PB_NK; ++k) + { + E[i][j] += A[i][k] * B[k][j]; + } + } + } + + /* F := C*D */ + for (i = 0; i < _PB_NJ; i++) + { + for (j = 0; j < _PB_NL; j++) + { + F[i][j] = 0; + for (k = 0; k < _PB_NM; ++k) + { + F[i][j] += C[i][k] * D[k][j]; + } + } + } + + /* G := E*F */ + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NL; j++) + { + G[i][j] = 0; + for (k = 0; k < _PB_NJ; ++k) + { + G[i][j] += E[i][k] * F[k][j]; + } + } + } +} + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int ni, int nl, + DATA_TYPE POLYBENCH_2D(G,NI,NL,ni,nl)) +{ + int i, j; + + for (i = 0; i < ni; i++) + for (j = 0; j < nl; j++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, G[i][j]); + if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + int ni = NI; + int nj = NJ; + int nk = NK; + int nl = NL; + int nm = NM; + + /* Variable declaration/allocation. */ + POLYBENCH_2D_ARRAY_DECL(E, DATA_TYPE, NI, NJ, ni, nj); + POLYBENCH_2D_ARRAY_DECL(A, DATA_TYPE, NI, NK, ni, nk); + POLYBENCH_2D_ARRAY_DECL(B, DATA_TYPE, NK, NJ, nk, nj); + POLYBENCH_2D_ARRAY_DECL(F, DATA_TYPE, NJ, NL, nj, nl); + POLYBENCH_2D_ARRAY_DECL(C, DATA_TYPE, NJ, NM, nj, nm); + POLYBENCH_2D_ARRAY_DECL(D, DATA_TYPE, NM, NL, nm, nl); + POLYBENCH_2D_ARRAY_DECL(G, DATA_TYPE, NI, NL, ni, nl); + POLYBENCH_2D_ARRAY_DECL(G_outputFromGpu, DATA_TYPE, NI, NL, ni, nl); + + init_array(ni, nj, nk, nl, nm, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(D)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(D), POLYBENCH_ARRAY(E), POLYBENCH_ARRAY(F), POLYBENCH_ARRAY(G)); + cl_load_prog(); + + cl_launch_kernel(ni, nj, nk, nl, nm); + + errcode = clEnqueueReadBuffer(clCommandQue, g_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NL, POLYBENCH_ARRAY(G_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + mm3_cpu(ni, nj, nk, nl, nm, POLYBENCH_ARRAY(E), POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(F), POLYBENCH_ARRAY(C), + POLYBENCH_ARRAY(D), POLYBENCH_ARRAY(G)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(ni, nl, POLYBENCH_ARRAY(G), POLYBENCH_ARRAY(G_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(ni, nl, POLYBENCH_ARRAY(G_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(B); + POLYBENCH_FREE_ARRAY(C); + POLYBENCH_FREE_ARRAY(D); + POLYBENCH_FREE_ARRAY(E); + POLYBENCH_FREE_ARRAY(F); + POLYBENCH_FREE_ARRAY(G); + POLYBENCH_FREE_ARRAY(G_outputFromGpu); + + return 0; +} + +}; + +//#include "../../polybench.cc" + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cl new file mode 100644 index 0000000000..1378dbcca3 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.cl @@ -0,0 +1,66 @@ +/** + * 3mm.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + +__kernel void mm3_kernel1(__global DATA_TYPE *A, __global DATA_TYPE *B, __global DATA_TYPE *E, int ni, int nj, int nk) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < ni) && (j < nj)) + { + int k; + E[i*nj + j] = 0; + for(k=0; k < nk; k++) + { + E[i * nj + j] += A[i * nk + k] * B[k * nj + j]; + } + } +} + +__kernel void mm3_kernel2(__global DATA_TYPE *C, __global DATA_TYPE *D, __global DATA_TYPE *F, int nj, int nl, int nm) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < nj) && (j < nl)) + { + int k; + F[i*nl + j] = 0; + for(k=0; k < nm; k++) + { + F[i * nl + j] += C[i * nm + k] * D[k * nl +j]; + } + } + +} + +__kernel void mm3_kernel3(__global DATA_TYPE *E, __global DATA_TYPE *F, __global DATA_TYPE *G, int ni, int nl, int nj) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < ni) && (j < nl)) + { + int k; + G[i*nl + j] = 0; + for(k=0; k < nj; k++) + { + G[i * nl + j] += E[i * nj + k] * F[k * nl + j]; + } + } +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.h new file mode 100644 index 0000000000..30355eb632 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm.h @@ -0,0 +1,79 @@ +/** + * 3mm.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef THREEMM_H +# define THREEMM_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NI) && !defined(NJ) && !defined(NK) && !defined(NL) && !defined(NM) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +# define NI 128 +# define NJ 128 +# define NK 128 +# define NL 128 +# define NM 128 +# endif + +# ifdef SMALL_DATASET +# define NI 256 +# define NJ 256 +# define NK 256 +# define NL 256 +# define NM 256 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +# define NI 512 +# define NJ 512 +# define NK 512 +# define NL 512 +# define NM 512 +# endif + +# ifdef LARGE_DATASET +# define NI 1024 +# define NJ 1024 +# define NK 1024 +# define NL 1024 +# define NM 1024 +# endif + +# ifdef EXTRALARGE_DATASET +# define NI 2048 +# define NJ 2048 +# define NK 2048 +# define NL 2048 +# define NM 2048 +# endif +# endif /* !N */ + +# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni) +# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj) +# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk) +# define _PB_NL POLYBENCH_LOOP_BOUND(NL,nl) +# define _PB_NM POLYBENCH_LOOP_BOUND(NM,nm) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !THREEMM*/ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm_kernel.h new file mode 100644 index 0000000000..9e2c5ec15f --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/3mm/3mm_kernel.h @@ -0,0 +1,765 @@ +unsigned char __3mm_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x04, 0x79, 0xec, 0x42, 0x04, 0x95, 0x9b, + 0xc7, 0x93, 0x3f, 0x26, 0x0c, 0x00, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x6d, 0x6d, 0x33, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x30, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0x34, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, 0xc0, 0x01, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0c, 0x0a, 0x07, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x00, 0x02, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x80, 0x01, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0x20, 0x2d, 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x40, 0x24, 0xc4, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xc0, 0x0e, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0x40, 0x04, 0xb1, 0x12, 0x20, 0x0d, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x88, 0x02, 0x00, 0x00, + 0x88, 0x02, 0x00, 0x00, 0x41, 0x96, 0x79, 0x20, 0x07, 0x74, 0x76, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0x40, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x74, 0x74, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x20, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x40, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xa0, 0x01, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, 0x07, 0x70, 0x76, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc8, 0x2f, + 0xc4, 0x0f, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x1a, 0x70, 0x7e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0xc0, 0x02, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x2f, 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x96, 0x19, 0x20, 0xe0, 0x20, 0x7e, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0xc8, 0x0f, 0x00, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x23, 0x40, 0x03, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0x80, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x24, 0x00, 0x04, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x1a, 0x1a, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, 0x80, 0x0d, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x20, 0x20, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x23, + 0x40, 0x03, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x10, 0x17, 0x17, 0x25, + 0x00, 0x00, 0x7e, 0x09, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2c, + 0x00, 0x04, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x23, 0x80, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0x40, 0x0d, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc4, 0x0f, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x5b, 0xe2, 0x06, 0x20, + 0x00, 0x70, 0x73, 0xce, 0x5b, 0x83, 0x01, 0x20, 0x00, 0xc0, 0x78, 0xca, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x06, 0x00, 0x82, 0x0e, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0x80, 0x01, 0x00, + 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0xa8, 0xfe, 0xff, 0xff, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x69, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6b, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x95, 0x57, 0x8d, 0x25, 0x42, 0x04, 0x95, 0x9b, + 0xc7, 0x93, 0x3f, 0x26, 0x0c, 0x00, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x6d, 0x6d, 0x33, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x32, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x30, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0x34, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, 0xc0, 0x01, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0c, 0x0a, 0x07, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x00, 0x02, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x80, 0x01, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0x20, 0x2d, 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x40, 0x24, 0xc4, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xc0, 0x0e, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0x40, 0x04, 0xb1, 0x12, 0x20, 0x0d, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x88, 0x02, 0x00, 0x00, + 0x88, 0x02, 0x00, 0x00, 0x41, 0x96, 0x79, 0x20, 0x07, 0x74, 0x76, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0x40, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x74, 0x74, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x20, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x40, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xa0, 0x01, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, 0x07, 0x70, 0x76, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc8, 0x2f, + 0xc4, 0x0f, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x1a, 0x70, 0x7e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0xc0, 0x02, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x2f, 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x96, 0x19, 0x20, 0xe0, 0x20, 0x7e, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0xc8, 0x0f, 0x00, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x23, 0x40, 0x03, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0x80, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x24, 0x00, 0x04, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x1a, 0x1a, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, 0x80, 0x0d, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x20, 0x20, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x23, + 0x40, 0x03, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x10, 0x17, 0x17, 0x25, + 0x00, 0x00, 0x7e, 0x09, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2c, + 0x00, 0x04, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x23, 0x80, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0x40, 0x0d, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc4, 0x0f, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x5b, 0xe2, 0x06, 0x20, + 0x00, 0x70, 0x73, 0xce, 0x5b, 0x83, 0x01, 0x20, 0x00, 0xc0, 0x78, 0xca, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x06, 0x00, 0x82, 0x0e, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0x80, 0x01, 0x00, + 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0xa8, 0xfe, 0xff, 0xff, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6c, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6d, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x3e, 0xfc, 0xaa, 0x42, 0x04, 0x95, 0x9b, + 0xc7, 0x93, 0x3f, 0x26, 0x0c, 0x00, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x6d, 0x6d, 0x33, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x33, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x30, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0x34, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, 0xc0, 0x01, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0c, 0x0a, 0x07, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x00, 0x02, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x80, 0x01, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0x20, 0x2d, 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x40, 0x24, 0xc4, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xc0, 0x0e, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0x40, 0x04, 0xb1, 0x12, 0x20, 0x0d, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x88, 0x02, 0x00, 0x00, + 0x88, 0x02, 0x00, 0x00, 0x41, 0x96, 0x79, 0x20, 0x07, 0x74, 0x76, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0x40, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x74, 0x74, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x20, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x40, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xa0, 0x01, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, 0x07, 0x70, 0x76, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x2d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc8, 0x2f, + 0xc4, 0x0f, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x1a, 0x70, 0x7e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0xc0, 0x02, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x2f, 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x96, 0x19, 0x20, 0xe0, 0x20, 0x7e, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0xc8, 0x0f, 0x00, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x23, 0x40, 0x03, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0x80, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x24, 0x00, 0x04, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x1a, 0x1a, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, 0x80, 0x0d, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x20, 0x20, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x23, + 0x40, 0x03, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x10, 0x17, 0x17, 0x25, + 0x00, 0x00, 0x7e, 0x09, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2c, + 0x00, 0x04, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x23, 0x80, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0x40, 0x0d, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc4, 0x0f, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x5b, 0xe2, 0x06, 0x20, + 0x00, 0x70, 0x73, 0xce, 0x5b, 0x83, 0x01, 0x20, 0x00, 0xc0, 0x78, 0xca, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x06, 0x00, 0x82, 0x0e, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0x80, 0x01, 0x00, + 0x42, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0xa8, 0xfe, 0xff, 0xff, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x69, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6c, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int __3mm_Gen9core_gen_len = 9136; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cc new file mode 100644 index 0000000000..5cd8ab183c --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cc @@ -0,0 +1,358 @@ +/** + * atax.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "atax.h" +#include "../../polybench.h" + + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#ifndef M_PI +#define M_PI 3.14159 +#endif + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +#include "atax_kernel.h" + +namespace ns_atax { + +#include "../../polybenchUtilFuncts.h" + +char str_temp[1024]; + + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_command_queue clCommandQue; +cl_program clProgram; +cl_mem a_mem_obj; +cl_mem x_mem_obj; +cl_mem y_mem_obj; +cl_mem tmp_mem_obj; +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int ny, DATA_TYPE POLYBENCH_1D(z,NY,ny), DATA_TYPE POLYBENCH_1D(z_outputFromGpu,NY,ny)) +{ + int i, fail; + fail = 0; + + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + // print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("atax.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init_array(int nx, int ny, DATA_TYPE POLYBENCH_1D(x,NX,nx), DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny)) +{ + int i, j; + + for (i = 0; i < nx; i++) + { + x[i] = i * M_PI; + for (j = 0; j < ny; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / NX; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny), DATA_TYPE POLYBENCH_1D(x,NY,ny), DATA_TYPE POLYBENCH_1D(y,NY,ny), DATA_TYPE POLYBENCH_1D(tmp,NX,nx)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX * NY, NULL, &errcode); + x_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NY, NULL, &errcode); + y_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NY, NULL, &errcode); + tmp_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX * NY, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, x_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NY, x, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, y_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NY, y, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, tmp_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX, tmp, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = atax_Gen9core_gen_len; + const unsigned char* kernel_bin = atax_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the 1st OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "atax_kernel1", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + + // Create the 2nd OpenCL kernel + clKernel2 = clCreateKernel(clProgram, "atax_kernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int nx, int ny) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NX) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = 1; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&x_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&tmp_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(int), (void *)&nx); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(int), (void *)&ny); + if(errcode != CL_SUCCESS) printf("Error in setting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clEnqueueBarrier(clCommandQue); + + globalWorkSize[0] = (size_t)ceil(((float)NY) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = 1; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel2, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(cl_mem), (void *)&y_mem_obj); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(cl_mem), (void *)&tmp_mem_obj); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(int), (void *)&nx); + errcode |= clSetKernelArg(clKernel2, 4, sizeof(int), (void *)&ny); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseKernel(clKernel2); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(x_mem_obj); + errcode = clReleaseMemObject(y_mem_obj); + errcode = clReleaseMemObject(tmp_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void atax_cpu(int nx, int ny, DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny), DATA_TYPE POLYBENCH_1D(x,NY,ny), DATA_TYPE POLYBENCH_1D(y,NY,ny), + DATA_TYPE POLYBENCH_1D(tmp,NX,nx)) +{ + int i,j; + + for (i= 0; i < _PB_NY; i++) + { + y[i] = 0; + } + + for (i = 0; i < _PB_NX; i++) + { + tmp[i] = 0; + + for (j = 0; j < _PB_NY; j++) + { + tmp[i] = tmp[i] + A[i][j] * x[j]; + } + + for (j = 0; j < _PB_NY; j++) + { + y[j] = y[j] + A[i][j] * tmp[i]; + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int nx, DATA_TYPE POLYBENCH_1D(y,NX,nx)) +{ + int i; + + for (i = 0; i < nx; i++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, y[i]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + int nx = NX; + int ny = NY; + + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NX,NY,nx,ny); + POLYBENCH_1D_ARRAY_DECL(x,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(y,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(y_outputFromGpu,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(tmp,DATA_TYPE,NX,nx); + + init_array(nx, ny, POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(A)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(tmp)); + cl_load_prog(); + + cl_launch_kernel(nx, ny); + + errcode = clEnqueueReadBuffer(clCommandQue, y_mem_obj, CL_TRUE, 0, NY*sizeof(DATA_TYPE), POLYBENCH_ARRAY(y_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + atax_cpu(nx, ny, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(tmp)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(ny, POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(y_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(ny, POLYBENCH_ARRAY(y_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(x); + POLYBENCH_FREE_ARRAY(y); + POLYBENCH_FREE_ARRAY(y_outputFromGpu); + POLYBENCH_FREE_ARRAY(tmp); + + return 0; +} + +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cl new file mode 100644 index 0000000000..29f3b3d0ae --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.cl @@ -0,0 +1,46 @@ +/** + * atax.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + +__kernel void atax_kernel1(__global DATA_TYPE *A, __global DATA_TYPE *x, __global DATA_TYPE *tmp, int nx, int ny) { + + int i = get_global_id(0); + + if (i < nx) + { + int j; + for(j=0; j < ny; j++) + { + tmp[i] += A[i * ny + j] * x[j]; + } + } +} + +__kernel void atax_kernel2(__global DATA_TYPE *A, __global DATA_TYPE *y, __global DATA_TYPE *tmp, int nx, int ny) { + + int j = get_global_id(0); + + if (j < ny) + { + int i; + for(i=0; i < nx; i++) + { + y[j] += A[i * ny + j] * tmp[i]; + } + } +} + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.h new file mode 100644 index 0000000000..1b9797a461 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax.h @@ -0,0 +1,61 @@ +/** + * atax.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef ATAX_H +# define ATAX_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NX) && !defined(NY) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define NX 1024 +#define NY 1024 +# endif + +# ifdef SMALL_DATASET +#define NX 2048 +#define NY 2048 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define NX 4096 +#define NY 4096 +# endif + +# ifdef LARGE_DATASET +#define NX 8192 +#define NY 8192 +# endif + +# ifdef EXTRALARGE_DATASET +#define NX 16384 +#define NY 16384 +# endif +# endif /* !N */ + +# define _PB_NX POLYBENCH_LOOP_BOUND(NX,nx) +# define _PB_NY POLYBENCH_LOOP_BOUND(NY,ny) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !ATAX*/ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax_kernel.h new file mode 100644 index 0000000000..41ec9684a0 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/atax/atax_kernel.h @@ -0,0 +1,434 @@ +unsigned char atax_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xcc, 0x1d, 0x53, 0x51, 0x8d, 0x3d, 0x0f, + 0x7e, 0xfe, 0x63, 0xb6, 0x10, 0x00, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, + 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x61, 0x74, 0x61, 0x78, + 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x28, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x1c, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x03, + 0x26, 0x0a, 0x00, 0x20, 0x1c, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, + 0x40, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, + 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0xa0, 0x22, 0xc4, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x40, 0x01, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x4a, 0x12, 0x20, 0x2e, 0xc4, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x20, 0x80, 0x02, 0x42, 0x12, 0x00, 0x20, 0x20, 0x0e, 0xb1, 0x12, + 0xa0, 0x02, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, + 0x88, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x21, 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x2e, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x41, 0x96, 0x79, 0x20, 0x07, 0x0c, 0x0a, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x0e, 0x0e, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x2e, 0xc0, 0x0e, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0x00, 0x22, 0xc0, 0x01, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x2e, 0xc0, 0x0e, 0x00, 0x06, + 0x02, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x01, 0x20, 0x07, 0x72, 0x0c, 0x06, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x00, 0x0f, 0x8d, 0x0a, + 0xc0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x21, + 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x0a, + 0x0c, 0x02, 0x80, 0x22, 0x00, 0x01, 0x00, 0x06, 0x01, 0x08, 0x11, 0x02, + 0x10, 0x17, 0x7b, 0x25, 0x00, 0x00, 0x06, 0x08, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x72, 0x72, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, + 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2d, 0x40, 0x0e, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2d, + 0x40, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x5b, 0x02, 0x01, 0x20, + 0x02, 0x80, 0xbc, 0x29, 0x5b, 0x43, 0x07, 0x20, 0x02, 0xa0, 0xb7, 0x29, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0x00, 0x01, 0x00, 0xc2, 0x01, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0x40, 0x07, 0x00, + 0xc2, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0x08, 0xff, 0xff, 0xff, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x03, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x6d, 0x70, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x78, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x79, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x8e, 0xdb, 0x2d, 0x51, 0x8d, 0x3d, 0x0f, + 0x7e, 0xfe, 0x63, 0xb6, 0x10, 0x00, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, + 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x61, 0x74, 0x61, 0x78, + 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x28, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc8, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x03, + 0x26, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, + 0x40, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, + 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0x60, 0x22, 0xc8, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x40, 0x01, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x4a, 0x12, 0x60, 0x2e, 0xc8, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x20, 0x80, 0x02, 0x42, 0x12, 0x00, 0x20, 0x60, 0x0e, 0xb1, 0x12, + 0x60, 0x02, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, + 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x21, 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x0c, 0x0c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x00, 0x0f, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x21, 0x80, 0x01, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x2e, 0x00, 0x0f, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc0, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x96, 0x15, 0x20, 0xe0, 0x10, 0x7e, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0xc4, 0x0f, 0x00, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0x40, 0x22, + 0x00, 0x01, 0x00, 0x06, 0x02, 0x08, 0x11, 0x02, 0x10, 0x17, 0x77, 0x25, + 0x00, 0x00, 0x06, 0x08, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, + 0x00, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x10, 0x10, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2e, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x2d, 0x80, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x5b, 0xe2, 0x00, 0x20, 0x02, 0x70, 0xc4, 0x25, 0x5b, 0x63, 0x07, 0x20, + 0x02, 0xb0, 0xbf, 0x25, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x00, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x60, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xf8, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x6d, 0x70, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x78, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x79, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int atax_Gen9core_gen_len = 5164; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/benchmark_extern.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/benchmark_extern.h new file mode 100644 index 0000000000..7001fa3597 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/benchmark_extern.h @@ -0,0 +1,42 @@ + + + +namespace ns_2mm{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_3mm{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_atax{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_bicg{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_doitgen{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_gemm{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + + +namespace ns_gemver{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_gesummv{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_mvt{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_syr2k{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + +namespace ns_syrk{int main(int argc, char *argv[]);}; +extern int main(int argc, char *argv[]); + + + + + + \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cc new file mode 100644 index 0000000000..f8f9fdc704 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cc @@ -0,0 +1,388 @@ +/** + * bicg.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "bicg.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#ifndef M_PI +#define M_PI 3.14159 +#endif + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_bicg { + +#include "../../polybenchUtilFuncts.h" + +#include "bicg_kernel.h" + +char str_temp[1024]; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem r_mem_obj; +cl_mem p_mem_obj; +cl_mem q_mem_obj; +cl_mem s_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int nx, int ny, DATA_TYPE POLYBENCH_1D(s,NY,ny), DATA_TYPE POLYBENCH_1D(s_outputFromGpu,NY,ny), + DATA_TYPE POLYBENCH_1D(q,NX,nx), DATA_TYPE POLYBENCH_1D(q_outputFromGpu,NX,nx)) +{ + int i,fail; + fail = 0; + + // Compare s with s_cuda + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + // print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("bicg.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init_array(int nx, int ny, DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny), DATA_TYPE POLYBENCH_1D(p,NY,ny), DATA_TYPE POLYBENCH_1D(r,NX,nx)) +{ + int i, j; + + for (i = 0; i < ny; i++) + { + p[i] = i * M_PI; + } + + for (i = 0; i < nx; i++) + { + r[i] = i * M_PI; + + for (j = 0; j < ny; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / NX; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny), DATA_TYPE POLYBENCH_1D(r,NX,nx), DATA_TYPE POLYBENCH_1D(s,NX,nx), + DATA_TYPE POLYBENCH_1D(p,NX,nx), DATA_TYPE POLYBENCH_1D(q,NX,nx)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX * NY, NULL, &errcode); + r_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX, NULL, &errcode); + s_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX, NULL, &errcode); + p_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX, NULL, &errcode); + q_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NX, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX * NY, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, r_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX, r, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, s_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX, s, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, p_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX, p, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, q_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NX, q, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); + } + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = bicg_Gen9core_gen_len; + const unsigned char* kernel_bin = bicg_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the 1st OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "bicgKernel1", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + + // Create the 2nd OpenCL kernel + clKernel2 = clCreateKernel(clProgram, "bicgKernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + + clFinish(clCommandQue); +} + +void cl_launch_kernel(int nx, int ny) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NX) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = 1; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&p_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&q_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(int), &nx); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(int), &ny); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the 1st OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); + + globalWorkSize[0] = (size_t)ceil(((float)NY) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = 1; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel2, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(cl_mem), (void *)&r_mem_obj); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(cl_mem), (void *)&s_mem_obj); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(int), &nx); + errcode |= clSetKernelArg(clKernel2, 4, sizeof(int), &ny); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the 2nd OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseKernel(clKernel2); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(p_mem_obj); + errcode = clReleaseMemObject(q_mem_obj); + errcode = clReleaseMemObject(r_mem_obj); + errcode = clReleaseMemObject(s_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void bicg_cpu(int nx, int ny, DATA_TYPE POLYBENCH_2D(A,NX,NY,nx,ny), DATA_TYPE POLYBENCH_1D(r,NX,nx), DATA_TYPE POLYBENCH_1D(s,NY,ny), + DATA_TYPE POLYBENCH_1D(p,NY,ny), DATA_TYPE POLYBENCH_1D(q,NX,nx)) +{ + int i,j; + + for (i = 0; i < _PB_NY; i++) + { + s[i] = 0.0; + } + + for (i = 0; i < _PB_NX; i++) + { + q[i] = 0.0; + for (j = 0; j < _PB_NY; j++) + { + s[j] = s[j] + r[i] * A[i][j]; + q[i] = q[i] + A[i][j] * p[j]; + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int nx, int ny, + DATA_TYPE POLYBENCH_1D(s,NY,ny), + DATA_TYPE POLYBENCH_1D(q,NX,nx)) + +{ + int i; + + for (i = 0; i < ny; i++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, s[i]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } + for (i = 0; i < nx; i++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, q[i]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + int nx = NX; + int ny = NY; + + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NX,NY,nx,ny); + POLYBENCH_1D_ARRAY_DECL(s,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(q,DATA_TYPE,NX,nx); + POLYBENCH_1D_ARRAY_DECL(p,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(r,DATA_TYPE,NX,nx); + POLYBENCH_1D_ARRAY_DECL(s_outputFromGpu,DATA_TYPE,NY,ny); + POLYBENCH_1D_ARRAY_DECL(q_outputFromGpu,DATA_TYPE,NX,nx); + + init_array(nx, ny, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(r)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(r), POLYBENCH_ARRAY(s), POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(q)); + cl_load_prog(); + + cl_launch_kernel(nx, ny); + + errcode = clEnqueueReadBuffer(clCommandQue, s_mem_obj, CL_TRUE, 0, NY*sizeof(DATA_TYPE), POLYBENCH_ARRAY(s_outputFromGpu), 0, NULL, NULL); + errcode = clEnqueueReadBuffer(clCommandQue, q_mem_obj, CL_TRUE, 0, NX*sizeof(DATA_TYPE), POLYBENCH_ARRAY(q_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + bicg_cpu(nx, ny, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(r), POLYBENCH_ARRAY(s), POLYBENCH_ARRAY(p), POLYBENCH_ARRAY(q)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(nx, ny, POLYBENCH_ARRAY(s), POLYBENCH_ARRAY(s_outputFromGpu), POLYBENCH_ARRAY(q), + POLYBENCH_ARRAY(q_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(nx, ny, POLYBENCH_ARRAY(s_outputFromGpu), POLYBENCH_ARRAY(q_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(r); + POLYBENCH_FREE_ARRAY(s); + POLYBENCH_FREE_ARRAY(p); + POLYBENCH_FREE_ARRAY(q); + POLYBENCH_FREE_ARRAY(s_outputFromGpu); + POLYBENCH_FREE_ARRAY(q_outputFromGpu); + + return 0; +} + +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cl new file mode 100644 index 0000000000..d656092ce1 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.cl @@ -0,0 +1,54 @@ +/** + * bicg.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + +__kernel void bicgKernel1(__global DATA_TYPE *A, __global DATA_TYPE *p, __global DATA_TYPE *q, int nx, int ny) +{ + int i = get_global_id(0); + + if (i < nx) + { + q[i] = 0.0; + + int j; + for(j=0; j < ny; j++) + { + q[i] += A[i * ny + j] * p[j]; + } + } + +} + +__kernel void bicgKernel2(__global DATA_TYPE *A, __global DATA_TYPE *r, __global DATA_TYPE *s, int nx, int ny) +{ + int j = get_global_id(0); + + if (j < ny) + { + s[j] = 0.0; + + int i; + for(i = 0; i < nx; i++) + { + s[j] += A[i * ny + j] * r[i]; + } + } + +} + + + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.h new file mode 100644 index 0000000000..da62dbb83a --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg.h @@ -0,0 +1,61 @@ +/** + * bicg.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef BICG_H +# define BICG_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NX) && !defined(NY) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define NX 1024 +#define NY 1024 +# endif + +# ifdef SMALL_DATASET +#define NX 2048 +#define NY 2048 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define NX 4096 +#define NY 4096 +# endif + +# ifdef LARGE_DATASET +#define NX 8192 +#define NY 8192 +# endif + +# ifdef EXTRALARGE_DATASET +#define NX 16384 +#define NY 16384 +# endif +# endif /* !N */ + +# define _PB_NX POLYBENCH_LOOP_BOUND(NX,nx) +# define _PB_NY POLYBENCH_LOOP_BOUND(NY,ny) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 256 +#define DIM_LOCAL_WORK_GROUP_Y 1 + + +#endif /* !BICG*/ \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg_kernel.h new file mode 100644 index 0000000000..566733a5e3 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/bicg/bicg_kernel.h @@ -0,0 +1,433 @@ +unsigned char bicg_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xab, 0xf4, 0x19, 0x80, 0xf5, 0x35, 0x8c, 0x1e, + 0x8e, 0x5a, 0x1c, 0xc9, 0x0c, 0x00, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, + 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x62, 0x69, 0x63, 0x67, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x28, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x20, 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, + 0x40, 0x00, 0xb1, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x10, 0x16, 0x77, 0x25, 0x07, 0x00, 0x0a, 0x08, + 0x10, 0x20, 0x80, 0x05, 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x00, 0x0e, 0x00, 0x20, + 0xf8, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x21, 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0xc0, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x0c, 0x0c, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2f, 0x00, 0x0f, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, 0x1c, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, + 0x1c, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0xe0, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x60, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x11, 0x00, 0x06, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x40, 0x01, 0x00, 0x00, 0x41, 0x96, 0x79, 0x20, + 0x07, 0x10, 0x0a, 0x08, 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, + 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, + 0xe8, 0x3e, 0x40, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x20, 0x80, 0x00, 0xe8, 0x3e, 0x40, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x70, 0x10, 0x06, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x22, + 0x80, 0x0e, 0x8d, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2e, + 0x00, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x22, 0x80, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0xc0, 0x22, 0x00, 0x01, 0x00, 0x06, + 0x01, 0x08, 0x11, 0x02, 0x10, 0x17, 0x7b, 0x25, 0x00, 0x00, 0x06, 0x08, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x70, 0x70, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x22, 0x80, 0x02, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2d, + 0x00, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x60, 0x2d, 0x80, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x5b, 0x22, 0x01, 0x20, 0x02, 0x90, 0xb4, 0x2d, 0x5b, 0x23, 0x07, 0x20, + 0x02, 0x90, 0xaf, 0x2d, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x20, 0x01, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x20, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0x08, 0xff, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x78, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x79, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0x47, 0xf5, 0x35, 0x8c, 0x1e, 0x8e, 0x5a, 0x1c, 0xc9, + 0x0c, 0x00, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x98, 0x02, 0x00, 0x00, 0x62, 0x69, 0x63, 0x67, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x32, 0x00, 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, + 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, 0x28, 0x01, 0x00, 0x0a, + 0x64, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, + 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x10, 0x16, 0x7b, 0x25, 0x07, 0x00, 0x0a, 0x08, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x00, 0x0e, 0x00, 0x20, 0xf0, 0x01, 0x00, 0x00, + 0xf0, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x21, + 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x0c, 0x0c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x00, 0x0f, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x03, + 0x26, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x00, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x60, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x06, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0x38, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0x00, 0x22, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x80, 0x00, + 0xe8, 0x3e, 0x80, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc0, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x96, 0x15, 0x20, 0xe0, 0x12, 0x7e, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0xc4, 0x0f, 0x00, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0x80, 0x22, + 0x00, 0x01, 0x00, 0x06, 0x01, 0x08, 0x11, 0x02, 0x10, 0x17, 0x77, 0x25, + 0x00, 0x00, 0x06, 0x08, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x12, 0x12, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2d, + 0x40, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xa0, 0x2d, 0x40, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x5b, 0x02, 0x01, 0x20, 0x02, 0x80, 0xbc, 0x29, 0x5b, 0x43, 0x07, 0x20, + 0x02, 0xa0, 0xb7, 0x29, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x00, 0x01, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x40, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xf8, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x78, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x79, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int bicg_Gen9core_gen_len = 5156; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cc new file mode 100644 index 0000000000..5f7839fc50 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cc @@ -0,0 +1,400 @@ +/** + * doitgen.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +#define POLYBENCH_TIME 1 + +#include "doitgen.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define GPU_DEVICE 0 + +#define RUN_ON_CPU + +#define MAX_SOURCE_SIZE (0x100000) + + +namespace ns_doitgen { + +#include "../../polybenchUtilFuncts.h" + +#include "doitgen_kernel.h" + + +char str_temp[1024]; + + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_command_queue clCommandQue; +cl_program clProgram; +cl_mem a_mem_obj; +cl_mem b_mem_obj; +cl_mem c_mem_obj; +FILE *fp; +char *source_str; +size_t source_size; + + +/* Main computational kernel. The whole function will be timed, + including the call and return. */ +void kernel_doitgenCpu(int nr, int nq, int np, + DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np), + DATA_TYPE POLYBENCH_2D(C4,NP,NP,np,np), + DATA_TYPE POLYBENCH_3D(sum,NR,NQ,NP,nr,nq,np)) +{ + int r, q, p, s; + + for (r = 0; r < _PB_NR; r++) + { + for (q = 0; q < _PB_NQ; q++) + { + for (p = 0; p < _PB_NP; p++) + { + sum[r][q][p] = 0; + for (s = 0; s < _PB_NP; s++) + sum[r][q][p] = sum[r][q][p] + A[r][q][s] * C4[s][p]; + } + for (p = 0; p < _PB_NR; p++) + A[r][q][p] = sum[r][q][p]; + } + } + +} + + + +/* Array initialization. */ +void init_array(int nr, int nq, int np, + DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np), + DATA_TYPE POLYBENCH_2D(C4,NP,NP,np,np)) +{ + int i, j, k; + + for (i = 0; i < nr; i++) + for (j = 0; j < nq; j++) + for (k = 0; k < np; k++) + A[i][j][k] = ((DATA_TYPE) i*j + k) / np; + + for (i = 0; i < np; i++) + for (j = 0; j < np; j++) + C4[i][j] = ((DATA_TYPE) i*j) / np; +} + + +void compareResults(int nr, int nq, int np, DATA_TYPE POLYBENCH_3D(sum,NR,NQ,NP,nr,nq,np), + DATA_TYPE POLYBENCH_3D(sum_outputFromGpu,NR,NQ,NP,nr,nq,np)) +{ + int fail = 0; + + int r, q, p; + for (r = 0; r < nr; r++) + { + for (q = 0; q < nq; q++) + { + for (p = 0; p < np; p++) + { + if (percentDiff(sum[r][q][p], sum_outputFromGpu[r][q][p]) > PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + } + } + + // Print results + printf("Number of misses: %d\n", fail); +} + + + + + +void read_cl_file() +{ + // Load the kernel source code into the array source_str + // fp = fopen("doitgen.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + + errcode = clGetDeviceIDs( platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("device id is %d\n",device_id); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + +void cl_mem_init(DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np), + DATA_TYPE POLYBENCH_2D(C4,NP,NP,np,np), + DATA_TYPE POLYBENCH_3D(sum,NR,NQ,NP,nr,nq,np)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NR * NQ * NP * sizeof(DATA_TYPE), NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + b_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NP * NP * sizeof(DATA_TYPE), NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + c_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NR * NQ * NP * sizeof(DATA_TYPE), NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, NR * NQ * NP * sizeof(DATA_TYPE), A, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); + errcode = clEnqueueWriteBuffer(clCommandQue, b_mem_obj, CL_TRUE, 0, NP * NP * sizeof(DATA_TYPE), C4, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); + errcode = clEnqueueWriteBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NR * NQ * NP * sizeof(DATA_TYPE), sum, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = doitgen_Gen9core_gen_len; + const unsigned char* kernel_bin = doitgen_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "doitgen_kernel1", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel1\n"); + clKernel2 = clCreateKernel(clProgram, "doitgen_kernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel2\n"); + clFinish(clCommandQue); +} + +void cl_launch_kernel1(int nr, int nq, int np, int r) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NP) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NQ) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(int), (void *)&nr); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(int), (void *)&nq); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(int), (void *)&np); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel1, 6, sizeof(int), (void *)&r); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); +} + +void cl_launch_kernel2(int nr, int nq, int np, int r) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NP) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NQ) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel2, 0, sizeof(int), (void *)&nr); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(int), (void *)&nq); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(int), (void *)&np); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel2, 4, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel2, 5, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel2, 6, sizeof(int), (void *)&r); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); +} + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseKernel(clKernel2); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(b_mem_obj); + errcode = clReleaseMemObject(c_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int nr, int nq, int np, + DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np)) +{ + int i, j, k; + + for (i = 0; i < nr; i++) + { + for (j = 0; j < nq; j++) + { + for (k = 0; k < np; k++) + { + fprintf (stderr, DATA_PRINTF_MODIFIER, A[i][j][k]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } + } + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int nr = NR; + int nq = NQ; + int np = NP; + + /* Variable declaration/allocation. */ + POLYBENCH_3D_ARRAY_DECL(A,DATA_TYPE,NR,NQ,NP,nr,nq,np); + POLYBENCH_3D_ARRAY_DECL(sum,DATA_TYPE,NR,NQ,NP,nr,nq,np); + POLYBENCH_3D_ARRAY_DECL(sum_outputFromGpu,DATA_TYPE,NR,NQ,NP,nr,nq,np); + POLYBENCH_2D_ARRAY_DECL(C4,DATA_TYPE,NP,NP,np,np); + + /* Initialize array(s). */ + init_array (nr, nq, np, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(C4)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(C4), POLYBENCH_ARRAY(sum)); + cl_load_prog(); + + /* Start timer. */ + polybench_start_instruments; + + + int r; + for (r = 0; r < NR; r++) + { + cl_launch_kernel1(nr, nq, np, r); + cl_launch_kernel2(nr, nq, np, r); + } + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + errcode = clEnqueueReadBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NR * NQ * NP * sizeof(DATA_TYPE), sum_outputFromGpu, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + /* Run kernel on CPU */ + kernel_doitgenCpu(nr, nq, np, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(C4), + POLYBENCH_ARRAY(sum)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(nr, nq, np, POLYBENCH_ARRAY(sum), POLYBENCH_ARRAY(sum_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(nr, nq, np, POLYBENCH_ARRAY(sum_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + /* Garbage collection */ + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(sum); + POLYBENCH_FREE_ARRAY(sum_outputFromGpu); + POLYBENCH_FREE_ARRAY(C4); + + return 0; +} + +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cl new file mode 100644 index 0000000000..3c239072b9 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.cl @@ -0,0 +1,46 @@ +/** + * doitgen.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +/* Can switch DATA_TYPE between float and double */ +typedef float DATA_TYPE; + + +__kernel void doitgen_kernel1(int nr, int nq, int np, __global DATA_TYPE *A, __global DATA_TYPE *C4, __global DATA_TYPE *sum, int r) +{ + int p = get_global_id(0); + int q = get_global_id(1); + + if ((p < np) && (q < nq)) + { + sum[r * (nq * np) + q * np + p] = (DATA_TYPE)0.0; + + for (int s = 0; s < np; s++) + { + sum[r * (nq * np) + q * np + p] = sum[r * (nq * np) + q * np + p] + A[r * (nq * np) + q * np + s] * C4[s * np + p]; + } + } +} + +__kernel void doitgen_kernel2(int nr, int nq, int np, __global DATA_TYPE *A, __global DATA_TYPE *C4, __global DATA_TYPE *sum, int r) +{ + int p = get_global_id(0); + int q = get_global_id(1); + + if ((p < np) && (q < nq)) + { + A[r * (nq * np) + q * np + p] = sum[r * (nq * np) + q * np + p]; + } +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.h new file mode 100644 index 0000000000..60678e0e9e --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen.h @@ -0,0 +1,66 @@ +/** + * doitgen.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef DOITGEN_H +# define DOITGEN_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NQ) && !defined(NR) && !defined(NP) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +# define NQ 32 +# define NR 32 +# define NP 32 +# endif + +# ifdef SMALL_DATASET +# define NQ 64 +# define NR 64 +# define NP 64 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +# define NQ 128 +# define NR 128 +# define NP 128 +# endif + +# ifdef LARGE_DATASET +# define NQ 256 +# define NR 256 +# define NP 256 +# endif + +# ifdef EXTRALARGE_DATASET +# define NQ 512 +# define NR 512 +# define NP 512 +# endif +# endif /* !N */ + +# define _PB_NQ POLYBENCH_LOOP_BOUND(NQ,nq) +# define _PB_NR POLYBENCH_LOOP_BOUND(NR,nr) +# define _PB_NP POLYBENCH_LOOP_BOUND(NP,np) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Workgroud dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + +#endif /* !DOITGEN */ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen_kernel.h new file mode 100644 index 0000000000..e9b1334c01 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/doitgen/doitgen_kernel.h @@ -0,0 +1,496 @@ +unsigned char doitgen_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x3b, 0xf1, 0x5a, 0xd9, 0x95, 0x5f, 0x0b, + 0xa2, 0x29, 0x76, 0xff, 0x10, 0x00, 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x64, 0x6f, 0x69, 0x74, + 0x67, 0x65, 0x6e, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x34, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0x38, 0x01, 0x00, 0x0a, + 0xb8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc8, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, + 0x80, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x21, 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, + 0xc0, 0x01, 0x8d, 0x0a, 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x76, 0x78, 0x07, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0c, 0x0a, 0x07, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, 0x20, 0x0a, 0x00, 0x20, + 0x00, 0x02, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0xc0, 0x0e, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x80, 0x24, 0xc8, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0xe0, 0x2c, + 0xc8, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0x80, 0x01, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x05, 0x20, 0x80, 0x02, 0x42, 0x12, 0x00, 0x20, 0x80, 0x04, 0xb1, 0x12, + 0xe0, 0x0c, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, + 0xa0, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x2f, 0x1c, 0x01, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x41, 0x96, 0x01, 0x20, 0x07, 0x74, 0x76, 0x09, 0x41, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x00, 0x02, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x80, 0x00, 0xe8, 0x3e, 0xc0, 0x2d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x80, 0x41, 0x20, 0x00, 0x06, 0x7e, 0x09, + 0x01, 0x20, 0x80, 0x00, 0xe8, 0x3e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x15, 0x20, 0xe0, 0x72, 0x06, 0x74, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x22, 0xc4, 0x00, 0x00, 0x0a, 0x40, 0x02, 0x8d, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x70, 0x72, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x22, 0x80, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2e, 0x00, 0x0e, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x22, + 0xc0, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x6d, 0x20, + 0x07, 0x70, 0x70, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x22, + 0xc0, 0x02, 0x8d, 0x0a, 0x30, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0xe0, 0x06, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x80, 0x01, 0x00, 0xc2, 0x02, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x88, 0x01, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, + 0xe8, 0x3e, 0x80, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x20, 0x80, 0x00, 0xe8, 0x3e, 0x40, 0x23, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc8, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xcc, 0x2f, 0xc8, 0x0f, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x5d, 0x20, 0x07, 0x1c, 0x72, 0x7e, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0x80, 0x02, 0x8d, 0x0a, 0xc8, 0x0f, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc8, 0x2f, 0xc8, 0x0f, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x96, 0x1d, 0x20, 0xe0, 0x22, 0x7e, 0x0c, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, 0xcc, 0x0f, 0x00, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, + 0x80, 0x03, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x24, 0x40, 0x04, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, + 0x00, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x5d, 0x20, + 0x07, 0x1c, 0x1c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, + 0x40, 0x0d, 0x8d, 0x0a, 0x28, 0x01, 0x00, 0x00, 0x40, 0x96, 0x65, 0x20, + 0x07, 0x22, 0x22, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, + 0x00, 0x0d, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x23, 0x80, 0x03, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x10, 0x17, 0x1b, 0x25, 0x00, 0x00, 0x7e, 0x09, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xa0, 0x2c, 0x40, 0x04, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x00, 0x24, 0x40, 0x0d, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x60, 0x2c, + 0x00, 0x0d, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x10, 0x20, 0x80, 0x05, + 0x24, 0x0a, 0x00, 0x20, 0xc8, 0x0f, 0x00, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x5b, 0xc2, 0x06, 0x20, 0x00, 0x60, 0x7b, 0xca, 0x5b, 0xa3, 0x01, 0x20, + 0x00, 0xd0, 0x80, 0xc6, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xc0, 0x06, 0x00, + 0x02, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0xa0, 0x01, 0x00, 0xc2, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xa8, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x05, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x72, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x71, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x70, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x34, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x73, 0x75, 0x6d, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0xee, 0x2f, 0x66, 0x67, 0xd9, 0x95, 0x5f, 0x0b, 0xa2, 0x29, 0x76, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x50, 0x02, 0x00, 0x00, 0x64, 0x6f, 0x69, 0x74, 0x67, 0x65, 0x6e, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x32, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, + 0x30, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x20, 0x34, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xd0, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x21, + 0xc0, 0x00, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x22, 0xc4, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0xc4, 0x00, 0x00, 0x12, + 0x60, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, + 0xc0, 0x00, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x22, 0x80, 0x01, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x23, 0x80, 0x02, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x16, 0x12, 0x07, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0e, 0x0a, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x00, 0x02, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x00, 0x03, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x10, 0x16, 0x7b, 0x25, 0x07, 0x00, 0x16, 0x08, + 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0xc0, 0x24, 0xd0, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0xe0, 0x24, + 0xd0, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10, 0x19, 0x03, 0x25, + 0x07, 0x00, 0x0e, 0x09, 0x05, 0x20, 0x80, 0x02, 0x40, 0x12, 0x00, 0x20, + 0xc0, 0x04, 0xb1, 0x12, 0xe0, 0x04, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, + 0x00, 0x0e, 0x00, 0x20, 0x08, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc8, 0x20, 0x1c, 0x01, 0x00, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, 0x07, 0x1a, 0x16, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, 0x00, 0x03, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xcc, 0x20, + 0xc8, 0x00, 0x00, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x40, 0x96, 0x1d, 0x20, + 0xe0, 0x1a, 0x06, 0x1a, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, + 0xcc, 0x00, 0x00, 0x0a, 0x80, 0x03, 0x8d, 0x00, 0x40, 0x96, 0x01, 0x20, + 0xe7, 0x1a, 0x1a, 0x0e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, + 0x80, 0x03, 0x8d, 0x0a, 0x00, 0x02, 0x8d, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x23, 0x40, 0x03, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, 0x80, 0x03, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x1e, 0x1a, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x24, 0x80, 0x03, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x1a, 0x1a, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x23, 0x80, 0x03, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x24, + 0xc0, 0x03, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x80, 0x24, 0x00, 0x04, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0x20, 0x02, 0x00, 0x42, 0x03, 0x00, 0x00, + 0x00, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0x40, 0x02, 0x00, + 0x82, 0x03, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x04, 0x25, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, 0x31, 0x00, 0x60, 0x07, + 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x72, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x71, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x70, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x75, 0x6d, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int doitgen_Gen9core_gen_len = 5908; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cc new file mode 100644 index 0000000000..68b539b5f2 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cc @@ -0,0 +1,356 @@ +/** + * gemm.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "gemm.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_gemm +{ +#include "../../polybenchUtilFuncts.h" + +#include "gemm_kernel.h" + + +char str_temp[1024]; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel; +cl_command_queue clCommandQue; +cl_program clProgram; +cl_mem a_mem_obj; +cl_mem b_mem_obj; +cl_mem c_mem_obj; +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int ni, int nj, DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj), DATA_TYPE POLYBENCH_2D(C_outputFromGpu,NI,NJ,ni,nj)) +{ + int i, j, fail; + fail = 0; + + // Compare CPU and GPU outputs + for (i=0; i < ni; i++) + { + for (j=0; j < nj; j++) + { + if (percentDiff(C[i][j], C_outputFromGpu[i][j]) > PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + } + + // Print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // Load the kernel source code into the array source_str + // fp = fopen("gemm.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init(int ni, int nj, int nk, DATA_TYPE* alpha, DATA_TYPE* beta, DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), + DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj)) +{ + int i, j; + + *alpha = 32412; + *beta = 2123; + + for (i = 0; i < ni; i++) + { + for (j = 0; j < nk; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / NI; + } + } + + for (i = 0; i < nk; i++) + { + for (j = 0; j < nj; j++) + { + B[i][j] = ((DATA_TYPE) i*j) / NI; + } + } + + for (i = 0; i < ni; i++) + { + for (j = 0; j < nj; j++) + { + C[i][j] = ((DATA_TYPE) i*j) / NI; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NK, NULL, &errcode); + b_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NK * NJ, NULL, &errcode); + c_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NJ, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NK, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, b_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NK * NJ, B, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NJ, C, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = gemm_Gen9core_gen_len; + const unsigned char* kernel_bin = gemm_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel = clCreateKernel(clProgram, "gemm", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int ni, int nj, int nk, DATA_TYPE alpha, DATA_TYPE beta) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NJ) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NI) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel, 1, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel, 2, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel, 3, sizeof(DATA_TYPE), (void *)&alpha); + errcode |= clSetKernelArg(clKernel, 4, sizeof(DATA_TYPE), (void *)&beta); + errcode |= clSetKernelArg(clKernel, 5, sizeof(int), (void *)&ni); + errcode |= clSetKernelArg(clKernel, 6, sizeof(int), (void *)&nj); + errcode |= clSetKernelArg(clKernel, 7, sizeof(int), (void *)&nk); + + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(b_mem_obj); + errcode = clReleaseMemObject(c_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void gemm(int ni, int nj, int nk, DATA_TYPE alpha, DATA_TYPE beta, DATA_TYPE POLYBENCH_2D(A,NI,NK,ni,nk), + DATA_TYPE POLYBENCH_2D(B,NK,NJ,nk,nj), DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj)) +{ + int i,j,k; + + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NJ; j++) + { + C[i][j] *= beta; + + for (k = 0; k < _PB_NK; ++k) + { + C[i][j] += alpha * A[i][k] * B[k][j]; + } + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int ni, int nj, + DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj)) +{ + int i, j; + + for (i = 0; i < ni; i++) + for (j = 0; j < nj; j++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]); + if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int ni = NI; + int nj = NJ; + int nk = NK; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NK,ni,nk); + POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NK,NJ,nk,nj); + POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NJ,ni,nj); + POLYBENCH_2D_ARRAY_DECL(C_outputFromGpu,DATA_TYPE,NI,NJ,ni,nj); + + init(ni, nj, nk, &alpha, &beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + cl_load_prog(); + + cl_launch_kernel(ni, nj, nk, alpha, beta); + + errcode = clEnqueueReadBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NI*NJ*sizeof(DATA_TYPE), POLYBENCH_ARRAY(C_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + gemm(ni, nj, nk, alpha, beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(ni, nj, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(C_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(ni, nj, POLYBENCH_ARRAY(C_outputFromGpu))); + + #endif //RUN_ON_CPU + + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(B); + POLYBENCH_FREE_ARRAY(C); + POLYBENCH_FREE_ARRAY(C_outputFromGpu); + + return 0; +} + +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cl new file mode 100644 index 0000000000..645ff33423 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.cl @@ -0,0 +1,36 @@ +/** + * gemm.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + + +__kernel void gemm(__global DATA_TYPE *a, __global DATA_TYPE *b, __global DATA_TYPE *c, DATA_TYPE alpha, DATA_TYPE beta, int ni, int nj, int nk) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < ni) && (j < nj)) + { + c[i * nj + j] *= beta; + int k; + for(k=0; k < nk; k++) + { + c[i * nj + j] += alpha * a[i * nk + k] * b[k * nj +j]; + } + } +} + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.h new file mode 100644 index 0000000000..9d0a9e7a4f --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm.h @@ -0,0 +1,67 @@ +/** + * gemm.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef GEMM_H +# define GEMM_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NI) && !defined(NJ) && !defined(NK) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define NI 128 +#define NJ 128 +#define NK 128 +# endif + +# ifdef SMALL_DATASET +#define NI 256 +#define NJ 256 +#define NK 256 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define NI 512 +#define NJ 512 +#define NK 512 +# endif + +# ifdef LARGE_DATASET +#define NI 1024 +#define NJ 1024 +#define NK 1024 +# endif + +# ifdef EXTRALARGE_DATASET +#define NI 2048 +#define NJ 2048 +#define NK 2048 +# endif +# endif /* !N */ + +# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni) +# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj) +# define _PB_NK POLYBENCH_LOOP_BOUND(NK,nk) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !GEMM*/ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm_kernel.h new file mode 100644 index 0000000000..6f183b2f1a --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemm/gemm_kernel.h @@ -0,0 +1,278 @@ +unsigned char gemm_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x39, 0xd9, 0x45, 0x3f, 0xbe, 0x1a, 0x4f, + 0xf8, 0x2b, 0xe5, 0x01, 0x08, 0x00, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x67, 0x65, 0x6d, 0x6d, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0xa0, 0x20, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, + 0x41, 0x80, 0x2d, 0x20, 0x00, 0x7e, 0x0a, 0x05, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0x44, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xe0, 0x21, 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x21, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x20, 0x22, 0xe0, 0x01, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0d, 0x0b, 0x07, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x20, 0x02, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xa0, 0x01, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0xe0, 0x2c, 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0xe0, 0x23, 0xc4, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xc0, 0x0e, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0xe0, 0x03, 0xb1, 0x12, 0xe0, 0x0c, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x98, 0x02, 0x00, 0x00, + 0x98, 0x02, 0x00, 0x00, 0x41, 0x96, 0x2d, 0x20, 0x07, 0x74, 0x76, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x22, 0x20, 0x02, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x28, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x28, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0d, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x60, 0x22, 0x60, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x22, + 0x60, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x71, 0x20, + 0x07, 0x74, 0x74, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x22, + 0x60, 0x02, 0x8d, 0x0a, 0x34, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0x40, 0x2e, 0x80, 0x0e, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x22, 0x60, 0x02, 0x00, 0x06, + 0x02, 0x5e, 0x20, 0x04, 0x41, 0x56, 0x7a, 0x20, 0x07, 0x70, 0x72, 0x08, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0xe0, 0x22, 0xa0, 0x02, 0x8d, 0x3a, + 0x1c, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x00, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x70, 0x01, 0x00, 0x62, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0x98, 0x01, 0x00, 0x00, 0x41, 0x96, 0x5d, 0x20, 0x07, 0x6e, 0x76, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x20, 0x23, 0x20, 0x02, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc4, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x1b, 0x6e, 0x7e, 0x41, 0x80, 0x49, 0x20, 0x00, 0x7e, 0x7e, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, 0x20, 0x03, 0x8d, 0x0a, + 0xc4, 0x0f, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x60, 0x23, 0x60, 0x03, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x96, 0x19, 0x20, 0xe0, 0x24, 0x7e, 0x0d, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2d, 0xc8, 0x0f, 0x00, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, 0x80, 0x0d, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x1b, 0x1b, 0x09, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x24, 0x80, 0x04, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, + 0x00, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2d, 0x80, 0x0d, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x23, 0x60, 0x03, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x6d, 0x20, 0x07, 0x24, 0x24, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, 0x00, 0x0d, 0x8d, 0x0a, + 0x30, 0x01, 0x00, 0x00, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x2d, + 0x80, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x10, 0x00, 0x80, 0x05, + 0x24, 0x0a, 0x00, 0x20, 0xc4, 0x0f, 0x00, 0x0a, 0x28, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0x80, 0x04, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x60, 0x2c, + 0x00, 0x0d, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x10, 0x20, 0x80, 0x05, + 0x24, 0x0a, 0x00, 0x20, 0xc4, 0x0f, 0x00, 0x0a, 0x28, 0x01, 0x00, 0x00, + 0x41, 0x56, 0x76, 0x20, 0x07, 0x20, 0x1d, 0x08, 0x41, 0x20, 0x80, 0x00, + 0xe8, 0x3a, 0x40, 0x24, 0x40, 0x0d, 0x8d, 0x3a, 0x18, 0x01, 0x00, 0x00, + 0x5b, 0x02, 0x07, 0x20, 0x00, 0x80, 0x83, 0xca, 0x5b, 0x73, 0x01, 0x20, + 0x00, 0xb8, 0x88, 0xc6, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x00, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x70, 0x01, 0x00, 0x62, 0x02, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0x90, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x05, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x69, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6b, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int gemm_Gen9core_gen_len = 3300; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cc new file mode 100644 index 0000000000..f075b72aed --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cc @@ -0,0 +1,464 @@ +/** + * gemver.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "gemver.h" +#include "../../polybench.h" + + + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + + +namespace ns_gemver { + #include "../../polybenchUtilFuncts.h" + #include "gemver_kernel.h" + +char str_temp[1024]; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_kernel clKernel3; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem u1_mem_obj; +cl_mem v1_mem_obj; +cl_mem u2_mem_obj; +cl_mem v2_mem_obj; +cl_mem w_mem_obj; +cl_mem x_mem_obj; +cl_mem y_mem_obj; +cl_mem z_mem_obj; + + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int n, DATA_TYPE POLYBENCH_1D(w1, N, n), DATA_TYPE POLYBENCH_1D(w2, N, n)) +{ + int i, fail; + fail = 0; + + for (i=0; i < N; i++) + { + if (percentDiff(w1[i], w2[i]) > PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + // Print results + printf("Number of misses: %d\n", fail); +} + + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("gemver.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init(int n, DATA_TYPE *alpha, + DATA_TYPE *beta, + DATA_TYPE POLYBENCH_2D(A,N,N,n,n), + DATA_TYPE POLYBENCH_1D(u1,N,n), + DATA_TYPE POLYBENCH_1D(v1,N,n), + DATA_TYPE POLYBENCH_1D(u2,N,n), + DATA_TYPE POLYBENCH_1D(v2,N,n), + DATA_TYPE POLYBENCH_1D(w,N,n), + DATA_TYPE POLYBENCH_1D(x,N,n), + DATA_TYPE POLYBENCH_1D(y,N,n), + DATA_TYPE POLYBENCH_1D(z,N,n)) +{ + int i, j; + + *alpha = 43532; + *beta = 12313; + + for (i = 0; i < N; i++) + { + u1[i] = i; + u2[i] = (i+1)/N/2.0; + v1[i] = (i+1)/N/4.0; + v2[i] = (i+1)/N/6.0; + y[i] = (i+1)/N/8.0; + z[i] = (i+1)/N/9.0; + x[i] = 0.0; + w[i] = 0.0; + + for (j = 0; j < N; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / N; + } + } +} + + +void cl_initialization() +{ + + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("device id is %d\n",device_id); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,N,N,n,n), DATA_TYPE POLYBENCH_1D(u1,N,n), DATA_TYPE POLYBENCH_1D(v1,N,n), DATA_TYPE POLYBENCH_1D(u2,N,n), + DATA_TYPE POLYBENCH_1D(v2,N,n), DATA_TYPE POLYBENCH_1D(w,N,n), DATA_TYPE POLYBENCH_1D(x,N,n), DATA_TYPE POLYBENCH_1D(y,N,n), + DATA_TYPE POLYBENCH_1D(z,N,n)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N * N, NULL, &errcode); + u1_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + v1_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + u2_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + v2_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + w_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + x_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + y_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + z_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N * N, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, u1_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, u1, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, v1_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, v1, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, u2_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, u2, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, v2_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, v2, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, w_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, w, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, x_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, x, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, y_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, y, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, z_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, z, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = gemver_Gen9core_gen_len; + const unsigned char* kernel_bin = gemver_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + + + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "gemver_kernel1", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel1\n"); + + // Create the OpenCL kernel + clKernel2 = clCreateKernel(clProgram, "gemver_kernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel2\n"); + + // Create the OpenCL kernel + clKernel3 = clCreateKernel(clProgram, "gemver_kernel3", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel3\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int n, DATA_TYPE alpha, DATA_TYPE beta) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_KERNEL_1_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_KERNEL_1_Y; + globalWorkSize[0] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_1_X)) * DIM_LOCAL_WORK_GROUP_KERNEL_1_X; + globalWorkSize[1] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_1_Y)) * DIM_LOCAL_WORK_GROUP_KERNEL_1_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&v1_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&v2_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(cl_mem), (void *)&u1_mem_obj); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(cl_mem), (void *)&u2_mem_obj); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(int), (void *)&n); + if(errcode != CL_SUCCESS) printf("Error in seting arguments1\n"); + size_t global_item_size = sizeof(DATA_TYPE) * N; + size_t local_item_size = 64; + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel1\n"); + clEnqueueBarrier(clCommandQue); + + int dim = N; + + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_KERNEL_2_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_KERNEL_2_Y; + globalWorkSize[0] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_2_X)) * DIM_LOCAL_WORK_GROUP_KERNEL_2_X; + globalWorkSize[1] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_2_Y)) * DIM_LOCAL_WORK_GROUP_KERNEL_2_Y; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel2, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(cl_mem), (void *)&x_mem_obj); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(cl_mem), (void *)&y_mem_obj); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(cl_mem), (void *)&z_mem_obj); + errcode |= clSetKernelArg(clKernel2, 4, sizeof(DATA_TYPE), (void *)&beta); + errcode |= clSetKernelArg(clKernel2, 5, sizeof(int), (void *)&n); + if(errcode != CL_SUCCESS) printf("Error in seting arguments2\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel2\n"); + clEnqueueBarrier(clCommandQue); + + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_KERNEL_3_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_KERNEL_3_Y; + globalWorkSize[0] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_3_X)) * DIM_LOCAL_WORK_GROUP_KERNEL_3_X; + globalWorkSize[1] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_KERNEL_3_Y)) * DIM_LOCAL_WORK_GROUP_KERNEL_3_Y; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel3, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel3, 1, sizeof(cl_mem), (void *)&x_mem_obj); + errcode |= clSetKernelArg(clKernel3, 2, sizeof(cl_mem), (void *)&w_mem_obj); + errcode |= clSetKernelArg(clKernel3, 3, sizeof(DATA_TYPE), (void *)&alpha); + errcode |= clSetKernelArg(clKernel3, 4, sizeof(int), (void *)&n); + if(errcode != CL_SUCCESS) printf("Error in seting arguments3\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel3, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel3\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(u1_mem_obj); + errcode = clReleaseMemObject(v1_mem_obj); + errcode = clReleaseMemObject(u2_mem_obj); + errcode = clReleaseMemObject(v2_mem_obj); + errcode = clReleaseMemObject(w_mem_obj); + errcode = clReleaseMemObject(x_mem_obj); + errcode = clReleaseMemObject(y_mem_obj); + errcode = clReleaseMemObject(z_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void gemver(int n, DATA_TYPE alpha, DATA_TYPE beta, DATA_TYPE POLYBENCH_2D(A, N, N, n, n), DATA_TYPE POLYBENCH_1D(u1, N, n), DATA_TYPE POLYBENCH_1D(v1, N, n), + DATA_TYPE POLYBENCH_1D(u2, N, n), DATA_TYPE POLYBENCH_1D(v2, N, n), DATA_TYPE POLYBENCH_1D(w, N, n), DATA_TYPE POLYBENCH_1D(x, N, n), DATA_TYPE POLYBENCH_1D(y, N, n), + DATA_TYPE POLYBENCH_1D(z, N, n)) +{ + int i,j; + + for (i = 0; i < _PB_N; i++) + { + for (j = 0; j < _PB_N; j++) + { + A[i][j] = A[i][j] + u1[i] * v1[j] + u2[i] * v2[j]; + } + } + + for (i = 0; i < _PB_N; i++) + { + for (j = 0; j < _PB_N; j++) + { + x[i] = x[i] + beta * A[j][i] * y[j]; + } + } + + for (i = 0; i < _PB_N; i++) + { + x[i] = x[i] + z[i]; + } + + for (i = 0; i < _PB_N; i++) + { + for (j = 0; j < _PB_N; j++) + { + w[i] = w[i] + alpha * A[i][j] * x[j]; + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int n, + DATA_TYPE POLYBENCH_1D(w,N,n)) +{ + int i; + + for (i = 0; i < n; i++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, w[i]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int n = N; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,N,N,n,n); + POLYBENCH_1D_ARRAY_DECL(u1,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(v1,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(u2,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(v2,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(w,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(w_outputFromGpu,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(x,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(y,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(z,DATA_TYPE,N,n); + + init(n, &alpha, &beta, + POLYBENCH_ARRAY(A), + POLYBENCH_ARRAY(u1), + POLYBENCH_ARRAY(v1), + POLYBENCH_ARRAY(u2), + POLYBENCH_ARRAY(v2), + POLYBENCH_ARRAY(w), + POLYBENCH_ARRAY(x), + POLYBENCH_ARRAY(y), + POLYBENCH_ARRAY(z)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(u1), POLYBENCH_ARRAY(v1), POLYBENCH_ARRAY(u2), POLYBENCH_ARRAY(v2), + POLYBENCH_ARRAY(w), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(z)); + + cl_load_prog(); + cl_launch_kernel(n, alpha, beta); + errcode = clEnqueueReadBuffer(clCommandQue, w_mem_obj, CL_TRUE, 0, N*sizeof(DATA_TYPE), POLYBENCH_ARRAY(w_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + gemver(n, alpha, beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(u1), POLYBENCH_ARRAY(v1), POLYBENCH_ARRAY(u2), POLYBENCH_ARRAY(v2), + POLYBENCH_ARRAY(w), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(z)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(n, POLYBENCH_ARRAY(w), POLYBENCH_ARRAY(w_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(w_outputFromGpu))); + + #endif //RUN_ON_CPU + + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(u1); + POLYBENCH_FREE_ARRAY(v1); + POLYBENCH_FREE_ARRAY(u2); + POLYBENCH_FREE_ARRAY(v2); + POLYBENCH_FREE_ARRAY(w); + POLYBENCH_FREE_ARRAY(w_outputFromGpu); + POLYBENCH_FREE_ARRAY(x); + POLYBENCH_FREE_ARRAY(y); + POLYBENCH_FREE_ARRAY(z); + + + return 0; +} + +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cl new file mode 100644 index 0000000000..0f18be0ef6 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.cl @@ -0,0 +1,61 @@ +/** + * gemver.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + + +__kernel void gemver_kernel1(__global DATA_TYPE *A, __global DATA_TYPE *V1, __global DATA_TYPE *V2, __global DATA_TYPE *U1, __global DATA_TYPE *U2, int n) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < n) && (j < n)) + { + A[i*n + j] += U1[i] * V1[j] + U2[i] * V2[j]; + } +} + + +__kernel void gemver_kernel2(__global DATA_TYPE *A, __global DATA_TYPE *X, __global DATA_TYPE *Y, __global DATA_TYPE *Z, DATA_TYPE beta, int n) +{ + int i = get_global_id(0); + + if (i < n) + { + int j; + for(j = 0; j < n; j++) + { + X[i] += beta * A[j * n + i] * Y[j]; + } + X[i] += Z[i]; + } +} + + +__kernel void gemver_kernel3(__global DATA_TYPE *A, __global DATA_TYPE *X, __global DATA_TYPE *w, DATA_TYPE alpha, int n) +{ + int i = get_global_id(0); + + if (i < n) + { + int j; + for(j = 0; j < n; j++) + { + w[i] += alpha * A[i*n + j] * X[j]; + } + } +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.h new file mode 100644 index 0000000000..26e31c5ce2 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver.h @@ -0,0 +1,63 @@ +/** + * gemver.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef GEMVER_H +# define GEMVER_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(N) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define N 1024 +# endif + +# ifdef SMALL_DATASET +#define N 2048 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define N 4096 +# endif + +# ifdef LARGE_DATASET +#define N 8192 +# endif + +# ifdef EXTRALARGE_DATASET +#define N 16384 +# endif +# endif /* !N */ + +# define _PB_N POLYBENCH_LOOP_BOUND(N,n) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions for kernel 1*/ +#define DIM_LOCAL_WORK_GROUP_KERNEL_1_X 32 +#define DIM_LOCAL_WORK_GROUP_KERNEL_1_Y 8 + +/* Thread block dimensions for kernel 2*/ +#define DIM_LOCAL_WORK_GROUP_KERNEL_2_X 256 +#define DIM_LOCAL_WORK_GROUP_KERNEL_2_Y 1 + +/* Thread block dimensions for kernel 3*/ +#define DIM_LOCAL_WORK_GROUP_KERNEL_3_X 256 +#define DIM_LOCAL_WORK_GROUP_KERNEL_3_Y 1 + + +#endif /* !TWODCONV*/ \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver_kernel.h new file mode 100644 index 0000000000..da847a9ecb --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gemver/gemver_kernel.h @@ -0,0 +1,741 @@ +unsigned char gemver_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0xae, 0xc0, 0x6a, 0x9e, 0x7d, 0x0c, 0x33, + 0x6a, 0x02, 0xd3, 0x21, 0x10, 0x00, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x67, 0x65, 0x6d, 0x76, + 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x80, 0x2d, 0x20, + 0x00, 0x7e, 0x0a, 0x05, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, + 0x44, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x16, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, + 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xe0, 0x21, + 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x60, 0x21, 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0x12, + 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, + 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x20, 0x22, 0xe0, 0x01, 0x8d, 0x0a, 0xe4, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0d, 0x0b, 0x07, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x40, 0x0f, 0x8d, 0x0a, 0x28, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x20, 0x02, 0x8d, 0x0a, 0x28, 0x01, 0x00, 0x00, + 0x10, 0x16, 0x5f, 0x25, 0x07, 0x00, 0x0d, 0x09, 0x02, 0x20, 0x81, 0x00, + 0x4a, 0x12, 0x00, 0x21, 0xc4, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0x20, 0x2e, 0xc4, 0x0f, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x19, 0x5f, 0x25, 0x07, 0x00, 0x76, 0x09, + 0x05, 0x20, 0x80, 0x02, 0x40, 0x12, 0x00, 0x20, 0x20, 0x0e, 0xb1, 0x12, + 0x00, 0x01, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x00, 0x0e, 0x00, 0x20, + 0x18, 0x02, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0xc0, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xe0, 0x22, 0xa0, 0x01, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x41, 0x96, 0x5d, 0x20, 0x07, 0x5d, 0x76, 0x09, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x22, 0x20, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x2d, + 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x41, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x25, 0x20, 0x02, 0x8d, 0x0a, 0x28, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x79, 0x20, 0x07, 0x67, 0x74, 0x09, 0x40, 0x96, 0x71, 0x20, + 0x07, 0x63, 0x17, 0x09, 0x40, 0x96, 0x01, 0x20, 0xe7, 0x5d, 0x5d, 0x0d, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x24, 0x60, 0x02, 0x8d, 0x0a, + 0x3c, 0x01, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x24, + 0x60, 0x0d, 0x8d, 0x0a, 0x34, 0x01, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x25, 0x40, 0x05, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0xe0, 0x0c, 0x00, 0x06, + 0x04, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x75, 0x20, 0x07, 0x72, 0x74, 0x09, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2c, 0x60, 0x0c, 0x00, 0x06, + 0x02, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x6d, 0x20, 0x07, 0x19, 0x17, 0x09, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xa0, 0x2b, 0xa0, 0x0b, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x24, + 0x00, 0x04, 0x00, 0x06, 0x04, 0x5e, 0x20, 0x04, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xa0, 0x22, 0x60, 0x02, 0x8d, 0x0a, 0x38, 0x01, 0x00, 0x00, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x24, 0x80, 0x04, 0x00, 0x06, + 0x02, 0x5e, 0x20, 0x04, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x20, 0x2d, + 0x60, 0x0d, 0x8d, 0x0a, 0x30, 0x01, 0x00, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x25, 0x40, 0x05, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x2d, 0x40, 0x0e, 0x00, 0x06, + 0x03, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x65, 0x20, 0x07, 0x5d, 0x5d, 0x09, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x23, 0x20, 0x03, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2d, + 0xa0, 0x02, 0x00, 0x06, 0x03, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x23, 0x20, 0x0d, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x25, 0x40, 0x05, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x60, 0x2b, + 0xa0, 0x0b, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x80, 0x25, 0x40, 0x05, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x41, 0x56, 0x02, 0x20, 0xe7, 0x65, 0x65, 0x61, 0x41, 0x20, 0x80, 0x00, + 0xe8, 0x3a, 0x40, 0x24, 0x40, 0x04, 0x8d, 0x3a, 0xc0, 0x04, 0x8d, 0x00, + 0x5b, 0xf2, 0x05, 0x20, 0x00, 0x28, 0x73, 0xde, 0x5b, 0x83, 0x02, 0x20, + 0x00, 0x10, 0x79, 0xda, 0x40, 0x56, 0x02, 0x20, 0xe7, 0x5b, 0x5b, 0x5f, + 0x40, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x80, 0x25, 0x80, 0x05, 0x8d, 0x3a, + 0x00, 0x05, 0x8d, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xb0, 0x05, 0x00, + 0xa2, 0x0b, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0xc0, 0x02, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0x5e, 0x02, 0x04, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x31, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x56, 0x32, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x31, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x32, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0xfb, 0xa9, 0x4e, 0x17, 0x9e, 0x7d, 0x0c, 0x33, + 0x6a, 0x02, 0xd3, 0x21, 0x10, 0x00, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x10, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x67, 0x65, 0x6d, 0x76, + 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x32, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x34, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x0a, 0x04, 0x07, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, + 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, 0x10, 0x16, 0x2f, 0x25, + 0x07, 0x00, 0x0a, 0x09, 0x10, 0x20, 0x80, 0x05, 0x20, 0x0a, 0x00, 0x20, + 0x40, 0x0f, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x22, 0x00, 0xa1, 0x00, + 0x00, 0x0e, 0x00, 0x20, 0xd8, 0x02, 0x00, 0x00, 0xd8, 0x02, 0x00, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, 0x24, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, + 0x24, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, + 0x06, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0x68, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x21, 0x40, 0x01, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, + 0x07, 0x0c, 0x0c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x00, 0x0f, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x21, 0x80, 0x01, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x2e, 0x00, 0x0f, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x88, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x22, 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x65, 0x20, + 0x07, 0x10, 0x10, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, + 0x80, 0x0e, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x21, 0x00, 0x02, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x2e, 0x80, 0x0e, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc0, 0x00, 0x00, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x20, 0x2e, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x96, 0x15, 0x20, 0xe0, 0x12, 0x7e, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0xc4, 0x0f, 0x00, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0xe0, 0x2d, + 0x20, 0x0e, 0x00, 0x06, 0x02, 0x08, 0x11, 0x02, 0x10, 0x17, 0x2f, 0x25, + 0x00, 0x00, 0x06, 0x09, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x12, 0x12, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x22, + 0x40, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x22, 0x40, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x41, 0x56, 0x02, 0x20, 0x07, 0x14, 0x14, 0x09, 0x41, 0x20, 0x80, 0x00, + 0xe8, 0x3a, 0xc0, 0x22, 0xc0, 0x02, 0x8d, 0x3a, 0x20, 0x01, 0x00, 0x00, + 0x5b, 0xe2, 0x00, 0x20, 0x01, 0x70, 0xbc, 0x29, 0x5b, 0x63, 0x07, 0x20, + 0x01, 0xb0, 0xbf, 0x2d, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x60, 0x07, 0x00, 0x82, 0x0e, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xe0, 0xfe, 0xff, 0xff, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x23, + 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xa0, 0x2d, 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x96, 0x6d, 0x20, 0x07, 0x1a, 0x18, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x60, 0x2d, 0xa0, 0x0d, 0x8d, 0x0a, 0x30, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x65, 0x20, 0x07, 0x18, 0x18, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xa0, 0x2d, 0xa0, 0x0d, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x23, 0x40, 0x03, 0x00, 0x06, + 0x03, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2d, + 0x60, 0x0d, 0x00, 0x06, 0x03, 0x5e, 0x20, 0x04, 0x40, 0x56, 0x02, 0x20, + 0xe7, 0x1c, 0x0e, 0x1c, 0x40, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x20, 0x2d, + 0xc0, 0x0e, 0x8d, 0x3a, 0x20, 0x0d, 0x8d, 0x00, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0xc0, 0x01, 0x00, 0x02, 0x03, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x90, 0x06, 0x00, 0xa2, 0x0d, 0x00, 0x00, + 0x01, 0x5e, 0x02, 0x04, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x5a, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x3e, 0x8e, 0xb8, 0x9e, 0x7d, 0x0c, 0x33, 0x6a, 0x02, 0xd3, 0x21, + 0x10, 0x00, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0xb0, 0x02, 0x00, 0x00, 0x67, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x5f, 0x6b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x33, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x28, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x1c, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, + 0x1c, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0x00, 0x2e, + 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x01, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x00, 0x23, + 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0x00, 0x03, 0xb1, 0x12, 0x00, 0x0e, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0xa0, 0x01, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x21, + 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x2e, 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x41, 0x96, 0x79, 0x20, 0x07, 0x0c, 0x0a, 0x08, 0x41, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x0e, 0x0e, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x2e, 0xc0, 0x0e, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x00, 0x22, + 0xc0, 0x01, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x80, 0x2e, 0xc0, 0x0e, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x72, 0x0c, 0x06, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x00, 0x0f, 0x8d, 0x0a, 0xc0, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0x20, 0x2e, 0xc0, 0x00, 0x00, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, + 0xc0, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0xe0, 0x2d, + 0x20, 0x0e, 0x00, 0x06, 0x01, 0x08, 0x11, 0x02, 0x10, 0x17, 0x7b, 0x25, + 0x00, 0x00, 0x06, 0x08, 0x40, 0x96, 0x01, 0x20, 0x07, 0x72, 0x72, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc0, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0x80, 0x22, 0x40, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x22, 0x40, 0x02, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x41, 0x56, 0x76, 0x20, 0x07, 0x14, 0x14, 0x08, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0xc0, 0x22, 0xc0, 0x02, 0x8d, 0x3a, + 0x18, 0x01, 0x00, 0x00, 0x5b, 0x02, 0x01, 0x20, 0x01, 0x80, 0xbc, 0x29, + 0x5b, 0x43, 0x07, 0x20, 0x01, 0xa0, 0xbf, 0x2d, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0x00, 0x01, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x40, 0x07, 0x00, 0xc2, 0x0e, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0xf0, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, + 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int gemver_Gen9core_gen_len = 8852; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cc new file mode 100644 index 0000000000..4ddcb29543 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cc @@ -0,0 +1,348 @@ +/** + * gesummv.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "gesummv.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_gesummv { +#include "../../polybenchUtilFuncts.h" +#include "gesummv_kernel.h" + + +char str_temp[1024]; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_kernel clKernel3; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem b_mem_obj; +cl_mem x_mem_obj; +cl_mem y_mem_obj; +cl_mem tmp_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int n, DATA_TYPE POLYBENCH_1D(y,N,n), DATA_TYPE POLYBENCH_1D(y_outputFromGpu,N,n)) +{ + int i, fail; + fail = 0; + + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + // Print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void init(int n, DATA_TYPE *alpha, DATA_TYPE *beta, DATA_TYPE POLYBENCH_2D(A,N,N,n,n), DATA_TYPE POLYBENCH_2D(B,N,N,n,n), + DATA_TYPE POLYBENCH_1D(x,N,n)) +{ + int i, j; + + *alpha = 43532; + *beta = 12313; + + for (i = 0; i < n; i++) + { + x[i] = ((DATA_TYPE) i) / N; + + for (j = 0; j < n; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / N; + B[i][j] = ((DATA_TYPE) i*j) / n; + } + } +} + + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("gesummv.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void gesummv(int n, DATA_TYPE alpha, DATA_TYPE beta, DATA_TYPE POLYBENCH_2D(A,N,N,n,n), DATA_TYPE POLYBENCH_2D(B,N,N,n,n), DATA_TYPE POLYBENCH_1D(tmp,N,n), + DATA_TYPE POLYBENCH_1D(x,N,n), DATA_TYPE POLYBENCH_1D(y,N,n)) +{ + int i, j; + + for (i = 0; i < _PB_N; i++) + { + tmp[i] = 0; + y[i] = 0; + for (j = 0; j < _PB_N; j++) + { + tmp[i] = A[i][j] * x[j] + tmp[i]; + y[i] = B[i][j] * x[j] + y[i]; + } + + y[i] = alpha * tmp[i] + beta * y[i]; + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,N,N,n,n), DATA_TYPE POLYBENCH_2D(B,N,N,n,n), DATA_TYPE POLYBENCH_1D(x,N,n), + DATA_TYPE POLYBENCH_1D(y,N,n), DATA_TYPE POLYBENCH_1D(tmp,N,n)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N * N, NULL, &errcode); + b_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N * N, NULL, &errcode); + x_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + y_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + tmp_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N * N, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, b_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N * N, B, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, x_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, x, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, y_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, y, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, tmp_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, tmp, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = gesummv_Gen9core_gen_len; + const unsigned char* kernel_bin = gesummv_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "gesummv_kernel", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel1\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int n, DATA_TYPE alpha, DATA_TYPE beta) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&x_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(cl_mem), (void *)&y_mem_obj); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(cl_mem), (void *)&tmp_mem_obj); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(DATA_TYPE), (void *)&alpha); + errcode |= clSetKernelArg(clKernel1, 6, sizeof(DATA_TYPE), (void *)&beta); + errcode |= clSetKernelArg(clKernel1, 7, sizeof(int), (void *)&n); + + if(errcode != CL_SUCCESS) printf("Error in seting arguments1\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel1\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(b_mem_obj); + errcode = clReleaseMemObject(x_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int n, + DATA_TYPE POLYBENCH_1D(y,N,n)) + +{ + int i; + + for (i = 0; i < n; i++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, y[i]); + if (i % 20 == 0) fprintf (stderr, "\n"); + } +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int n = N; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,N,N,n,n); + POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,N,N,n,n); + POLYBENCH_1D_ARRAY_DECL(tmp,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(x,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(y,DATA_TYPE,N,n); + POLYBENCH_1D_ARRAY_DECL(y_outputFromGpu,DATA_TYPE,N,n); + + init(n, &alpha, &beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(x)); + + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(tmp)); + cl_load_prog(); + + cl_launch_kernel(n, alpha, beta); + + errcode = clEnqueueReadBuffer(clCommandQue, y_mem_obj, CL_TRUE, 0, N*sizeof(DATA_TYPE), POLYBENCH_ARRAY(y_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + gesummv(n, alpha, beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(tmp), POLYBENCH_ARRAY(x), POLYBENCH_ARRAY(y)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(n, POLYBENCH_ARRAY(y), POLYBENCH_ARRAY(y_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(n, POLYBENCH_ARRAY(y_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(B); + POLYBENCH_FREE_ARRAY(tmp); + POLYBENCH_FREE_ARRAY(x); + POLYBENCH_FREE_ARRAY(y); + POLYBENCH_FREE_ARRAY(y_outputFromGpu); + + return 0; +} + +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cl new file mode 100644 index 0000000000..726be9a505 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.cl @@ -0,0 +1,36 @@ +/** + * gesummv.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + + +__kernel void gesummv_kernel(__global DATA_TYPE *a, __global DATA_TYPE *b, __global DATA_TYPE *x, __global DATA_TYPE *y, __global DATA_TYPE *tmp, DATA_TYPE alpha, DATA_TYPE beta, int n) +{ + int i = get_global_id(0); + + if (i < n) + { + int j; + for(j = 0; j < n; j++) + { + tmp[i] += a[i * n + j] * x[j]; + y[i] += b[i * n + j] * x[j]; + } + y[i] = alpha * tmp[i] + beta * y[i]; + } +} + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.h new file mode 100644 index 0000000000..e0768ff72f --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv.h @@ -0,0 +1,55 @@ +/** + * gesummv.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef GESUMMV_H +# define GESUMMV_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(N) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define N 1024 +# endif + +# ifdef SMALL_DATASET +#define N 2048 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define N 4096 +# endif + +# ifdef LARGE_DATASET +#define N 8192 +# endif + +# ifdef EXTRALARGE_DATASET +#define N 16384 +# endif +# endif /* !N */ + +# define _PB_N POLYBENCH_LOOP_BOUND(N,n) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 256 +#define DIM_LOCAL_WORK_GROUP_Y 1 + + +#endif /* !GESUMMV*/ \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv_kernel.h new file mode 100644 index 0000000000..8ea8b31c42 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/gesummv/gesummv_kernel.h @@ -0,0 +1,306 @@ +unsigned char gesummv_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x1e, 0xba, 0x42, 0xd4, 0x8e, 0x2e, 0x76, + 0xa3, 0xef, 0x14, 0x7f, 0x10, 0x00, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, + 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x67, 0x65, 0x73, 0x75, + 0x6d, 0x6d, 0x76, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x44, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x0b, 0x04, 0x07, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, + 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, 0x10, 0x16, 0x6f, 0x25, + 0x07, 0x00, 0x0b, 0x09, 0x10, 0x20, 0x80, 0x05, 0x20, 0x0a, 0x00, 0x20, + 0x40, 0x0f, 0x8d, 0x0a, 0x30, 0x01, 0x00, 0x00, 0x22, 0x00, 0xa1, 0x00, + 0x00, 0x0e, 0x00, 0x20, 0x88, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, + 0x10, 0x00, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, 0x30, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, + 0x30, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, + 0x06, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, 0x68, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xa0, 0x21, 0x60, 0x01, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x79, 0x20, + 0x07, 0x0d, 0x0d, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x00, 0x0f, 0x8d, 0x0a, 0x3c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x21, 0xa0, 0x01, 0x00, 0x06, 0x03, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x2e, 0x00, 0x0f, 0x00, 0x06, + 0x03, 0x5e, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x28, 0x02, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x60, 0x22, 0x60, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x41, 0x96, 0x6d, 0x20, 0x07, 0x11, 0x0b, 0x09, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x40, 0x0f, 0x8d, 0x0a, + 0x30, 0x01, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x15, 0x13, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2e, 0x40, 0x0e, 0x8d, 0x0a, + 0x40, 0x01, 0x00, 0x00, 0x40, 0x96, 0x79, 0x20, 0x07, 0x13, 0x13, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x0a, + 0x3c, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x6e, 0x11, 0x06, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xe0, 0x22, + 0x80, 0x0e, 0x8d, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x60, 0x2c, 0xa0, 0x02, 0x00, 0x06, + 0x04, 0x5e, 0x20, 0x04, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2d, + 0xc0, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x20, 0x23, 0xe0, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0xc0, 0x23, 0x00, 0x01, 0x00, 0x06, + 0x02, 0x08, 0x11, 0x02, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xe0, 0x23, + 0x00, 0x0e, 0x00, 0x06, 0x04, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x71, 0x20, + 0x07, 0x6a, 0x6c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x23, + 0x20, 0x03, 0x8d, 0x0a, 0x34, 0x01, 0x00, 0x00, 0x40, 0x96, 0x75, 0x20, + 0x07, 0x61, 0x6c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x20, 0x24, + 0x20, 0x03, 0x8d, 0x0a, 0x38, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x2c, 0x40, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2c, 0x60, 0x03, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, + 0xc0, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, 0x10, 0x17, 0x6f, 0x25, + 0x00, 0x00, 0x06, 0x09, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc0, 0x00, 0x00, 0x0a, 0x30, 0x01, 0x00, 0x00, 0x5b, 0x32, 0x06, 0x20, + 0x02, 0x18, 0x9f, 0x3d, 0x5b, 0xf3, 0x01, 0x20, 0x02, 0xf8, 0x94, 0x3d, + 0x33, 0x00, 0x80, 0x0c, 0x70, 0x30, 0x06, 0x00, 0xa2, 0x02, 0x00, 0x00, + 0x04, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, 0x70, 0xf0, 0x01, 0x00, + 0x02, 0x0e, 0x00, 0x00, 0x04, 0x5e, 0x02, 0x04, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x2b, 0x20, 0x0c, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0x80, 0x24, 0x00, 0x01, 0x00, 0x06, + 0x02, 0x08, 0x11, 0x02, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x60, 0x2b, + 0x60, 0x02, 0x00, 0x06, 0x03, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xa0, 0x2b, 0x20, 0x04, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x24, 0x40, 0x0e, 0x00, 0x06, + 0x03, 0x5e, 0x20, 0x04, 0x5b, 0xf2, 0x00, 0x20, 0x02, 0xd8, 0x7e, 0x49, + 0x5b, 0x63, 0x07, 0x20, 0x02, 0x28, 0x75, 0x49, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0xf0, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x03, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x60, 0x07, 0x00, 0x42, 0x0e, 0x00, 0x00, + 0x03, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x50, 0xfe, 0xff, 0xff, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x20, 0x2b, 0x60, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xe0, 0x24, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x41, 0x56, 0x66, 0x20, 0x07, 0x2b, 0x0f, 0x09, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x20, 0x2a, 0xc0, 0x0e, 0x8d, 0x3a, + 0x2c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x57, 0x59, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x20, 0x25, 0xe0, 0x04, 0x8d, 0x0a, + 0x40, 0x01, 0x00, 0x00, 0x40, 0x96, 0x79, 0x20, 0x07, 0x59, 0x59, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xe0, 0x24, 0xe0, 0x04, 0x8d, 0x0a, + 0x3c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2a, + 0xe0, 0x0a, 0x00, 0x06, 0x04, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x60, 0x2a, 0x20, 0x05, 0x00, 0x06, 0x04, 0x5e, 0x20, 0x04, + 0x5b, 0xb2, 0x02, 0x20, 0x02, 0x5a, 0x55, 0x13, 0x5b, 0x13, 0x05, 0x20, + 0x02, 0x8a, 0x4e, 0x13, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xb0, 0x02, 0x00, + 0x22, 0x0b, 0x00, 0x00, 0x03, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x10, 0x05, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x03, 0x5e, 0x02, 0x04, + 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x03, 0x00, + 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, + 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x6d, 0x70, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int gesummv_Gen9core_gen_len = 3636; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.cc new file mode 100644 index 0000000000..e63acda6e6 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.cc @@ -0,0 +1,366 @@ +/** + * mvt.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "mvt.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_mvt { +#include "../../polybenchUtilFuncts.h" +#include "mvt_kernel.h" + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem x1_mem_obj; +cl_mem x2_mem_obj; +cl_mem y1_mem_obj; +cl_mem y2_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; +const int LIST_SIZE = N; +char str_temp[1024]; + +#define RUN_ON_CPU + + +void compareResults(int n, DATA_TYPE POLYBENCH_1D(x1, N, n), DATA_TYPE POLYBENCH_1D(x1_outputFromGpu, N, n), DATA_TYPE POLYBENCH_1D(x2, N, n), DATA_TYPE POLYBENCH_1D(x2_outputFromGpu, N, n)) +{ + int i, fail; + fail = 0; + + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + + if (percentDiff(x2[i], x2_outputFromGpu[i]) > PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + + // Print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // // Load the kernel source code into the array source_str + // fp = fopen("mvt.cl", "r"); + // if (!fp) { + // fprintf(stdout, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init_array(int n, DATA_TYPE POLYBENCH_2D(A, N, N, n, n), DATA_TYPE POLYBENCH_1D(x1, N, n), DATA_TYPE POLYBENCH_1D(x2, N, n), DATA_TYPE POLYBENCH_1D(y1, N, n), DATA_TYPE POLYBENCH_1D(y2, N, n)) +{ + int i, j; + + for (i = 0; i < n; i++) + { + x1[i] = ((DATA_TYPE) i) / N; + x2[i] = ((DATA_TYPE) i + 1) / N; + y1[i] = ((DATA_TYPE) i + 3) / N; + y2[i] = ((DATA_TYPE) i + 4) / N; + for (j = 0; j < n; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / N; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(a,N,N,n,n), DATA_TYPE POLYBENCH_1D(x1,N,n), DATA_TYPE POLYBENCH_1D(x2,N,n), + DATA_TYPE POLYBENCH_1D(y_1,N,n), DATA_TYPE POLYBENCH_1D(y_2,N,n)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N * N, NULL, &errcode); + x1_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + x2_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + y1_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + y2_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * N, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N * N, a, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, x1_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, x1, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, x2_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, x2, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, y1_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, y_1, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, y2_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * N, y_2, 0, NULL, NULL); + + if(errcode != CL_SUCCESS) printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = mvt_Gen9core_gen_len; + const unsigned char* kernel_bin = mvt_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program %d\n",errcode); + + // Create the 1st OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "mvt_kernel1", &errcode); + // Create the 2nd OpenCL kernel + clKernel2 = clCreateKernel(clProgram, "mvt_kernel2", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int n) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)N) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = 1; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&x1_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&y1_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(int), (void *)&n); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel2, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel2, 1, sizeof(cl_mem), (void *)&x2_mem_obj); + errcode |= clSetKernelArg(clKernel2, 2, sizeof(cl_mem), (void *)&y2_mem_obj); + errcode |= clSetKernelArg(clKernel2, 3, sizeof(int), (void *)&n); + if(errcode != CL_SUCCESS) printf("Error in seting arguments\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel2, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel\n"); + + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseKernel(clKernel2); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(x1_mem_obj); + errcode = clReleaseMemObject(x2_mem_obj); + errcode = clReleaseMemObject(y1_mem_obj); + errcode = clReleaseMemObject(y2_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void runMvt(int n, DATA_TYPE POLYBENCH_2D(a, N, N, n, n), DATA_TYPE POLYBENCH_1D(x1, N, n), DATA_TYPE POLYBENCH_1D(x2, N, n), DATA_TYPE POLYBENCH_1D(y1, N, n), DATA_TYPE POLYBENCH_1D(y2, N, n)) +{ + int i, j; + + for (i=0; i<_PB_N; i++) + { + for (j=0; j + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + + +__kernel void mvt_kernel1(__global DATA_TYPE *a, __global DATA_TYPE *x1, __global DATA_TYPE *y1, int n) +{ + int i = get_global_id(0); + + if (i < n) + { + int j; + for (j=0; j < n; j++) + { + x1[i] += a[i * n + j] * y1[j]; + } + } +} + +__kernel void mvt_kernel2(__global DATA_TYPE *a, __global DATA_TYPE *x2, __global DATA_TYPE *y2, int n) +{ + int i = get_global_id(0); + + if (i < n) + { + int j; + for (j=0; j < n; j++) + { + x2[i] += a[j * n + i] * y2[j]; + } + } +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.h new file mode 100644 index 0000000000..a17707d7e1 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt.h @@ -0,0 +1,55 @@ +/** + * mvt.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef MVT_H +# define MVT_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(N) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define N 1024 +# endif + +# ifdef SMALL_DATASET +#define N 2048 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define N 4096 +# endif + +# ifdef LARGE_DATASET +#define N 8192 +# endif + +# ifdef EXTRALARGE_DATASET +#define N 16384 +# endif +# endif /* !N */ + +# define _PB_N POLYBENCH_LOOP_BOUND(N,n) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !MVT*/ diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt_kernel.h new file mode 100644 index 0000000000..81dfb7be6a --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/mvt/mvt_kernel.h @@ -0,0 +1,414 @@ +unsigned char mvt_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xbe, 0x79, 0x89, 0x31, 0xb2, 0xef, 0xd6, + 0x72, 0xbe, 0x4d, 0x09, 0x0c, 0x00, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, + 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x6d, 0x76, 0x74, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x31, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x24, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x03, 0x26, 0x0a, 0x00, 0x20, + 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0xa0, 0x22, + 0xc4, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, + 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x01, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x20, 0x2e, + 0xc4, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0x20, 0x0e, 0xb1, 0x12, 0xa0, 0x02, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x88, 0x01, 0x00, 0x00, + 0x88, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x21, + 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x2e, 0x40, 0x0f, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x41, 0x96, 0x75, 0x20, 0x07, 0x0c, 0x0a, 0x08, 0x41, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x0e, 0x0e, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x2e, 0xc0, 0x0e, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x00, 0x22, + 0xc0, 0x01, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0x80, 0x2e, 0xc0, 0x0e, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x72, 0x0c, 0x06, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x00, 0x0f, 0x8d, 0x0a, 0xc0, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, + 0xc0, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2e, 0x40, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0x80, 0x22, + 0x00, 0x01, 0x00, 0x06, 0x02, 0x08, 0x11, 0x02, 0x10, 0x17, 0x77, 0x25, + 0x00, 0x00, 0x06, 0x08, 0x40, 0x96, 0x79, 0x20, 0x07, 0x72, 0x72, 0x08, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, + 0xc0, 0x00, 0x00, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x2d, 0x40, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xa0, 0x2d, 0x40, 0x02, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x5b, 0x02, 0x01, 0x20, 0x02, 0x80, 0xbc, 0x29, + 0x5b, 0x43, 0x07, 0x20, 0x02, 0xa0, 0xb7, 0x29, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0x00, 0x01, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x40, 0x07, 0x00, 0xc2, 0x0e, 0x00, 0x00, + 0x01, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x08, 0xff, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, + 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x78, 0x31, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x79, 0x31, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x19, 0x4a, 0x9f, 0xb7, + 0x31, 0xb2, 0xef, 0xd6, 0x72, 0xbe, 0x4d, 0x09, 0x0c, 0x00, 0x00, 0x00, + 0x34, 0x05, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, + 0x6d, 0x76, 0x74, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x32, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x24, 0x01, 0x00, 0x0a, 0x64, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc8, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x03, + 0x26, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, + 0x40, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x20, + 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0x60, 0x22, 0xc8, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0a, 0x04, 0x07, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x40, 0x01, 0x8d, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x4a, 0x12, 0x60, 0x2e, 0xc8, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x20, 0x80, 0x02, 0x42, 0x12, 0x00, 0x20, 0x60, 0x0e, 0xb1, 0x12, + 0x60, 0x02, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, + 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x21, 0x40, 0x01, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, 0x40, 0x0f, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc0, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x0c, 0x0c, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0x00, 0x0f, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xc0, 0x21, 0x80, 0x01, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x2e, 0x00, 0x0f, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc0, 0x00, 0x00, 0x0a, 0x18, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x21, 0xc0, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0xc0, 0x00, 0x00, 0x1e, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x96, 0x15, 0x20, 0xe0, 0x10, 0x7e, 0x0a, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0xc4, 0x0f, 0x00, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x31, 0x00, 0x00, 0x0a, 0x0c, 0x02, 0x40, 0x22, + 0x00, 0x01, 0x00, 0x06, 0x02, 0x08, 0x11, 0x02, 0x10, 0x17, 0x77, 0x25, + 0x00, 0x00, 0x06, 0x08, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, + 0x00, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x40, 0x96, 0x79, 0x20, 0x07, 0x10, 0x10, 0x08, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2e, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, + 0x68, 0x02, 0xe0, 0x2d, 0x80, 0x0e, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x5b, 0xe2, 0x00, 0x20, 0x02, 0x70, 0xc4, 0x25, 0x5b, 0x63, 0x07, 0x20, + 0x02, 0xb0, 0xbf, 0x25, 0x33, 0x00, 0x80, 0x0c, 0x70, 0xe0, 0x00, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x60, 0x07, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xf8, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x00, 0x20, + 0x07, 0x7f, 0x03, 0x00, 0x31, 0x00, 0x60, 0x07, 0x04, 0x02, 0x00, 0x20, + 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x32, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x79, 0x32, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int mvt_Gen9core_gen_len = 4932; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cc new file mode 100644 index 0000000000..50e1fc02a3 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cc @@ -0,0 +1,367 @@ +/** + * syr2k.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "syr2k.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 0.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_syr2k { +#include "../../polybenchUtilFuncts.h" +#include "syr2k_kernel.h" + +char str_temp[1024]; + +DATA_TYPE acc; + +DATA_TYPE ALPHA = 1; +DATA_TYPE BETA = 1; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_kernel clKernel3; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem b_mem_obj; +cl_mem c_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int ni, DATA_TYPE POLYBENCH_2D(C, NI, NI, ni, ni), DATA_TYPE POLYBENCH_2D(C_outputFromGpu, NI, NI, ni, ni)) +{ + int i,j,fail; + fail = 0; + + // Compare C with D + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + } + + // print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // Load the kernel source code into the array source_str + // fp = fopen("syr2k.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init_arrays(int ni, int nj, + DATA_TYPE *alpha, + DATA_TYPE *beta, + DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni)) +{ + int i, j; + + *alpha = 32412; + *beta = 2123; + + for (i = 0; i < ni; i++) + { + for (j = 0; j < nj; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / ni; + B[i][j] = ((DATA_TYPE) i*j) / ni; + } + } + + for (i = 0; i < ni; i++) + { + for (j = 0; j < ni; j++) + { + C[i][j] = ((DATA_TYPE) i*j) / ni; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj), DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj), DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NI*NJ*sizeof(DATA_TYPE), NULL, &errcode); + b_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NI*NJ*sizeof(DATA_TYPE), NULL, &errcode); + c_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, NI*NI*sizeof(DATA_TYPE), NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, NI*NJ*sizeof(DATA_TYPE), A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, b_mem_obj, CL_TRUE, 0, NI*NJ*sizeof(DATA_TYPE), B, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NI*NI*sizeof(DATA_TYPE), C, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = syr2k_Gen9core_gen_len; + const unsigned char* kernel_bin = syr2k_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + + + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "syr2k_kernel", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel1\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int ni, int nj, DATA_TYPE alpha, DATA_TYPE beta) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NI) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NJ) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode = clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&b_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(DATA_TYPE), (void *)&alpha); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(DATA_TYPE), (void *)&beta); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(int), (void *)&ni); + errcode |= clSetKernelArg(clKernel1, 6, sizeof(int), (void *)&nj); + + if(errcode != CL_SUCCESS) printf("Error in setting arguments1\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel1\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(c_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void syr2kCpu(int ni, int nj, + DATA_TYPE alpha, + DATA_TYPE beta, + DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(B,NI,NJ,ni,nj), + DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni)) +{ + int i, j, k; + + /* C := alpha*A*B' + alpha*B*A' + beta*C */ + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NI; j++) + { + C[i][j] *= beta; + } + } + + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NI; j++) + { + for (k = 0; k < _PB_NJ; k++) + { + C[i][j] += alpha * A[i][k] * B[j][k]; + C[i][j] += alpha * B[i][k] * A[j][k]; + } + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int ni, DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni)) +{ + int i, j; + + for (i = 0; i < ni; i++) + for (j = 0; j < ni; j++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]); + if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int ni = NI; + int nj = NJ; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NJ,ni,nj); + POLYBENCH_2D_ARRAY_DECL(B,DATA_TYPE,NI,NJ,ni,nj); + POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NI,ni,ni); + POLYBENCH_2D_ARRAY_DECL(C_outputFromGpu,DATA_TYPE,NI,NI,ni,ni); + + init_arrays(ni, nj, &alpha, &beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + cl_load_prog(); + + cl_launch_kernel(ni, nj, alpha, beta); + + errcode = clEnqueueReadBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NI*NJ*sizeof(DATA_TYPE), POLYBENCH_ARRAY(C_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + syr2kCpu(ni, nj, alpha, beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(B), POLYBENCH_ARRAY(C)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(ni, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(C_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(ni, POLYBENCH_ARRAY(C_outputFromGpu))); + + #endif //RUN_ON_CPU + + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(B); + POLYBENCH_FREE_ARRAY(C); + POLYBENCH_FREE_ARRAY(C_outputFromGpu); + + return 0; +} + +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cl new file mode 100644 index 0000000000..d6f085df20 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.cl @@ -0,0 +1,37 @@ +/** + * syr2k.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + +__kernel void syr2k_kernel(__global DATA_TYPE *a, __global DATA_TYPE *b, __global DATA_TYPE *c, DATA_TYPE alpha, DATA_TYPE beta, int ni, int nj) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < nj) && (j < nj)) + { + c[i * nj + j] *= beta; + + int k; + for(k = 0; k < ni; k++) + { + c[i * nj + j] += alpha * a[i * ni + k] * b[j * ni + k] + alpha * b[i * ni + k] * a[j * ni + k]; + } + } +} + + diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.h new file mode 100644 index 0000000000..e6018bf9ac --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k.h @@ -0,0 +1,61 @@ +/** + * syr2k.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef SYR2K_H +# define SYR2K_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NI) && !defined(NJ) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define NI 256 +#define NJ 256 +# endif + +# ifdef SMALL_DATASET +#define NI 512 +#define NJ 512 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define NI 1024 +#define NJ 1024 +# endif + +# ifdef LARGE_DATASET +#define NI 2048 +#define NJ 2048 +# endif + +# ifdef EXTRALARGE_DATASET +#define NI 4096 +#define NJ 4096 +# endif +# endif /* !N */ + +# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni) +# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !SYR2K*/ \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k_kernel.h new file mode 100644 index 0000000000..0b0248af4a --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syr2k/syr2k_kernel.h @@ -0,0 +1,286 @@ +unsigned char syr2k_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0xe0, 0xe4, 0x31, 0x32, 0x25, 0x23, 0xb9, + 0x32, 0x32, 0xe5, 0xc4, 0x10, 0x00, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, + 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x73, 0x79, 0x72, 0x32, + 0x6b, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x60, 0x00, 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x00, 0x10, 0x00, 0x16, 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x2f, 0x34, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x20, 0x38, 0x01, 0x00, 0x0a, + 0xb8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc8, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x2f, 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, + 0x80, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, + 0xc0, 0x0f, 0x00, 0x12, 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, + 0xe0, 0x00, 0x00, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, + 0xc0, 0x01, 0x8d, 0x0a, 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, + 0x07, 0x0c, 0x0a, 0x07, 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, + 0x10, 0x20, 0x80, 0x05, 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, + 0x24, 0x01, 0x00, 0x00, 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x00, 0x02, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0x80, 0x01, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x48, 0x12, 0x00, 0x27, 0xc8, 0x0f, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0x60, 0x2c, + 0xc8, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, + 0x22, 0x0a, 0x00, 0x20, 0xc0, 0x0e, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, + 0x05, 0x20, 0x80, 0x02, 0x42, 0x12, 0x00, 0x20, 0x60, 0x0c, 0xb1, 0x12, + 0x00, 0x07, 0xb1, 0x00, 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, + 0x58, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x41, 0x96, 0x2d, 0x20, + 0x07, 0x74, 0x76, 0x09, 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x00, 0x02, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, 0x20, 0x01, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0c, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, + 0x40, 0x0f, 0x8d, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, + 0x80, 0x0e, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x96, 0x6d, 0x20, 0x07, 0x74, 0x74, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, 0x30, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x2e, 0x80, 0x0e, 0x00, 0x06, + 0x02, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x22, + 0x40, 0x02, 0x00, 0x06, 0x02, 0x5e, 0x20, 0x04, 0x41, 0x56, 0x7a, 0x20, + 0x07, 0x70, 0x72, 0x08, 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0xc0, 0x22, + 0x80, 0x02, 0x8d, 0x3a, 0x1c, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0x00, 0x07, 0x00, 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x60, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x58, 0x02, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, + 0x07, 0x6e, 0x76, 0x09, 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x23, + 0x00, 0x02, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x41, 0x96, 0x01, 0x20, + 0x07, 0x6c, 0x0c, 0x09, 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x23, + 0x40, 0x0f, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x1e, 0xc4, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x1c, 0x6e, 0x7e, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0x00, 0x03, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x24, 0x6c, 0x7e, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xa0, 0x2b, 0x40, 0x03, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x23, 0x80, 0x03, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2d, + 0x40, 0x0d, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x24, 0x80, 0x04, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x60, 0x2b, 0xa0, 0x0b, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x65, 0x20, 0x07, 0x57, 0x1e, 0x09, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x25, 0x00, 0x0d, 0x8d, 0x0a, + 0x2c, 0x01, 0x00, 0x00, 0x40, 0x96, 0x5d, 0x20, 0x07, 0x20, 0x1e, 0x09, + 0x40, 0x96, 0x5d, 0x20, 0x07, 0x53, 0x26, 0x09, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0xa0, 0x2a, 0xe0, 0x0a, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x2c, 0x00, 0x0d, 0x8d, 0x0a, + 0x28, 0x01, 0x00, 0x00, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x00, 0x26, + 0xc0, 0x05, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x26, 0x60, 0x0b, 0x8d, 0x0a, 0x28, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x24, 0x00, 0x04, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x40, 0x96, 0x65, 0x20, 0x07, 0x28, 0x26, 0x09, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2a, 0x60, 0x0a, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x2c, + 0xc0, 0x0c, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x20, 0x2b, 0x60, 0x0b, 0x8d, 0x0a, 0x2c, 0x01, 0x00, 0x00, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x26, 0x40, 0x06, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0x40, 0x25, + 0x00, 0x05, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc4, 0x2f, 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x25, 0x20, 0x0b, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x10, 0x17, 0x17, 0x25, 0x00, 0x00, 0x7e, 0x09, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc4, 0x0f, 0x00, 0x0a, + 0x20, 0x01, 0x00, 0x00, 0x41, 0x56, 0x76, 0x20, 0x07, 0x55, 0x55, 0x08, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x00, 0x26, 0x00, 0x06, 0x8d, 0x3a, + 0x18, 0x01, 0x00, 0x00, 0x41, 0x56, 0x76, 0x20, 0x07, 0x61, 0x22, 0x08, + 0x41, 0x56, 0x02, 0x20, 0xe7, 0x55, 0x55, 0x51, 0x41, 0x20, 0x80, 0x00, + 0xe8, 0x3a, 0xe0, 0x2b, 0x80, 0x0c, 0x8d, 0x3a, 0x18, 0x01, 0x00, 0x00, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x00, 0x26, 0x00, 0x06, 0x8d, 0x3a, + 0x80, 0x06, 0x8d, 0x00, 0x5b, 0xf2, 0x04, 0x20, 0x00, 0xa8, 0xaa, 0xc2, + 0x5b, 0x63, 0x03, 0x20, 0x00, 0x80, 0xb1, 0xbe, 0x40, 0x56, 0x02, 0x20, + 0xe7, 0x70, 0x70, 0x4f, 0x40, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0xc0, 0x22, + 0xc0, 0x02, 0x8d, 0x3a, 0xc0, 0x06, 0x8d, 0x00, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0x00, 0x07, 0x00, 0x82, 0x0e, 0x00, 0x00, 0x02, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x60, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, + 0x02, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0xe8, 0xfd, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, 0x31, 0x00, 0x60, 0x07, + 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, + 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x62, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x62, 0x65, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x69, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, + 0x69, 0x6e, 0x74, 0x3b, 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int syr2k_Gen9core_gen_len = 3388; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cc b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cc new file mode 100644 index 0000000000..47563f1b6f --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cc @@ -0,0 +1,349 @@ +/** + * syrk.c: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include "../../CL/cl.h" +#endif + +#define POLYBENCH_TIME 1 + +//select the OpenCL device to use (can be GPU, CPU, or Accelerator such as Intel Xeon Phi) +#define OPENCL_DEVICE_SELECTION CL_DEVICE_TYPE_GPU + +#include "syrk.h" +#include "../../polybench.h" + +//define the error threshold for the results "not matching" +#define PERCENT_DIFF_ERROR_THRESHOLD 1.05 + +#define MAX_SOURCE_SIZE (0x100000) + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +namespace ns_syrk { +#include "../../polybenchUtilFuncts.h" +#include "syrk_kernel.h" + +char str_temp[1024]; + +DATA_TYPE acc; + +cl_platform_id platform_id; +cl_device_id device_id; +cl_uint num_devices; +cl_uint num_platforms; +cl_int errcode; +cl_context clGPUContext; +cl_kernel clKernel1; +cl_kernel clKernel2; +cl_kernel clKernel3; +cl_command_queue clCommandQue; +cl_program clProgram; + +cl_mem a_mem_obj; +cl_mem c_mem_obj; + +FILE *fp; +char *source_str; +size_t source_size; + +#define RUN_ON_CPU + + +void compareResults(int ni, DATA_TYPE POLYBENCH_2D(C, NI, NI, ni, ni), DATA_TYPE POLYBENCH_2D(C_outputFromGpu, NI, NI, ni, ni)) +{ + int i,j,fail; + fail = 0; + + // Compare C with D + for (i=0; i PERCENT_DIFF_ERROR_THRESHOLD) + { + fail++; + } + } + } + + // print results + printf("Non-Matching CPU-GPU Outputs Beyond Error Threshold of %4.2f Percent: %d\n", PERCENT_DIFF_ERROR_THRESHOLD, fail); +} + + +void read_cl_file() +{ + // Load the kernel source code into the array source_str + // fp = fopen("syrk.cl", "r"); + // if (!fp) { + // fprintf(stderr, "Failed to load kernel.\n"); + // exit(1); + // } + // source_str = (char*)malloc(MAX_SOURCE_SIZE); + // source_size = fread( source_str, 1, MAX_SOURCE_SIZE, fp); + // fclose( fp ); +} + + +void init_arrays(int ni, int nj, + DATA_TYPE *alpha, + DATA_TYPE *beta, + DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni), + DATA_TYPE POLYBENCH_2D(A,NI,NJ,ni,nj)) +{ + int i, j; + + *alpha = 32412; + *beta = 2123; + for (i = 0; i < ni; i++) + { + for (j = 0; j < nj; j++) + { + A[i][j] = ((DATA_TYPE) i*j) / ni; + } + } + + for (i = 0; i < ni; i++) + { + for (j = 0; j < ni; j++) + { + C[i][j] = ((DATA_TYPE) i*j) / ni; + } + } +} + + +void cl_initialization() +{ + // Get platform and device information + errcode = clGetPlatformIDs(1, &platform_id, &num_platforms); + if(errcode == CL_SUCCESS) printf("number of platforms is %d\n",num_platforms); + else printf("Error getting platform IDs\n"); + + errcode = clGetPlatformInfo(platform_id,CL_PLATFORM_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform name is %s\n",str_temp); + else printf("Error getting platform name\n"); + + errcode = clGetPlatformInfo(platform_id, CL_PLATFORM_VERSION, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("platform version is %s\n",str_temp); + else printf("Error getting platform version\n"); + + errcode = clGetDeviceIDs( platform_id, OPENCL_DEVICE_SELECTION, 1, &device_id, &num_devices); + if(errcode == CL_SUCCESS) printf("number of devices is %d\n", num_devices); + else printf("Error getting device IDs\n"); + + errcode = clGetDeviceInfo(device_id,CL_DEVICE_NAME, sizeof(str_temp), str_temp,NULL); + if(errcode == CL_SUCCESS) printf("device name is %s\n",str_temp); + else printf("Error getting device name\n"); + + // Create an OpenCL context + clGPUContext = clCreateContext( NULL, 1, &device_id, NULL, NULL, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating context\n"); + + //Create a command-queue + clCommandQue = clCreateCommandQueue(clGPUContext, device_id, 0, &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating command queue\n"); +} + + +void cl_mem_init(DATA_TYPE POLYBENCH_2D(A,NJ,NI,nj,ni), DATA_TYPE POLYBENCH_2D(C,NJ,NI,nj,ni)) +{ + a_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NJ, NULL, &errcode); + c_mem_obj = clCreateBuffer(clGPUContext, CL_MEM_READ_WRITE, sizeof(DATA_TYPE) * NI * NJ, NULL, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating buffers\n"); + + errcode = clEnqueueWriteBuffer(clCommandQue, a_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NJ, A, 0, NULL, NULL); + errcode = clEnqueueWriteBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, sizeof(DATA_TYPE) * NI * NJ, C, 0, NULL, NULL); + if(errcode != CL_SUCCESS)printf("Error in writing buffers\n"); +} + + +void cl_load_prog() +{ + // Create a program from the kernel source + const size_t kernel_size = syrk_Gen9core_gen_len; + const unsigned char* kernel_bin = syrk_Gen9core_gen; + clProgram = clCreateProgramWithBinary(clGPUContext, 1, &device_id, &kernel_size, &kernel_bin, NULL, &errcode); + + + //clProgram = clCreateProgramWithSource(clGPUContext, 1, (const char **)&source_str, (const size_t *)&source_size, &errcode); + + if(errcode != CL_SUCCESS) printf("Error in creating program\n"); + + // Build the program + errcode = clBuildProgram(clProgram, 1, &device_id, NULL, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in building program\n"); + + // Create the OpenCL kernel + clKernel1 = clCreateKernel(clProgram, "syrk_kernel", &errcode); + if(errcode != CL_SUCCESS) printf("Error in creating kernel1\n"); + clFinish(clCommandQue); +} + + +void cl_launch_kernel(int ni, int nj, DATA_TYPE alpha, DATA_TYPE beta) +{ + size_t localWorkSize[2], globalWorkSize[2]; + localWorkSize[0] = DIM_LOCAL_WORK_GROUP_X; + localWorkSize[1] = DIM_LOCAL_WORK_GROUP_Y; + globalWorkSize[0] = (size_t)ceil(((float)NJ) / ((float)DIM_LOCAL_WORK_GROUP_X)) * DIM_LOCAL_WORK_GROUP_X; + globalWorkSize[1] = (size_t)ceil(((float)NI) / ((float)DIM_LOCAL_WORK_GROUP_Y)) * DIM_LOCAL_WORK_GROUP_Y; + + /* Start timer. */ + polybench_start_instruments; + + // Set the arguments of the kernel + errcode = clSetKernelArg(clKernel1, 0, sizeof(cl_mem), (void *)&a_mem_obj); + errcode |= clSetKernelArg(clKernel1, 1, sizeof(cl_mem), (void *)&c_mem_obj); + errcode |= clSetKernelArg(clKernel1, 2, sizeof(DATA_TYPE), (void *)&alpha); + errcode |= clSetKernelArg(clKernel1, 3, sizeof(DATA_TYPE), (void *)&beta); + errcode |= clSetKernelArg(clKernel1, 4, sizeof(int), (void *)&ni); + errcode |= clSetKernelArg(clKernel1, 5, sizeof(int), (void *)&nj); + + if(errcode != CL_SUCCESS) printf("Error in seting arguments1\n"); + + // Execute the OpenCL kernel + errcode = clEnqueueNDRangeKernel(clCommandQue, clKernel1, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in launching kernel1\n"); + clFinish(clCommandQue); + + /* Stop and print timer. */ + printf("GPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; +} + + +void cl_clean_up() +{ + // Clean up + errcode = clFlush(clCommandQue); + errcode = clFinish(clCommandQue); + errcode = clReleaseKernel(clKernel1); + errcode = clReleaseProgram(clProgram); + errcode = clReleaseMemObject(a_mem_obj); + errcode = clReleaseMemObject(c_mem_obj); + errcode = clReleaseCommandQueue(clCommandQue); + errcode = clReleaseContext(clGPUContext); + if(errcode != CL_SUCCESS) printf("Error in cleanup\n"); +} + + +void syrk(int ni, int nj, DATA_TYPE alpha, DATA_TYPE beta, DATA_TYPE POLYBENCH_2D(A, NI, NJ, ni, nj), DATA_TYPE POLYBENCH_2D(C, NI, NI, ni, ni)) +{ + int i, j, k; + + /* C := alpha*A*A' + beta*C */ + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NI; j++) + { + C[i][j] *= beta; + } + } + + for (i = 0; i < _PB_NI; i++) + { + for (j = 0; j < _PB_NI; j++) + { + for (k = 0; k < _PB_NJ; k++) + { + C[i][j] += alpha * A[i][k] * A[j][k]; + } + } + } +} + + +/* DCE code. Must scan the entire live-out data. + Can be used also to check the correctness of the output. */ +static +void print_array(int ni, DATA_TYPE POLYBENCH_2D(C,NI,NI,ni,ni)) +{ + int i, j; + + for (i = 0; i < ni; i++) + for (j = 0; j < ni; j++) { + fprintf (stderr, DATA_PRINTF_MODIFIER, C[i][j]); + if ((i * ni + j) % 20 == 0) fprintf (stderr, "\n"); + } + fprintf (stderr, "\n"); +} + + +int main(int argc, char *argv[]) +{ + /* Retrieve problem size. */ + int ni = NI; + int nj = NJ; + + /* Variable declaration/allocation. */ + DATA_TYPE alpha; + DATA_TYPE beta; + + POLYBENCH_2D_ARRAY_DECL(A,DATA_TYPE,NI,NJ,ni,nj); + POLYBENCH_2D_ARRAY_DECL(C,DATA_TYPE,NI,NI,ni,ni); + POLYBENCH_2D_ARRAY_DECL(C_outputFromGpu,DATA_TYPE,NI,NI,ni,ni); + + init_arrays(ni, nj, &alpha, &beta, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(A)); + read_cl_file(); + cl_initialization(); + cl_mem_init(POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(C)); + cl_load_prog(); + + cl_launch_kernel(ni, nj, alpha, beta); + + errcode = clEnqueueReadBuffer(clCommandQue, c_mem_obj, CL_TRUE, 0, NI * NJ * sizeof(DATA_TYPE), POLYBENCH_ARRAY(C_outputFromGpu), 0, NULL, NULL); + if(errcode != CL_SUCCESS) printf("Error in reading GPU mem\n"); + + #ifdef RUN_ON_CPU + + /* Start timer. */ + polybench_start_instruments; + + syrk(ni, nj, alpha, beta, POLYBENCH_ARRAY(A), POLYBENCH_ARRAY(C)); + + /* Stop and print timer. */ + printf("CPU Time in seconds:\n"); + polybench_stop_instruments; + polybench_print_instruments; + + compareResults(ni, POLYBENCH_ARRAY(C), POLYBENCH_ARRAY(C_outputFromGpu)); + + #else //prevent dead code elimination + + polybench_prevent_dce(print_array(ni, POLYBENCH_ARRAY(C_outputFromGpu))); + + #endif //RUN_ON_CPU + + cl_clean_up(); + + POLYBENCH_FREE_ARRAY(A); + POLYBENCH_FREE_ARRAY(C); + POLYBENCH_FREE_ARRAY(C_outputFromGpu); + + return 0; +} + +} \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cl b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cl new file mode 100644 index 0000000000..a32b946480 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.cl @@ -0,0 +1,35 @@ +/** + * syrk.cl: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#if defined(cl_khr_fp64) // Khronos extension available? +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#elif defined(cl_amd_fp64) // AMD extension available? +#pragma OPENCL EXTENSION cl_amd_fp64 : enable +#endif + +typedef float DATA_TYPE; + + +/* C := alpha*A*A' + beta*C */ +__kernel void syrk_kernel(__global DATA_TYPE *a, __global DATA_TYPE *c, DATA_TYPE alpha, DATA_TYPE beta, int ni, int nj) +{ + int j = get_global_id(0); + int i = get_global_id(1); + + if ((i < nj) && (j < nj)) + { + c[i * nj + j] *= beta; + int k; + for(k=0; k< ni; k++) + { + c[i * nj + j] += alpha * a[i * ni + k] * a[j * ni + k]; + } + } +} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.h new file mode 100644 index 0000000000..71e290ef4d --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk.h @@ -0,0 +1,61 @@ +/** + * syrk.h: This file is part of the PolyBench/GPU 1.0 test suite. + * + * + * Contact: Scott Grauer-Gray + * Will Killian + * Louis-Noel Pouchet + * Web address: http://www.cse.ohio-state.edu/~pouchet/software/polybench/GPU + */ + +#ifndef SYRK_H +# define SYRK_H + +/* Default to STANDARD_DATASET. */ +# if !defined(MINI_DATASET) && !defined(SMALL_DATASET) && !defined(LARGE_DATASET) && !defined(EXTRALARGE_DATASET) +# define MINI_DATASET +# endif + +/* Do not define anything if the user manually defines the size. */ +# if !defined(NI) && !defined(NJ) +/* Define the possible dataset sizes. */ +# ifdef MINI_DATASET +#define NI 256 +#define NJ 256 +# endif + +# ifdef SMALL_DATASET +#define NI 512 +#define NJ 512 +# endif + +# ifdef STANDARD_DATASET /* Default if unspecified. */ +#define NI 1024 +#define NJ 1024 +# endif + +# ifdef LARGE_DATASET +#define NI 2048 +#define NJ 2048 +# endif + +# ifdef EXTRALARGE_DATASET +#define NI 4096 +#define NJ 4096 +# endif +# endif /* !N */ + +# define _PB_NI POLYBENCH_LOOP_BOUND(NI,ni) +# define _PB_NJ POLYBENCH_LOOP_BOUND(NJ,nj) + +# ifndef DATA_TYPE +# define DATA_TYPE float +# define DATA_PRINTF_MODIFIER "%0.2lf " +# endif + +/* Thread block dimensions */ +#define DIM_LOCAL_WORK_GROUP_X 32 +#define DIM_LOCAL_WORK_GROUP_Y 8 + + +#endif /* !SYRK*/ \ No newline at end of file diff --git a/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk_kernel.h b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk_kernel.h new file mode 100644 index 0000000000..a822ed1b52 --- /dev/null +++ b/repos/hello_gpgpu/src/hello_gpgpu/benchmark/syrk/syrk_kernel.h @@ -0,0 +1,247 @@ +unsigned char syrk_Gen9core_gen[] = { + 0x43, 0x54, 0x4e, 0x49, 0x39, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa2, 0x29, 0x32, 0xb5, 0x6e, 0xb4, 0xf2, 0x58, + 0x9c, 0x33, 0x96, 0x7c, 0x0c, 0x00, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x73, 0x79, 0x72, 0x6b, + 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x00, 0x01, 0x00, 0x60, 0x00, + 0x0c, 0x02, 0xa0, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x16, + 0xc0, 0x04, 0xc0, 0x04, 0x41, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc0, 0x2f, + 0x28, 0x01, 0x00, 0x0a, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x2c, 0x0a, 0xc0, 0x20, 0x2c, 0x01, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4c, 0x16, 0xc4, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2f, + 0xc0, 0x0f, 0x00, 0x12, 0x40, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0xc0, 0x21, 0xc0, 0x00, 0x00, 0x12, 0x80, 0x00, 0xb1, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x21, 0xc0, 0x0f, 0x00, 0x12, + 0x20, 0x00, 0xb1, 0x00, 0x40, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x2f, + 0xc0, 0x00, 0x00, 0x12, 0x60, 0x00, 0xb1, 0x00, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2f, 0x80, 0x0f, 0x8d, 0x0a, 0xe0, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x22, 0xc0, 0x01, 0x8d, 0x0a, + 0xe4, 0x00, 0x00, 0x00, 0x40, 0x96, 0x01, 0x20, 0x07, 0x0c, 0x0a, 0x07, + 0x40, 0x96, 0x2d, 0x20, 0x07, 0x76, 0x78, 0x07, 0x10, 0x20, 0x80, 0x05, + 0x20, 0x0a, 0x00, 0x20, 0x40, 0x0f, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, 0x00, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0x80, 0x01, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x02, 0x20, 0x81, 0x00, + 0x48, 0x12, 0xa0, 0x2c, 0xc4, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x81, 0x00, 0x4a, 0x12, 0xc0, 0x24, 0xc4, 0x00, 0x00, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x81, 0x05, 0x22, 0x0a, 0x00, 0x20, + 0xc0, 0x0e, 0x8d, 0x0a, 0x1c, 0x01, 0x00, 0x00, 0x05, 0x20, 0x80, 0x02, + 0x42, 0x12, 0x00, 0x20, 0xc0, 0x04, 0xb1, 0x12, 0xa0, 0x0c, 0xb1, 0x00, + 0x22, 0x00, 0xa1, 0x00, 0x02, 0x0e, 0x00, 0x20, 0xa8, 0x02, 0x00, 0x00, + 0xa8, 0x02, 0x00, 0x00, 0x41, 0x96, 0x79, 0x20, 0x07, 0x74, 0x76, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, 0x00, 0x02, 0x8d, 0x0a, + 0x1c, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x03, 0x24, 0x0a, 0x00, 0x20, + 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x03, + 0x24, 0x0a, 0x00, 0x20, 0x18, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0xe7, 0x74, 0x74, 0x0c, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x22, 0x40, 0x02, 0x8d, 0x0a, 0x40, 0x0f, 0x8d, 0x00, + 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x2e, 0x80, 0x0e, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x74, 0x74, 0x09, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x22, + 0x40, 0x02, 0x8d, 0x0a, 0x24, 0x01, 0x00, 0x00, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0x40, 0x2e, 0x80, 0x0e, 0x00, 0x06, 0x01, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x80, 0x22, 0x40, 0x02, 0x00, 0x06, + 0x01, 0x5e, 0x20, 0x04, 0x41, 0x56, 0x72, 0x20, 0x07, 0x70, 0x72, 0x08, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0xc0, 0x22, 0x80, 0x02, 0x8d, 0x3a, + 0x14, 0x01, 0x00, 0x00, 0x33, 0x00, 0x80, 0x0c, 0x70, 0x00, 0x07, 0x00, + 0x82, 0x0e, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, 0x33, 0x20, 0x80, 0x0c, + 0x70, 0x60, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x20, 0x00, 0x11, 0x00, 0x04, 0x00, 0x00, 0x34, 0x00, 0x14, 0x00, 0x0e, + 0xa8, 0x01, 0x00, 0x00, 0x41, 0x96, 0x75, 0x20, 0x07, 0x6e, 0x76, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x00, 0x23, 0x00, 0x02, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x41, 0x96, 0x75, 0x20, 0x07, 0x6c, 0x0c, 0x08, + 0x41, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x23, 0x40, 0x0f, 0x8d, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x1e, 0xc4, 0x2f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x1c, 0x6e, 0x7e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, + 0x00, 0x03, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, 0x40, 0x96, 0x2d, 0x20, + 0x07, 0x66, 0x6c, 0x7e, 0x40, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x80, 0x24, + 0x40, 0x03, 0x8d, 0x0a, 0xc4, 0x0f, 0x00, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x23, 0x80, 0x03, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x09, 0x20, 0x80, 0x00, 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x1e, + 0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0x80, 0x00, 0x28, 0x0a, 0xc0, 0x2c, + 0xc0, 0x0c, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, 0x09, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x24, 0x80, 0x04, 0x8d, 0x1e, 0x02, 0x00, 0x02, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x1c, 0x1c, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x40, 0x2d, 0x40, 0x0d, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x40, 0x96, 0x01, 0x20, 0x07, 0x66, 0x66, 0x09, 0x40, 0x20, 0x80, 0x00, + 0x28, 0x0a, 0x80, 0x24, 0x80, 0x04, 0x8d, 0x0a, 0x20, 0x01, 0x00, 0x00, + 0x31, 0x00, 0x80, 0x0c, 0x68, 0x02, 0xc0, 0x23, 0x80, 0x03, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x00, 0x2d, + 0x40, 0x0d, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, 0x31, 0x00, 0x80, 0x0c, + 0x68, 0x02, 0x60, 0x2c, 0xc0, 0x0c, 0x00, 0x06, 0x00, 0x5e, 0x20, 0x04, + 0x31, 0x20, 0x80, 0x0c, 0x68, 0x02, 0x20, 0x2c, 0x80, 0x04, 0x00, 0x06, + 0x00, 0x5e, 0x20, 0x04, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x0a, 0xc4, 0x2f, + 0xc4, 0x0f, 0x00, 0x1e, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x80, 0x05, + 0x24, 0x0a, 0x00, 0x20, 0xc4, 0x0f, 0x00, 0x0a, 0x18, 0x01, 0x00, 0x00, + 0x10, 0x20, 0x80, 0x05, 0x24, 0x0a, 0x00, 0x20, 0xc4, 0x0f, 0x00, 0x0a, + 0x18, 0x01, 0x00, 0x00, 0x41, 0x56, 0x6e, 0x20, 0x07, 0x20, 0x1e, 0x08, + 0x41, 0x20, 0x80, 0x00, 0xe8, 0x3a, 0x40, 0x24, 0x00, 0x0d, 0x8d, 0x3a, + 0x10, 0x01, 0x00, 0x00, 0x5b, 0x02, 0x07, 0x20, 0x00, 0x80, 0x83, 0xc6, + 0x5b, 0x63, 0x01, 0x20, 0x00, 0xb0, 0x88, 0xc2, 0x33, 0x00, 0x80, 0x0c, + 0x70, 0x00, 0x07, 0x00, 0x82, 0x0e, 0x00, 0x00, 0x01, 0x5e, 0x02, 0x04, + 0x33, 0x20, 0x80, 0x0c, 0x70, 0x60, 0x01, 0x00, 0x42, 0x02, 0x00, 0x00, + 0x01, 0x5e, 0x02, 0x04, 0x20, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x34, + 0x00, 0x14, 0x00, 0x0e, 0x98, 0xfe, 0xff, 0xff, 0x25, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x4d, 0x00, 0x20, 0x07, 0x7f, 0x05, 0x00, 0x31, 0x00, 0x60, 0x07, + 0x04, 0x02, 0x00, 0x20, 0xe0, 0x0f, 0x00, 0x06, 0x10, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, 0x00, 0x00, 0x00, 0x03, + 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x83, + 0x00, 0x00, 0x00, 0x03, 0x7f, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, 0x3b, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, + 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x3b, 0x34, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x69, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6a, 0x00, 0x00, 0x69, 0x6e, 0x74, 0x3b, + 0x34, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x4e, 0x45, 0x00, 0x00, 0x00, 0x00 +}; +unsigned int syrk_Gen9core_gen_len = 2928; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/main.cc b/repos/hello_gpgpu/src/hello_gpgpu/main.cc index 3dc951de9b..12fa5a9b40 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/main.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/main.cc @@ -8,7 +8,9 @@ #include #include "CL/cl.h" -extern int main(int argc, char *argv[]); +// bench includes +#include "benchmark/benchmark_extern.h" + void testvm_construct(Genode::Env &env) { @@ -32,7 +34,17 @@ void testvm_construct(Genode::Env &env) // run 2mm Libc::with_libc([&] { clInitGenode(alloc); - main(0, 0); + ns_2mm::main(0,0); + ns_3mm::main(0, 0); + ns_atax::main(0,0); + ns_bicg::main(0,0); + ns_doitgen::main(0,0); + ns_gemm::main(0,0); + ns_gemver::main(0,0); + ns_gesummv::main(0,0); + ns_mvt::main(0,0); + ns_syr2k::main(0,0); + ns_syrk::main(0,0); }); Genode::log("hello gpgpu completed"); diff --git a/repos/hello_gpgpu/src/hello_gpgpu/polybench.cc b/repos/hello_gpgpu/src/hello_gpgpu/polybench.cc index 6055a4d5a4..91e82b866d 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/polybench.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/polybench.cc @@ -29,6 +29,7 @@ # define POLYBENCH_CACHE_SIZE_KB 32770 #endif +#define POLYBENCH_TIME 1 int polybench_papi_counters_threadid = POLYBENCH_THREAD_MONITOR; double polybench_program_total_flops = 0; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/polybench.h b/repos/hello_gpgpu/src/hello_gpgpu/polybench.h index 7d092e45d9..cd94ca5c7a 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/polybench.h +++ b/repos/hello_gpgpu/src/hello_gpgpu/polybench.h @@ -164,6 +164,7 @@ extern const unsigned int polybench_papi_eventlist[]; # define polybench_print_instruments polybench_papi_print(); # endif +#define POLYBENCH_TIME /* Timing support. */ # if defined(POLYBENCH_TIME) || defined(POLYBENCH_GFLOPS) diff --git a/repos/hello_gpgpu/src/hello_gpgpu/target.mk b/repos/hello_gpgpu/src/hello_gpgpu/target.mk index d85c6ce52b..dadbd17521 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/target.mk +++ b/repos/hello_gpgpu/src/hello_gpgpu/target.mk @@ -1,5 +1,5 @@ TARGET = hello_gpgpu -SRC_CC = main.cc test.cc CL/cl.cc 2mm.cc -LIBS = base libc +SRC_CC = main.cc test.cc polybench.cc CL/cl.cc benchmark/2mm/2mm.cc benchmark/3mm/3mm.cc benchmark/atax/atax.cc benchmark/bicg/bicg.cc benchmark/doitgen/doitgen.cc benchmark/gemm/gemm.cc benchmark/gemver/gemver.cc benchmark/gesummv/gesummv.cc benchmark/mvt/mvt.cc benchmark/syr2k/syr2k.cc benchmark/syrk/syrk.cc +LIBS = base libc CC_CXX_WARN_STRICT =