From b787da5643104613c6a5207b30b5a517cf24e5ae Mon Sep 17 00:00:00 2001 From: Anoop Saldanha Date: Thu, 15 Nov 2012 13:24:29 +0530 Subject: [PATCH] Remove all cuda related code in the engine except for the cuda api wrappers --- src/Makefile.am | 3 - src/alert-fastlog.c | 28 - src/alert-pcapinfo.c | 2 - src/app-layer-detect-proto.c | 254 --- src/cuda-packet-batcher.c | 1502 -------------- src/cuda-packet-batcher.h | 145 -- src/cuda-ptxdump.h | 2550 ----------------------- src/decode.h | 57 - src/detect-engine-mpm.c | 117 -- src/detect.c | 53 - src/detect.h | 13 - src/log-droplog.c | 2 - src/runmode-af-packet.c | 1 - src/runmode-erf-dag.c | 1 - src/runmode-erf-file.c | 1 - src/runmode-ipfw.c | 1 - src/runmode-nfq.c | 1 - src/runmode-pcap-file.c | 138 +- src/runmode-pcap.c | 1 - src/runmode-pfring.c | 1 - src/runmode-unix-socket.c | 1 - src/runmodes.c | 2 - src/suricata.c | 71 - src/tm-modules.c | 4 - src/tm-threads-common.h | 4 - src/util-cuda-handlers.c | 1068 ---------- src/util-cuda-handlers.h | 119 -- src/util-mpm-b2g-cuda.c | 3752 ---------------------------------- src/util-mpm-b2g-cuda.h | 144 -- src/util-mpm.c | 775 ------- src/util-mpm.h | 34 - src/util-runmodes.c | 107 - 32 files changed, 31 insertions(+), 10921 deletions(-) delete mode 100644 src/cuda-packet-batcher.c delete mode 100644 src/cuda-packet-batcher.h delete mode 100644 src/cuda-ptxdump.h delete mode 100644 src/util-cuda-handlers.c delete mode 100644 src/util-cuda-handlers.h delete mode 100644 src/util-mpm-b2g-cuda.c delete mode 100644 src/util-mpm-b2g-cuda.h diff --git a/src/Makefile.am b/src/Makefile.am index 6b50657397..e2f1e71ca9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,7 +32,6 @@ app-layer-tls-handshake.c app-layer-tls-handshake.h \ conf.c conf.h \ conf-yaml-loader.c conf-yaml-loader.h \ counters.c counters.h \ -cuda-packet-batcher.c cuda-packet-batcher.h \ data-queue.c data-queue.h \ decode.c decode.h \ decode-ethernet.c decode-ethernet.h \ @@ -257,7 +256,6 @@ util-coredump-config.c util-coredump-config.h \ util-cpu.c util-cpu.h \ util-crypt.c util-crypt.h \ util-cuda.c util-cuda.h \ -util-cuda-handlers.c util-cuda-handlers.h \ util-daemon.c util-daemon.h \ util-debug.c util-debug.h \ util-debug-filters.c util-debug-filters.h \ @@ -284,7 +282,6 @@ util-mpm-ac-bs.c util-mpm-ac-bs.h \ util-mpm-ac.c util-mpm-ac.h \ util-mpm-ac-gfbs.c util-mpm-ac-gfbs.h \ util-mpm-b2gc.c util-mpm-b2gc.h \ -util-mpm-b2g-cuda.c util-mpm-b2g-cuda.h \ util-mpm-b2g.c util-mpm-b2g.h \ util-mpm-b2gm.c util-mpm-b2gm.h \ util-mpm-b3g.c util-mpm-b3g.h \ diff --git a/src/alert-fastlog.c b/src/alert-fastlog.c index 9628186d0a..987a4583b8 100644 --- a/src/alert-fastlog.c +++ b/src/alert-fastlog.c @@ -51,8 +51,6 @@ #include "output.h" #include "alert-fastlog.h" -#include "util-mpm-b2g-cuda.h" -#include "util-cuda-handlers.h" #include "util-privs.h" #include "util-print.h" #include "util-proto-name.h" @@ -398,14 +396,6 @@ int AlertFastLogTest01() else result = 0; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadRC(); - if (SCCudaHlPushCudaContextFromModule("SC_RULES_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - SigGroupCleanup(de_ctx); SigCleanSignatures(de_ctx); DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx); @@ -464,14 +454,6 @@ int AlertFastLogTest02() result = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadRC(); - if (SCCudaHlPushCudaContextFromModule("SC_RULES_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - SigGroupCleanup(de_ctx); SigCleanSignatures(de_ctx); DetectEngineThreadCtxDeinit(&th_v, (void *)det_ctx); @@ -491,19 +473,9 @@ void AlertFastLogRegisterTests(void) #ifdef UNITTESTS -#ifdef __SC_CUDA_SUPPORT__ - UtRegisterTest("AlertFastLogCudaContextInit", - SCCudaHlTestEnvCudaContextInit, 1); -#endif - UtRegisterTest("AlertFastLogTest01", AlertFastLogTest01, 1); UtRegisterTest("AlertFastLogTest02", AlertFastLogTest02, 1); -#ifdef __SC_CUDA_SUPPORT__ - UtRegisterTest("AlertFastLogCudaContextDeInit", - SCCudaHlTestEnvCudaContextDeInit, 1); -#endif - #endif /* UNITTESTS */ } diff --git a/src/alert-pcapinfo.c b/src/alert-pcapinfo.c index ec68262e69..e24296003f 100644 --- a/src/alert-pcapinfo.c +++ b/src/alert-pcapinfo.c @@ -53,8 +53,6 @@ #include "output.h" #include "alert-pcapinfo.h" -#include "util-mpm-b2g-cuda.h" -#include "util-cuda-handlers.h" #include "util-privs.h" #include "util-print.h" #include "util-proto-name.h" diff --git a/src/app-layer-detect-proto.c b/src/app-layer-detect-proto.c index 03ee632e0f..ee78ae4519 100644 --- a/src/app-layer-detect-proto.c +++ b/src/app-layer-detect-proto.c @@ -60,16 +60,10 @@ #include "util-spm.h" #include "util-cuda.h" -#include "util-cuda-handlers.h" -#include "util-mpm-b2g-cuda.h" #include "util-debug.h" #define INSPECT_BYTES 32 -/* undef __SC_CUDA_SUPPORT__. We will get back to this later. Need to - * analyze the performance of cuda support for app layer */ -#undef __SC_CUDA_SUPPORT__ - /** global app layer detection context */ AlpProtoDetectCtx alp_proto_ctx; @@ -77,14 +71,8 @@ AlpProtoDetectCtx alp_proto_ctx; void AlpProtoInit(AlpProtoDetectCtx *ctx) { memset(ctx, 0x00, sizeof(AlpProtoDetectCtx)); -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(&ctx->toserver.mpm_ctx, MPM_B2G, -1); MpmInitCtx(&ctx->toclient.mpm_ctx, MPM_B2G, -1); -#else - ctx->alp_content_module_handle = SCCudaHlRegisterModule("SC_ALP_CONTENT_B2G_CUDA"); - MpmInitCtx(&ctx->toserver.mpm_ctx, MPM_B2G_CUDA, ctx->alp_content_module_handle); - MpmInitCtx(&ctx->toclient.mpm_ctx, MPM_B2G_CUDA, ctx->alp_content_module_handle); -#endif memset(&ctx->toserver.map, 0x00, sizeof(ctx->toserver.map)); memset(&ctx->toclient.map, 0x00, sizeof(ctx->toclient.map)); @@ -324,14 +312,6 @@ void AlpProtoFinalizeGlobal(AlpProtoDetectCtx *ctx) { mpm_table[ctx->toclient.mpm_ctx.mpm_type].Prepare(&ctx->toclient.mpm_ctx); mpm_table[ctx->toserver.mpm_ctx.mpm_type].Prepare(&ctx->toserver.mpm_ctx); -#ifdef __SC_CUDA_SUPPORT__ - CUcontext context; - if (SCCudaCtxPopCurrent(&context) == -1) - exit(EXIT_FAILURE); - if (B2gCudaStartDispatcherThreadAPC("SC_ALP_CONTENT_B2G_CUDA") == -1) - exit(EXIT_FAILURE); -#endif - /* allocate and initialize the mapping between pattern id and signature */ ctx->map = (AlpProtoSignature **)SCMalloc(ctx->sigs * sizeof(AlpProtoSignature *)); if (ctx->map == NULL) { @@ -406,31 +386,10 @@ uint16_t AppLayerDetectGetProtoPMParser(AlpProtoDetectCtx *ctx, uint32_t cnt = 0; /* do the mpm search */ -#ifndef __SC_CUDA_SUPPORT__ cnt = mpm_table[dir->mpm_ctx.mpm_type].Search(&dir->mpm_ctx, &tdir->mpm_ctx, &tdir->pmq, buf, searchlen); -#else - Packet *p = PacketGetFromAlloc(); - if (unlikely(p == NULL)) - goto end; - - p->cuda_done = 0; - p->cuda_free_packet = 1; - p->cuda_search = 0; - p->cuda_mpm_ctx = &dir->mpm_ctx; - p->cuda_mtc = &tdir->mpm_ctx; - p->cuda_pmq = &tdir->pmq; - p->payload = buf; - p->payload_len = searchlen; - B2gCudaPushPacketTo_tv_CMB2_APC(p); - SCMutexLock(&p->cuda_mutex_q); - SCCondWait(&p->cuda_cond_q, &p->cuda_mutex_q); - p->cuda_done = 1; - SCMutexUnlock(&p->cuda_mutex_q); - cnt = p->cuda_matches; -#endif SCLogDebug("search cnt %" PRIu32 "", cnt); if (cnt == 0) { proto = ALPROTO_UNKNOWN; @@ -745,14 +704,6 @@ int AlpDetectTest01(void) { int r = 1; AlpProtoDetectCtx ctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -771,13 +722,6 @@ int AlpDetectTest01(void) { AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -786,14 +730,6 @@ int AlpDetectTest02(void) { int r = 1; AlpProtoDetectCtx ctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -821,13 +757,6 @@ int AlpDetectTest02(void) { AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -838,14 +767,6 @@ int AlpDetectTest03(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -874,14 +795,6 @@ int AlpDetectTest03(void) { AlpProtoFinalizeGlobal(&ctx); AlpProtoFinalizeThread(&ctx, &tctx); -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - uint32_t cnt = mpm_table[ctx.toclient.mpm_ctx.mpm_type].Search(&ctx.toclient.mpm_ctx, &tctx.toclient.mpm_ctx, NULL, l7data, sizeof(l7data)); if (cnt != 1) { printf("cnt %u != 1: ", cnt); @@ -890,13 +803,6 @@ int AlpDetectTest03(void) { AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -907,14 +813,6 @@ int AlpDetectTest04(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -931,14 +829,6 @@ int AlpDetectTest04(void) { AlpProtoFinalizeGlobal(&ctx); AlpProtoFinalizeThread(&ctx, &tctx); -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - uint32_t cnt = mpm_table[ctx.toclient.mpm_ctx.mpm_type].Search(&ctx.toclient.mpm_ctx, &tctx.toclient.mpm_ctx, &tctx.toclient.pmq, l7data, sizeof(l7data)); if (cnt != 1) { printf("cnt %u != 1: ", cnt); @@ -947,13 +837,6 @@ int AlpDetectTest04(void) { AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -965,14 +848,6 @@ int AlpDetectTest05(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -1007,23 +882,8 @@ int AlpDetectTest05(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -1034,14 +894,6 @@ int AlpDetectTest06(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -1076,23 +928,8 @@ int AlpDetectTest06(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -1103,14 +940,6 @@ int AlpDetectTest07(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "http", IPPROTO_TCP, ALPROTO_HTTP, buf, 4, 0, STREAM_TOCLIENT); @@ -1133,23 +962,8 @@ int AlpDetectTest07(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -1171,14 +985,6 @@ int AlpDetectTest08(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "smb", IPPROTO_TCP, ALPROTO_SMB, buf, 8, 4, STREAM_TOCLIENT); @@ -1201,23 +1007,8 @@ int AlpDetectTest08(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } @@ -1236,14 +1027,6 @@ int AlpDetectTest09(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "smb2", IPPROTO_TCP, ALPROTO_SMB2, buf, 8, 4, STREAM_TOCLIENT); @@ -1266,22 +1049,8 @@ int AlpDetectTest09(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif return r; } @@ -1296,14 +1065,6 @@ int AlpDetectTest10(void) { AlpProtoDetectCtx ctx; AlpProtoDetectThreadCtx tctx; -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoInit(&ctx); AlpProtoAdd(&ctx, "dcerpc", IPPROTO_TCP, ALPROTO_DCERPC, buf, 4, 0, STREAM_TOCLIENT); @@ -1326,23 +1087,8 @@ int AlpDetectTest10(void) { r = 0; } -#ifdef __SC_CUDA_SUPPORT__ - B2gCudaKillDispatcherThreadAPC(); - if (SCCudaHlPushCudaContextFromModule("SC_ALP_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - return 0; - } -#endif - AlpProtoTestDestroy(&ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } -#endif - return r; } diff --git a/src/cuda-packet-batcher.c b/src/cuda-packet-batcher.c deleted file mode 100644 index 35c01a1926..0000000000 --- a/src/cuda-packet-batcher.c +++ /dev/null @@ -1,1502 +0,0 @@ -/** - * Copyright (c) 2010 Open Information Security Foundation. - * - * \author Anoop Saldanha - * - * \todo - * 1 Implement a gpu version of aho-corasick. That should get rid of a - * lot of post processing and pattern_chopping, and we don't have to - * deal with one or two byte patterns. (currently in process) - * 2 Use texture/shared memory. This should be handled along with 1 and 6. - * 3 Currently a lot of packets(~17k) are getting stuck on the detection - * thread, which is a major bottleneck. Introduce bypass detection - * threads for these 15k non buffered packets and check how the alerts - * are affected by this(out of sequence handling by detection threads). - * 4 Test the use of mapped memory(if possible anywhere). - * 5 Check parallelising memcopies with kernel execution. - * 6 Test this feature - Rearrange the packet stream(either on cpu or gpu), - * where each block in the gpu can access the packet with non-coalesced - * reads. - * 2 packets p1 -> aabb ccdd - * p2 -> eeff gghh - * - * stream -> aabbeeffccddgghh. - * - * Modify the block size to 16 threads for CC < 2.0 devices and 32 for - * for >= 2.0. - * - * The rearrangement of packet stream can be done on the gpu, with no - * perf degradation, using coalesced reads. Padding packets need to - * be addressed though. - * (Need to give more thought to this task). - * - * -- Feel free to pick any task from the agenda, but please - * drop a mail to dev mailing list(or directly to the dev team). Better - * yet, open a feature request on our bug/feature tracker - * (https://redmine.openinfosecfoundation.org/issues). Will be a mess if - * 2 or more devs end up working on the same task or related tasks. - */ - -/* compile in, only if we have a CUDA enabled on this machine */ -#ifdef __SC_CUDA_SUPPORT__ - -#include "suricata-common.h" -#include "suricata.h" - -#include "detect.h" -#include "decode.h" -#include "flow.h" -#include "data-queue.h" - -#include "threads.h" -#include "threadvars.h" -#include "tm-queuehandlers.h" -#include "tm-threads.h" - -#include "cuda-packet-batcher.h" -#include "conf.h" - -#include "util-error.h" -#include "util-debug.h" -#include "util-unittest.h" - -#include "util-mpm-b2g-cuda.h" -#include "util-cuda-handlers.h" -#include "detect-engine-address.h" -#include "detect-engine-port.h" -#include "detect-engine.h" -#include "detect-parse.h" -#include "tm-threads.h" -#include "tmqh-packetpool.h" -#include "util-mpm.h" - -/* \todo Make this user configurable through our yaml file. Also provide options - * where this can be dynamically updated based on the traffic */ -#define SC_CUDA_PB_BATCHER_ALARM_TIME 1 - -/* holds the inq and outq between the cuda-packet-batcher TM and the cuda b2g mpm - * dispatcher thread */ -static Tmq *tmq_inq = NULL; -static Tmq *tmq_outq = NULL; - -/* holds the packet inq between the batcher TM and, the TM feeding it packets - * in the runmode sequence. We will need this to implement the alarm. We will - * have a SIG_ALRM delivered every SC_CUDA_PB_BATCHER_ALARM_TIME seconds, after - * which we willf set a flag informing the batcher TM to queue the buffer to the - * GPU and wake the batcher thread, in case it is waiting on a conditional for a - * packet from the previous TM in the runmode */ -static Tmq *tmq_batcher_inq = NULL; - -/* used to indicate if we want to stop buffering the packets anymore. We - * we will need this while we want to shut the engine down - * \todo give a better description */ -static int run_batcher = 1; - -/* indicates the maximum no of packets we are ready to buffer. Theoretically the - * maximum value held by this var can't exceed the value held by - * "max_pending_packets". Either ways we should make this user configurable like - * SC_CUDA_PB_BATCHER_ALARM_TIME. Also allow dynamic updates to this value based - * on the traffic - * \todo make this user configurable, as well allow dynamic update of this - * variable based on the traffic seen */ -static uint32_t buffer_packet_threshhold = 0; - -/* the profile used by the cuda batcher */ -static MpmCudaConf *profile = NULL; - -/* flag used by the SIG_ALRM handler to indicate that the batcher TM should queue - * the buffer to be processed by the Cuda Mpm B2g Batcher Thread for further - * processing on the GPU */ -static int queue_buffer = 0; - -/* struct to configure the SIG_ALRM frequency. */ -static struct itimerval itimer = {{0, 0}, {0, 0}}; - -static int unittest_mode = 0; - -/** - * \internal - * \brief The SIG_ALRM handler. We will set the "queue_buffer" flag thus - * informing the batcher TM that it needs to queue the buffer. We - * also signal the cond var for the batcher TM inq(the one it - * receives packets from), incase it is waiting on the conditional - * for a new packet from the previous TM in the runmodes list. - * - * \param signum The signal number that this function just woke up to. In - * our case it is SIG_ALRM. - */ -static void SCCudaPBSetQueueBufferFlag(int signum) -{ - SCLogDebug("Cuda Packet Batche alarm generated after %f seconds. Set the" - "queue_buffer flag and signal the cuda TM inq.", - profile->batching_timeout); - queue_buffer = 1; - SCCondSignal(&((&trans_q[tmq_batcher_inq->id])->cond_q)); - - return; -} - -/** - * \internal. - * \brief Set the SIG_ALRM handler - */ -static void SCCudaPBSetBatcherAlarmTimeHandler() -{ - struct sigaction action; - - SCLogDebug("Setting the SIGALRM handler for the Cuda Batcher TM"); - action.sa_handler = SCCudaPBSetQueueBufferFlag; - sigemptyset(&(action.sa_mask)); - sigaddset(&(action.sa_mask), SIGALRM); - action.sa_flags = 0; - sigaction(SIGALRM, &action, 0); - - itimer.it_value.tv_sec = profile->batching_timeout; - itimer.it_value.tv_usec = (profile->batching_timeout - - (int32_t) profile->batching_timeout) * 1000000; - - return; -} - -/** - * \internal - * \brief Reset the batcher alarm. - */ -static inline void SCCudaPBResetBatcherAlarm() -{ - queue_buffer = 0; - - /* if we are running unittests, don't set the alarm handler. It will only - * cause a seg fault if the tests take too long */ - if (!unittest_mode) { - /* \todo We could update itimer dynamically based on the traffic */ - setitimer(ITIMER_REAL, &itimer, NULL); - } -} - -/** - * \internal - * \brief Used to retrieve the Signature Group Head for a packet. - * - * \param de_ctx Pointer the detection engine context to search for the - * sgh for an incoming packet. - * \param p Pointer to the incoming packet for which we will have to - * search for a sgh. - * - * \retval sgh Pointer to the relevant matching sgh for the Packet. - */ -static SigGroupHead *SCCudaPBGetSgh(DetectEngineCtx *de_ctx, Packet *p) -{ - int f; - SigGroupHead *sgh = NULL; - - /* select the flow_gh */ - if (p->flowflags & FLOW_PKT_TOCLIENT) - f = 0; - else - f = 1; - - /* find the right mpm instance */ - DetectAddress *ag = DetectAddressLookupInHead(de_ctx->flow_gh[f].src_gh[p->proto], &p->src); - if (ag != NULL) { - /* source group found, lets try a dst group */ - ag = DetectAddressLookupInHead(ag->dst_gh,&p->dst); - if (ag != NULL) { - if (ag->port == NULL) { - SCLogDebug("we don't have ports"); - sgh = ag->sh; - } else { - SCLogDebug("we have ports"); - - DetectPort *sport = DetectPortLookupGroup(ag->port,p->sp); - if (sport != NULL) { - DetectPort *dport = DetectPortLookupGroup(sport->dst_ph, p->dp); - if (dport != NULL) { - sgh = dport->sh; - } else { - SCLogDebug("no dst port group found for the packet with dp %"PRIu16, p->dp); - } - } else { - SCLogDebug("no src port group found for the packet with sp %"PRIu16, p->sp); - } - } - } else { - SCLogDebug("no dst address group found for the packet"); - } - } else { - SCLogDebug("no src address group found for the packet"); - } - - return sgh; -} - -/** - * \internal - * \brief Handles the queuing of the buffer from this batcher TM to the cuda - * mpm b2g dispatcher TM. - * - * \tctx The batcher thread context that holds the current operational buffer - * which has to be buffered by this function. - */ -static void SCCudaPBQueueBuffer(SCCudaPBThreadCtx *tctx) -{ - SCCudaPBPacketsBuffer *pb = (SCCudaPBPacketsBuffer *)tctx->curr_pb; - uint32_t nop_in_buffer = pb->nop_in_buffer; - uint32_t *packets_offset_buffer = pb->packets_offset_buffer; - uint32_t offset = *(packets_offset_buffer + nop_in_buffer - 1); - SCCudaPBPacketDataForGPU *last_packet = (SCCudaPBPacketDataForGPU *)(pb->packets_buffer + - offset); - - /* if we have no packets buffered in so far, get out */ - if (pb->nop_in_buffer == 0) { - SCLogDebug("No packets buffered in so far in the cuda buffer. Returning"); - return; - } - - /* calculate the total length of all the packets buffered in */ - pb->packets_buffer_len = pb->packets_offset_buffer[pb->nop_in_buffer - 1] + - sizeof(SCCudaPBPacketDataForGPUNonPayload) + - last_packet->payload_len; - - pb->packets_total_payload_len = pb->packets_payload_offset_buffer[pb->nop_in_buffer - 1] + - last_packet->payload_len; - - /* enqueue the buffer in the outq to be consumed by the dispatcher TM */ - SCDQDataQueue *dq_outq = &data_queues[tmq_outq->id]; - SCMutexLock(&dq_outq->mutex_q); - SCDQDataEnqueue(dq_outq, (SCDQGenericQData *)tctx->curr_pb); - SCCondSignal(&dq_outq->cond_q); - SCMutexUnlock(&dq_outq->mutex_q); - - while (run_batcher) { - /* dequeue a new buffer */ - SCDQDataQueue *dq_inq = &data_queues[tmq_inq->id]; - SCMutexLock(&dq_inq->mutex_q); - if (dq_inq->len == 0) { - /* if we have no data in queue, wait... */ - SCCondWait(&dq_inq->cond_q, &dq_inq->mutex_q); - } - - if (run_batcher == 0) { - break; - } - - if (dq_inq->len > 0) { - tctx->curr_pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(dq_inq); - tctx->curr_pb->nop_in_buffer = 0; - tctx->curr_pb->packets_buffer_len = 0; - tctx->curr_pb->packets_total_payload_len = 0; - SCMutexUnlock(&dq_inq->mutex_q); - SCLogDebug("Dequeued a new packet buffer for the cuda batcher TM"); - break; - } else { - /* Should only happen on signals. */ - SCMutexUnlock(&dq_inq->mutex_q); - SCLogDebug("Unable to Relooping in the quest to dequeue new buffer"); - } - } /* while (run_batcher) */ - - return; -} - -/** - * \brief Custom slot function used by the Batcher TM. - * - * \param td Pointer to the ThreadVars instance. In this case the batcher TM's - * ThreadVars instance. - */ -void *SCCudaPBTmThreadsSlot1(void *td) -{ - ThreadVars *tv = (ThreadVars *)td; - TmSlot *s = (TmSlot *)tv->tm_slots; - Packet *p = NULL; - char run = 1; - TmEcode r = TM_ECODE_OK; - - /* Set the thread name */ - SCSetThreadName(tv->name); - - if (tv->thread_setup_flags != 0) { - TmThreadSetupOptions(tv); - } - - SCLogDebug("%s starting", tv->name); - - if (s->SlotThreadInit != NULL) { - void *slot_data = NULL; - r = s->SlotThreadInit(tv, s->slot_initdata, &slot_data); - if (r != TM_ECODE_OK) { - EngineKill(); - - TmThreadsSetFlag(tv, THV_CLOSED | THV_RUNNING_DONE); - pthread_exit((void *) -1); - } - SC_ATOMIC_SET(s->slot_data, slot_data); - } - memset(&s->slot_pre_pq, 0, sizeof(PacketQueue)); - memset(&s->slot_post_pq, 0, sizeof(PacketQueue)); - - TmThreadsSetFlag(tv, THV_INIT_DONE); - while(run) { - TmSlotFunc SlotFunc = SC_ATOMIC_GET(s->SlotFunc); - TmThreadTestThreadUnPaused(tv); - - /* input a packet */ - p = tv->tmqh_in(tv); - - if (p == NULL) { - SCLogDebug("packet is NULL for TM: %s", tv->name); - /* the only different between the actual Slot1 function in - * tm-threads.c and this custom Slot1 function is this call - * here. We need to make the call here, even if we don't - * receive a packet from the previous stage in the runmodes. - * This is needed in cases where the SIG_ALRM handler - * wants us to queue the buffer to the GPU and ends up waking - * the Batcher TM(which is waiting on a cond from the previous - * feeder TM). Please handle the NULL packet case in the - * function that you now call */ - r = SlotFunc(tv, p, SC_ATOMIC_GET(s->slot_data), NULL, NULL); - } else { - r = SlotFunc(tv, p, SC_ATOMIC_GET(s->slot_data), NULL, NULL); - /* handle error */ - if (r == TM_ECODE_FAILED) { - TmqhOutputPacketpool(tv, p); - TmThreadsSetFlag(tv, THV_FAILED); - break; - } - - /* output the packet */ - tv->tmqh_out(tv, p); - } - - if (TmThreadsCheckFlag(tv, THV_KILL)) { - SCPerfSyncCounters(tv, 0); - run = 0; - } - } - - TmThreadsSetFlag(tv, THV_RUNNING_DONE); - TmThreadWaitForFlag(tv, THV_DEINIT); - - if (s->SlotThreadExitPrintStats != NULL) { - s->SlotThreadExitPrintStats(tv, SC_ATOMIC_GET(s->slot_data)); - } - - if (s->SlotThreadDeinit != NULL) { - r = s->SlotThreadDeinit(tv, SC_ATOMIC_GET(s->slot_data)); - if (r != TM_ECODE_OK) { - TmThreadsSetFlag(tv, THV_CLOSED); - pthread_exit((void *) -1); - } - } - - SCLogDebug("%s ending", tv->name); - TmThreadsSetFlag(tv, THV_CLOSED); - pthread_exit((void *) 0); -} - -/** - * \brief Used to de-allocate an instance of SCCudaPBPacketsBuffer. - * - * \param pb Pointer to the SCCudaPacketsBuffer instance to be de-alloced. - */ -void SCCudaPBDeAllocSCCudaPBPacketsBuffer(SCCudaPBPacketsBuffer *pb) -{ - if (pb == NULL) - return; - - if (pb->packets_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_buffer"); - } - } - if (pb->packets_offset_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_offset_buffer"); - } - } - if (pb->packets_payload_offset_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_payload_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory " - "packets_payload_offset_buffer"); - } - } - if (pb->packets_address_buffer != NULL) - SCFree(pb->packets_address_buffer); - - SCFree(pb); - - return; -} - -/** - * \brief Allocates a new instance of SCCudaPBPacketsBuffer. - * - * \param pb The newly created instance of SCCudaPBPacketsBuffer. - */ -SCCudaPBPacketsBuffer *SCCudaPBAllocSCCudaPBPacketsBuffer(void) -{ - SCCudaPBPacketsBuffer *pb = SCMalloc(sizeof(SCCudaPBPacketsBuffer)); - if (unlikely(pb == NULL)) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(pb, 0, sizeof(SCCudaPBPacketsBuffer)); - - /* Register new module, needed for some unit tests */ - if (SCCudaHlGetModuleHandle("SC_CUDA_PACKET_BATCHER") == -1) { - SCCudaHlRegisterModule("SC_CUDA_PACKET_BATCHER"); - } - - /* the buffer for the packets to be sent over to the gpu. We allot space for - * profile->packet_buffer_limit packets, assuming a size of - * profile->packet_size_limit for each packet */ - SCCudaHlModuleData *data = NULL; - data = SCCudaHlGetModuleData(SCCudaHlGetModuleHandle("SC_CUDA_PACKET_BATCHER")); - if (data == NULL) { - SCLogDebug("Module not registered. To avail the benefits of this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), after which you " - "can call this function"); - return NULL; - } - - if (SCCudaHlGetCudaContext(&data->cuda_context, "mpm", data->handle) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Error getting cuda context"); - return NULL; - } - - if (SCCudaCtxPushCurrent(data->cuda_context) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, - "Error pushing cuda context to allocate memory"); - } - - if (profile->page_locked) { - if (SCCudaMemHostAlloc((void**)&pb->packets_buffer, - profile->packet_buffer_limit * - (profile->packet_size_limit + - sizeof(SCCudaPBPacketDataForGPUNonPayload)), - CU_MEMHOSTALLOC_PORTABLE | - CU_MEMHOSTALLOC_WRITECOMBINED) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error allocating page-locked memory"); - exit(EXIT_FAILURE); - } - } else { - pb->packets_buffer = SCMalloc(profile->packet_buffer_limit * - (profile->packet_size_limit + - sizeof(SCCudaPBPacketDataForGPUNonPayload))); - if (pb->packets_buffer == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - } - memset(pb->packets_buffer, 0, profile->packet_buffer_limit * - (profile->packet_size_limit + sizeof(SCCudaPBPacketDataForGPUNonPayload))); - - if (profile->page_locked) { - /* used to hold the offsets of the buffered packets in the packets_buffer */ - if (SCCudaMemHostAlloc((void**)&pb->packets_offset_buffer, - sizeof(uint32_t) * profile->packet_buffer_limit, - CU_MEMHOSTALLOC_PORTABLE | - CU_MEMHOSTALLOC_WRITECOMBINED) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error allocating page-locked memory"); - exit(EXIT_FAILURE); - } - } else { - pb->packets_offset_buffer = SCMalloc(sizeof(uint32_t) * - profile->packet_buffer_limit); - if (pb->packets_offset_buffer == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - } - memset(pb->packets_offset_buffer, 0, - sizeof(uint32_t) * profile->packet_buffer_limit); - - if (profile->page_locked) { - /* used to hold the offsets of the packets payload */ - if (SCCudaMemHostAlloc((void**)&pb->packets_payload_offset_buffer, - sizeof(uint32_t) * profile->packet_buffer_limit, - CU_MEMHOSTALLOC_PORTABLE | - CU_MEMHOSTALLOC_WRITECOMBINED) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error allocating page-locked memory"); - exit(EXIT_FAILURE); - } - } else { - pb->packets_payload_offset_buffer = SCMalloc(sizeof(uint32_t) * - profile->packet_buffer_limit); - if (pb->packets_payload_offset_buffer == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - } - memset(pb->packets_payload_offset_buffer, 0, - sizeof(uint32_t) * profile->packet_buffer_limit); - - SCLogDebug("Allocated pagelocked CUDA memory"); - if (SCCudaCtxPopCurrent(NULL) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Could not pop cuda context"); - } - - /* used to hold the packet addresses for all the packets buffered inside - * packets_buffer */ - pb->packets_address_buffer = SCMalloc(sizeof(Packet *) * - profile->packet_buffer_limit); - if (pb->packets_address_buffer == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(pb->packets_address_buffer, 0, sizeof(Packet *) * - profile->packet_buffer_limit); - - return pb; -} - -/** - * \brief Registration function for the Cuda Packet Batcher TM. - */ -void TmModuleCudaPacketBatcherRegister(void) -{ - tmm_modules[TMM_CUDA_PACKET_BATCHER].name = "CudaPacketBatcher"; - tmm_modules[TMM_CUDA_PACKET_BATCHER].ThreadInit = SCCudaPBThreadInit; - tmm_modules[TMM_CUDA_PACKET_BATCHER].Func = SCCudaPBBatchPackets; - tmm_modules[TMM_CUDA_PACKET_BATCHER].ThreadExitPrintStats = SCCudaPBThreadExitStats; - tmm_modules[TMM_CUDA_PACKET_BATCHER].ThreadDeinit = SCCudaPBThreadDeInit; - tmm_modules[TMM_CUDA_PACKET_BATCHER].RegisterTests = SCCudaPBRegisterTests; - - return; -} - -/** - * \brief The cuda batcher TM init function. - * - * \param tv The cuda packet batcher TM ThreadVars instance. - * \param initdata The initialization data needed by this cuda batcher TM. - * \param data Pointer to a ponter memory location that would be updated - * with the newly created thread ctx instance. - * - * \retval TM_ECODE_OK On success. - * \retval TM_ECODE_FAILED On failure. - */ -TmEcode SCCudaPBThreadInit(ThreadVars *tv, void *initdata, void **data) -{ - SCCudaPBThreadCtx *tctx = NULL; - - if (initdata == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Invalid argument. initdata NULL " - "for the cuda batcher TM init thread function"); - return TM_ECODE_FAILED; - } - - tctx = SCMalloc(sizeof(SCCudaPBThreadCtx)); - if (unlikely(tctx == NULL)) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(tctx, 0, sizeof(SCCudaPBThreadCtx)); - - /* the detection engine context. We will need it to retrieve the sgh, - * when we start receiving and batching the packets */ - tctx->de_ctx = initdata; - - /* the first packet buffer from the queue */ - tctx->curr_pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tmq_inq->id]); - - /* register new module */ - SCCudaHlRegisterModule("SC_CUDA_PACKET_BATCHER"); - - *data = tctx; - - /* we will need the cuda packet batcher TM's inq for further use later. Read - * the comments associated with this var definition, for its use */ - tmq_batcher_inq = tv->inq; - - /* set the SIG_ALRM handler */ - SCCudaPBSetBatcherAlarmTimeHandler(); - - /* Set the alarm time limit during which the batcher thread would - * buffer packets */ - SCCudaPBResetBatcherAlarm(); - - return TM_ECODE_OK; -} - -/** - * \brief Batches packets into the packets buffer. - * - * \param tv Pointer to the ThreadVars instance, in this case the cuda packet - * batcher TM's TV instance. - * \param p Pointer the the packet to be buffered. - * \param data Pointer the the batcher TM thread ctx. - * \param pq Pointer to the packetqueue. We don't need this. - * - * \retval TM_ECODE_OK On success. - * \retval TM_ECODE_FAILED On failure. - */ -TmEcode SCCudaPBBatchPackets(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq, PacketQueue *post_pq) -{ -#define ALIGN_UP(offset, alignment) \ - (offset) = ((offset) + (alignment) - 1) & ~((alignment) - 1) - - SCCudaPBThreadCtx *tctx = data; - - /* ah. we have been signalled that we crossed the time limit within which we - * need to buffer packets. Let us queue the buffer to the GPU */ - if (queue_buffer) { - SCLogDebug("Cuda packet buffer TIME limit exceeded. Buffering packet " - "buffer and reseting the alarm"); - SCCudaPBQueueBuffer(tctx); - SCCudaPBResetBatcherAlarm(); - } - - /* this is possible, since we are using a custom slot function that calls this - * function, even if it receives no packet from the packet queue */ - if (p == NULL) { - SCLogDebug("packet NULL inside Cuda batcher TM"); - return TM_ECODE_OK; - } - - /* we set it for every incoming packet. We will set this depending on whether - * we end up buffering the packet or not */ - p->cuda_mpm_enabled = 0; - - /* packets that are too big are handled by the cpu */ - if (p->payload_len > SC_CUDA_PB_MAX_PAYLOAD_SIZE) { - SCLogDebug("p->payload_len %"PRIu16" > %d, inspecting on the CPU.", - p->payload_len, SC_CUDA_PB_MAX_PAYLOAD_SIZE); - return TM_ECODE_OK; - } - - /* the packets buffer */ - SCCudaPBPacketsBuffer *pb = (SCCudaPBPacketsBuffer *)tctx->curr_pb; - /* the previous packet which has been buffered into the packets_buffer */ - SCCudaPBPacketDataForGPU *prev_buff_packet = NULL; - /* holds the position in the packets_buffer where the curr packet would - * be buffered in */ - SCCudaPBPacketDataForGPU *curr_packet = NULL; - /* the sgh to which the incoming packet belongs */ - SigGroupHead *sgh = NULL; - - if (p->flow != NULL) { - /* Get the stored sgh from the flow (if any). Make sure we're not using - * the sgh for icmp error packets part of the same stream. */ - if (p->proto == p->flow->proto) { /* filter out icmp */ - if (p->flowflags & FLOW_PKT_TOSERVER && p->flow->flags & FLOW_SGH_TOSERVER) { - sgh = p->flow->sgh_toserver; - } else if (p->flowflags & FLOW_PKT_TOCLIENT && p->flow->flags & FLOW_SGH_TOCLIENT) { - sgh = p->flow->sgh_toclient; - } - } - } - - if (sgh == NULL) { - /* get the signature group head to which this packet belongs. If it belongs - * to no sgh, we don't need to buffer this packet. - * \todo Get rid of this, once we get the sgh from the flow */ - sgh = SCCudaPBGetSgh(tctx->de_ctx, p); - if (sgh == NULL) { - SCLogDebug("No SigGroupHead match for this packet"); - return TM_ECODE_OK; - } - } - - /* if the payload is less than the maximum content length in this sgh we - * don't need to run the PM on this packet. Chuck the packet out */ - if (sgh->mpm_content_maxlen > p->payload_len) { - SCLogDebug("not mpm-inspecting as pkt payload is smaller than " - "the largest content length we need to match"); - return TM_ECODE_OK; - } - - MpmCtx *mpm_ctx = NULL; - if (p->proto == IPPROTO_TCP) { - if (p->flowflags & FLOW_PKT_TOSERVER) - mpm_ctx = sgh->mpm_proto_tcp_ctx_ts; - else - mpm_ctx = sgh->mpm_proto_tcp_ctx_tc; - } else if (p->proto == IPPROTO_UDP) { - if (p->flowflags & FLOW_PKT_TOSERVER) - mpm_ctx = sgh->mpm_proto_udp_ctx_ts; - else - mpm_ctx = sgh->mpm_proto_udp_ctx_tc; - } else { - mpm_ctx = sgh->mpm_proto_other_ctx; - } - - /* if one of these conditions fail we don't have to run the mpm on this - * packet. Firstly if the payload_len is == 0, we don't have a payload - * to match against. Next if we don't have a mpm_context against this - * sgh, indicating we don't have any patterns in this sgh, again we don't - * have anything to run the PM against. Finally if the flow doesn't want - * to analyze packets for this flow, we can chuck this packet out as well */ - if ( !(p->payload_len > 0 && mpm_ctx != NULL && - !(p->flags & PKT_NOPAYLOAD_INSPECTION)) ) { - SCLogDebug("Either p->payload_len <= 0 or mpm_ctx for the packet is NULL " - "or PKT_NOPAYLOAD_INSPECTION set for this packet"); - return TM_ECODE_OK; - } - - /* the cuda b2g context */ - B2gCudaCtx *ctx = mpm_ctx->ctx; - - /* if we have a 1 byte search kernel set we don't buffer this packet for - * cuda matching and instead run this non-cuda mpm function to be run on - * the packet */ - if (ctx->Search == B2gCudaSearch1) { - SCLogDebug("The packet has a one byte patterns. run mpm " - "separately"); - return TM_ECODE_OK; - } - -#ifdef B2G_CUDA_SEARCH2 - /* if we have a 2 byte search kernel set we don't buffer this packet for - * cuda matching and instead run this non-cuda mpm function to be run on the - * packet */ - if (ctx->Search == B2gCudaSearch2) { - SCLogDebug("The packet has two byte patterns. run mpm " - "separately"); - return TM_ECODE_OK; - } -#endif - - /* we have passed all the criterions for buffering the packet. Set the - * flag indicating that the packet goes through cuda mpm */ - p->cuda_mpm_enabled = 1; - - /* first packet to be buffered in */ - if (pb->nop_in_buffer == 0) { - curr_packet = (SCCudaPBPacketDataForGPU *)pb->packets_buffer; - - /* buffer is not empty */ - } else { - prev_buff_packet = (SCCudaPBPacketDataForGPU *)(pb->packets_buffer + - pb->packets_offset_buffer[pb->nop_in_buffer - 1]); - curr_packet = (SCCudaPBPacketDataForGPU *)((uint8_t *)prev_buff_packet + - sizeof(SCCudaPBPacketDataForGPUNonPayload) + - prev_buff_packet->payload_len) ; - int diff = (int)((uint8_t *)curr_packet - pb->packets_buffer); - /* \todo Feel it is the wrong option taken by nvidia by setting CUdeviceptr - * to unsigned int. Keep this option for now. We will get back to this - * once nvidia responds to the filed bug */ - ALIGN_UP(diff, sizeof(CUdeviceptr)); - curr_packet = (SCCudaPBPacketDataForGPU *)(pb->packets_buffer + diff); - } - - /* store the data in the packets_buffer for this packet, which would be passed - * over to the GPU for processing */ - curr_packet->m = ((B2gCudaCtx *)(mpm_ctx->ctx))->m; - curr_packet->table = ((B2gCudaCtx *)(mpm_ctx->ctx))->cuda_B2G; - curr_packet->payload_len = p->payload_len; - memcpy(curr_packet->payload, p->payload, p->payload_len); - - /* store the address of the packet just buffered at the same index. The - * dispatcher thread will need this address to communicate the results back - * to the packet */ - pb->packets_address_buffer[pb->nop_in_buffer] = p; - - /* if it is the first packet to be buffered, the offset is 0. If it is not, - * then take the offset for the buffer from curr_packet */ - if (pb->nop_in_buffer == 0) { - pb->packets_offset_buffer[pb->nop_in_buffer] = 0; - pb->packets_payload_offset_buffer[pb->nop_in_buffer] = 0; - } else { - pb->packets_offset_buffer[pb->nop_in_buffer] = (uint8_t *)curr_packet - pb->packets_buffer; - pb->packets_payload_offset_buffer[pb->nop_in_buffer] = - pb->packets_payload_offset_buffer[pb->nop_in_buffer - 1] + - prev_buff_packet->payload_len; - } - - /* indicates the no of packets added so far into the buffer */ - pb->nop_in_buffer++; - - /* we have hit the threshhold for the total no of packets held in the buffer. - * We will change this in the future, instead relying on the remaining space - * left in the buffer or we have been informed that we have hit the time limit - * to queue the buffer */ - if ( (pb->nop_in_buffer == buffer_packet_threshhold) || queue_buffer) { - SCLogDebug("Either we have hit the threshold limit for packets(i.e. we " - "have %d packets limit) OR we have exceeded the buffering " - "time limit. Buffering the packet buffer and reseting the " - "alarm.", buffer_packet_threshhold); - SCCudaPBQueueBuffer(tctx); - SCCudaPBResetBatcherAlarm(); - } - - return TM_ECODE_OK; -} - -void SCCudaPBThreadExitStats(ThreadVars *tv, void *data) -{ - return; -} - -/** - * \brief The thread de-init function for the cuda packet batcher TM. - * - * \param tv Pointer to the cuda packet batcher TM ThreadVars instance. - * \param data Pointer the the Thread ctx for the cuda packet batcher TM. - * - * \retval TM_ECODE_OK On success. - * \retval TM_ECODE_FAILED On failure. Although we won't be returning this here. - */ -TmEcode SCCudaPBThreadDeInit(ThreadVars *tv, void *data) -{ - SCCudaPBThreadCtx *tctx = data; - - if (tctx != NULL) { - if (tctx->curr_pb != NULL) { - if (SCCudaHlPushCudaContextFromModule("SC_CUDA_PACKET_BATCHER") == -1){ - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, - "Failed to push cuda context from module"); - } - - SCCudaPBDeAllocSCCudaPBPacketsBuffer(tctx->curr_pb); - tctx->curr_pb = NULL; - - if (SCCudaCtxPopCurrent(NULL) == -1){ - SCLogError(SC_ERR_CUDA_ERROR, "Failed to pop cuda context"); - } - - if (SCCudaHlDeRegisterModule("SC_CUDA_PACKET_BATCHER") == -1){ - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Failed to deregister module"); - } - } - SCFree(tctx); - } - - return TM_ECODE_OK; -} - -/** - * \brief Sets up the queues and buffers needed by the cuda batcher TM function. - */ -void SCCudaPBSetUpQueuesAndBuffers(void) -{ - /* the b2g dispatcher thread would have to use the reverse for incoming - * and outgoing queues */ - char *inq_name = "cuda_batcher_mpm_inqueue"; - char *outq_name = "cuda_batcher_mpm_outqueue"; - int i = 0; - - /* set the incoming queue for the cuda_packet_batcher TM and the cuda B2g - * dispatcher */ - tmq_inq = TmqGetQueueByName(inq_name); - if (tmq_inq == NULL) { - tmq_inq = TmqCreateQueue(inq_name); - if (tmq_inq == NULL) { - return; - } - } - tmq_inq->reader_cnt++; - tmq_inq->writer_cnt++; - - /* set the outgoing queue from the cuda_packet_batcher TM and the cuda B2g - * dispatcher */ - tmq_outq = TmqGetQueueByName(outq_name); - if (tmq_outq == NULL) { - tmq_outq = TmqCreateQueue(outq_name); - if (tmq_outq == NULL) { - return; - } - } - tmq_outq->reader_cnt++; - tmq_outq->writer_cnt++; - - /* Register a new module to be used by the packet batcher to allocate - * page-locked memory */ - SCCudaHlRegisterModule("SC_CUDA_PACKET_BATCHER"); - - profile = SCCudaHlGetProfile("mpm"); - - /* allocate the packet buffer */ - /* \todo need to work out the right no of packet buffers that we need to - * queue. I doubt we will need more than 4(as long as we don't run it on - * low traffic line). We don't want to get into the business of creating - * new ones, when we run out of buffers, since malloc for a huge chunk - * like this will take time. We need to figure out a value based on - * various other parameters like alarm time and buffer threshold value */ - for (i = 0; i < profile->packet_buffers; i++) { - if (profile->page_locked) { - SCLogDebug("Allocating \"%d\" page_locked cuda packet buffers", - profile->packet_buffers); - } else { - SCLogDebug("Allocating \"%d\" non-page_locked cuda packet buffers", - profile->packet_buffers); - } - - SCCudaPBPacketsBuffer *pb = SCCudaPBAllocSCCudaPBPacketsBuffer(); - /* dump the buffer into the inqueue for this batcher TM. the batcher - * thread would be the first consumer for these buffers */ - SCDQDataEnqueue(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - } - - /* \todo This needs to be changed ASAP. This can't exceed max_pending_packets. - * Also we need to make this user configurable and allow dynamic updaes - * based on live traffic */ - buffer_packet_threshhold = profile->packet_buffer_limit; - - return; -} - -/** - * \brief Clean up all the buffers queued in. Need to write more on this. - */ -void SCCudaPBCleanUpQueuesAndBuffers(void) -{ - SCCudaPBPacketsBuffer *pb = NULL; - SCDQDataQueue *dq = NULL; - - if (tmq_inq == NULL || tmq_outq == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Invalid arguments. tmq_inq or " - "tmq_outq NULL"); - return; - } - if (SCCudaHlPushCudaContextFromModule("SC_CUDA_PACKET_BATCHER") == -1){ - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Could not push cuda context from module"); - } - - /* clean all the buffers present in the inq */ - dq = &data_queues[tmq_inq->id]; - SCMutexLock(&dq->mutex_q); - while ( (pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(dq)) != NULL) { - if (pb->packets_buffer != NULL) { - if (profile->page_locked) { - if (SCCudaMemFreeHost(pb->packets_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_buffer"); - } - } else { - SCFree(pb->packets_buffer); - } - } - if (pb->packets_offset_buffer != NULL) { - if (profile->page_locked) { - if (SCCudaMemFreeHost(pb->packets_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_offset_buffer"); - } - } else { - SCFree(pb->packets_offset_buffer); - } - } - if (pb->packets_payload_offset_buffer != NULL) { - if (profile->page_locked) { - if (SCCudaMemFreeHost(pb->packets_payload_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_payload_offset_buffer"); - } - } else { - SCFree(pb->packets_payload_offset_buffer); - } - } - - SCFree(pb); - } - SCMutexUnlock(&dq->mutex_q); - SCCondSignal(&dq->cond_q); - - /* clean all the buffers present in the outq */ - dq = &data_queues[tmq_outq->id]; - SCMutexLock(&dq->mutex_q); - while ( (pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(dq)) != NULL) { - if (pb->packets_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_buffer"); - } - } - if (pb->packets_offset_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_offset_buffer"); - } - } - if (pb->packets_payload_offset_buffer != NULL) { - if (SCCudaMemFreeHost(pb->packets_payload_offset_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "packets_payload_offset_buffer"); - } - } - - SCFree(pb); - } - if (SCCudaCtxPopCurrent(NULL) == -1){ - SCLogError(SC_ERR_CUDA_ERROR, "Could not pop cuda context"); - } - SCMutexUnlock(&dq->mutex_q); - SCCondSignal(&dq->cond_q); - - return; -} - -/** - * \brief Function used to set the packet threshhold limit in the packets buffer. - * - * \param threshhold_override The threshhold limit for the packets_buffer. - */ -void SCCudaPBSetBufferPacketThreshhold(uint32_t threshhold_override) -{ - buffer_packet_threshhold = threshhold_override; - - return; -} - -/** - * \brief Function used to set the profile for cuda packet batcher. Used - * for unittests alone. - */ -void SCCudaPBSetProfile(char *profile_name) -{ - profile = SCCudaHlGetProfile("mpm"); - - return; -} - -/** - * \brief Used to inform the cuda packet batcher that packet batching shouldn't - * be done anymore and set the flag to indicate this. We also need to - * signal the cuda batcher data inq, in case it is waiting on the inq - * for a new free packet buffer. - */ -void SCCudaPBKillBatchingPackets(void) -{ - run_batcher = 0; - SCDQDataQueue *dq = &data_queues[tmq_inq->id]; - SCCondSignal(&dq->cond_q); - - return; -} - -void SCCudaPBRunningTests(int status) -{ - unittest_mode = status; -} - -/***********************************Unittests**********************************/ - -#ifdef UNITTESTS - -int SCCudaPBTest01(void) -{ -#define ALIGN_UP(offset, alignment) \ - (offset) = ((offset) + (alignment) - 1) & ~((alignment) - 1) - - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - int result = 0; - SCCudaPBThreadCtx *tctx = NULL; - - Packet *p = SCMalloc(SIZE_OF_PACKET); - if (unlikely(p == NULL)) - return 0; - DecodeThreadVars dtv; - ThreadVars tv; - ThreadVars tv_cuda_PB; - DetectEngineCtx *de_ctx = NULL; - - SCCudaPBPacketsBuffer *pb = NULL; - SCCudaPBPacketDataForGPU *buff_packet = NULL; - SCDQDataQueue *dq = NULL; - - uint32_t i = 0; - - char *strings[] = {"test_one", - "test_two", - "test_three", - "test_four", - "test_five", - "test_six", - "test_seven", - "test_eight", - "test_nine", - "test_ten"}; - - uint32_t packets_payload_offset_buffer[sizeof(strings)/sizeof(char *)]; - memset(packets_payload_offset_buffer, 0, sizeof(packets_payload_offset_buffer)); - uint32_t packets_offset_buffer[sizeof(strings)/sizeof(char *)]; - memset(packets_offset_buffer, 0, sizeof(packets_offset_buffer)); - - uint32_t packets_total_payload_len = 0; - uint32_t packets_buffer_len = 0; - - for (i = 0; i < sizeof(strings)/sizeof(char *); i++) { - packets_total_payload_len += strlen(strings[i]); - } - - for (i = 1; i < sizeof(strings)/sizeof(char *); i++) { - packets_payload_offset_buffer[i] = packets_payload_offset_buffer[i - 1] + strlen(strings[i - 1]); - packets_offset_buffer[i] = packets_offset_buffer[i - 1] + - sizeof(SCCudaPBPacketDataForGPUNonPayload) + strlen(strings[i - 1]); - ALIGN_UP(packets_offset_buffer[i], sizeof(CUdeviceptr)); - } - packets_buffer_len += packets_offset_buffer[(sizeof(strings)/sizeof(char *)) - 1] + - sizeof(SCCudaPBPacketDataForGPUNonPayload) + strlen(strings[(sizeof(strings)/sizeof(char *)) - 1]); - - memset(p, 0, SIZE_OF_PACKET); - p->pkt = (uint8_t *)(p + 1); - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - memset(&tv_cuda_PB, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:1;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - SigGroupBuild(de_ctx); - - result = 1; - - SCCudaPBSetUpQueuesAndBuffers(); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - SCCudaPBRunningTests(1); - SCCudaPBThreadInit(&tv_cuda_PB, de_ctx, (void *)&tctx); - SCCudaPBSetBufferPacketThreshhold(sizeof(strings)/sizeof(char *)); - - p->payload = (uint8_t *)strings[0]; - p->payload_len = strlen(strings[0]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[1]; - p->payload_len = strlen(strings[1]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[2]; - p->payload_len = strlen(strings[2]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[3]; - p->payload_len = strlen(strings[3]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[4]; - p->payload_len = strlen(strings[4]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[5]; - p->payload_len = strlen(strings[5]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[6]; - p->payload_len = strlen(strings[6]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[7]; - p->payload_len = strlen(strings[7]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[8]; - p->payload_len = strlen(strings[8]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - p->payload = (uint8_t *)strings[9]; - p->payload_len = strlen(strings[9]); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 1); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 8); - - dq = &data_queues[tmq_outq->id]; - pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(dq); - if (pb == NULL) { - result = 0; - goto end; - } - result &= (dq->len == 0); - result &= (pb->nop_in_buffer == 10); - if (result == 0) - goto end; - - for (i = 0; i < pb->nop_in_buffer; i++) { - buff_packet = (SCCudaPBPacketDataForGPU *)(pb->packets_buffer + pb->packets_offset_buffer[i]); - result &= (strlen(strings[i]) == buff_packet->payload_len); - result &= (memcmp(strings[i], buff_packet->payload, buff_packet->payload_len) == 0); - if (result == 0) - goto end; - result &= (packets_payload_offset_buffer[i] == pb->packets_payload_offset_buffer[i]); - result &= (packets_offset_buffer[i] == pb->packets_offset_buffer[i]); - } - result &= (packets_total_payload_len == pb->packets_total_payload_len); - result &= (packets_buffer_len == pb->packets_buffer_len); - - end: - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - - SCCudaPBThreadDeInit(NULL, tctx); - SCFree(p); - return result; -} - -int SCCudaPBTest02(void) -{ - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - int result = 0; - const char *string = NULL; - SCCudaPBThreadCtx *tctx = NULL; - - Packet *p = SCMalloc(SIZE_OF_PACKET); - if (unlikely(p == NULL)) - return 0; - DecodeThreadVars dtv; - ThreadVars tv; - ThreadVars tv_cuda_PB; - DetectEngineCtx *de_ctx = NULL; - - SCCudaPBPacketsBuffer *pb = NULL; - SCDQDataQueue *dq = NULL; - - - memset(p, 0, SIZE_OF_PACKET); - p->pkt = (uint8_t *)(p + 1); - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - memset(&tv_cuda_PB, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - DecodeEthernet(&tv, &dtv, p, raw_eth, sizeof(raw_eth), NULL); - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any 5555 -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:1;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - SigGroupBuild(de_ctx); - - SCCudaPBSetUpQueuesAndBuffers(); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - SCCudaPBRunningTests(1); - SCCudaPBThreadInit(&tv_cuda_PB, de_ctx, (void *)&tctx); - - result = 1; - - string = "test_one"; - p->payload = (uint8_t *)string; - p->payload_len = strlen(string); - SCCudaPBBatchPackets(NULL, p, tctx, NULL, NULL); - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - pb = tctx->curr_pb; - result &= (pb->nop_in_buffer == 0); - - end: - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - - SCCudaPBThreadDeInit(NULL, tctx); - SCFree(p); - return result; -} - -#endif /* UNITTESTS */ - -void SCCudaPBRegisterTests(void) -{ - -#ifdef UNITTESTS - UtRegisterTest("SCCudaPBTest01", SCCudaPBTest01, 1); - UtRegisterTest("SCCudaPBTest02", SCCudaPBTest02, 1); -#endif - - return; -} - -#endif /* __SC_CUDA_SUPPORT__ */ diff --git a/src/cuda-packet-batcher.h b/src/cuda-packet-batcher.h deleted file mode 100644 index 277260cafe..0000000000 --- a/src/cuda-packet-batcher.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2010 Open Information Security Foundation. - * - * \author Anoop Saldanha - */ - -#ifndef __CUDA_PACKET_BATCHER_H__ -#define __CUDA_PACKET_BATCHER_H__ - -#include "suricata-common.h" - -/* compile in, only if we have a CUDA enabled on this machine */ -#ifdef __SC_CUDA_SUPPORT__ - -#include "util-cuda.h" - -/* The min no of packets that we allot the buffer for. We will make - * this user configurable(yaml) based on the traffic they expect. Either ways - * for a low/medium traffic network with occasional sgh matches, we shouldn't - * be enabling cuda. We will only end up screwing performance */ -#define SC_CUDA_PB_MIN_NO_OF_PACKETS 4000 - -/* the maximum payload size we're sending to the card (defined in decode.h) */ -#define SC_CUDA_PB_MAX_PAYLOAD_SIZE CUDA_MAX_PAYLOAD_SIZE - -/** - * \brief Implement the template SCDQGenericQData to transfer the cuda - * packet buffer from the cuda batcher thread to the dispatcher - * thread using the queue SCDQDataQueue. - */ -typedef struct SCCudaPBPacketsBuffer_ { - /* these members from the template SCDQGenericQData that have to be - * compulsarily implemented */ - struct SCDQGenericQData_ *next; - struct SCDQGenericQData_ *prev; - /* if we want to consider this pointer as the head of a list, this var - * holds the no of elements in the list */ - //uint16_t len; - /* in case this data instance is the head of a list, we can refer the - * bottomost instance directly using this var */ - //struct SCDQGenericaQData *bot; - - /* our own members from here on*/ - - /* current count of packets held in packets_buffer. nop = no of packets */ - uint32_t nop_in_buffer; - /* the packets buffer. We will assign buffer for SC_CUDA_PB_MIN_NO_OF_PACKETS - * packets. Basically the size of this buffer would be - * SC_CUDA_PB_MIN_NO_OF_PACKETS * sizeof(SCCudaPBPacketDataForGPU), so that - * we can hold mininum SC_CUDA_PB_MIN_NO_OF_PACKETS */ - uint8_t *packets_buffer; - /* length of data buffered so far in packets_buffer, which would be sent - * to the GPU. We will need this to copy the buffered data from the - * packets_buffer here on the host, to the buffer on the GPU */ - uint32_t packets_buffer_len; - /* packet offset within the packets_buffer. Each packet would be stored in - * packets buffer at a particular offset. This buffer would indicate the - * offset of a packet inside the packet buffer. We will allot space to hold - * offsets for SC_CUDA_PB_MIN_NO_OF_PACKETS packets - * \todo change it to holds offsets for more than SC_CUDA_PB_MIN_NO_OF_PACKETS - * when we use the buffer to hold packets based on the remaining size in the - * buffer rather than on a fixed limit like SC_CUDA_PB_MIN_NO_OF_PACKETS */ - uint32_t *packets_offset_buffer; - - /* the total packet payload lengths buffered so far. We will need this to - * transfer the total length of the results buffer that has to be transferred - * back from the gpu */ - uint32_t packets_total_payload_len; - /* the payload offsets for the different payload lengths buffered in. For - * example if we buffer 4 packets of lengths 3, 4, 5, 6, we will store four - * offsets in the buffer {0, 3, 7, 12, 18} */ - uint32_t *packets_payload_offset_buffer; - - /* packet addresses for all the packets buffered in the packets_buffer. We - * will allot space to hold packet addresses for SC_CUDA_PB_MIN_NO_OF_PACKETS. - * We will need this, so that the cuda mpm b2g dispatcher thread can inform - * and store the b2g cuda mpm results for the packet*/ - Packet **packets_address_buffer; -} SCCudaPBPacketsBuffer; - -/** - * \brief Structure for each packet that is being batched to the GPU. - */ -typedef struct SCCudaPBPacketDataForGPU_ { - /* holds B2gCudaCtx->m */ - unsigned int m; - /* holds B2gCudaCtx->cuda_B2g */ - CUdeviceptr table; - /* holds the length of the payload */ - unsigned int payload_len; - /* holds the payload. While we actually store the payload in the buffer, - * we may not end up using the entire 1480 bytes if the payload is smaller */ - uint8_t payload[SC_CUDA_PB_MAX_PAYLOAD_SIZE]; -} SCCudaPBPacketDataForGPU; - -/** - * \brief Same as struct SCCudaPBPacketDataForGPU_ except for the payload part. - * We will need this for calculating the size of the non-payload part - * of the packet data to be buffered. - */ -typedef struct SCCudaPBPacketDataForGPUNonPayload_ { - /* holds B2gCudaCtx->m */ - unsigned int m; - /* holds B2gCudaCtx->cuda_B2g */ - CUdeviceptr table; - /* holds the length of the payload */ - unsigned int payload_len; -} SCCudaPBPacketDataForGPUNonPayload; - -/** - * \brief The cuda packet batcher threading context. - */ -typedef struct SCCudaPBThreadCtx_ { - /* we need the detection engine context to retrieve the sgh while we start - * receiving and batching the packets */ - DetectEngineCtx *de_ctx; - - /* packets buffer currently in use inside the cuda batcher thread */ - SCCudaPBPacketsBuffer *curr_pb; -} SCCudaPBThreadCtx; - -SCCudaPBPacketsBuffer *SCCudaPBAllocSCCudaPBPacketsBuffer(void); -void SCCudaPBDeAllocSCCudaPBPacketsBuffer(SCCudaPBPacketsBuffer *); - -void SCCudaPBSetBufferPacketThreshhold(uint32_t); -void SCCudaPBCleanUpQueuesAndBuffers(void); -void SCCudaPBSetUpQueuesAndBuffers(void); -void SCCudaPBKillBatchingPackets(void); - -TmEcode SCCudaPBBatchPackets(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); -TmEcode SCCudaPBThreadInit(ThreadVars *, void *, void **); -TmEcode SCCudaPBThreadDeInit(ThreadVars *, void *); -void SCCudaPBThreadExitStats(ThreadVars *, void *); -void SCCudaPBRegisterTests(void); - -void TmModuleCudaPacketBatcherRegister(void); - -void *SCCudaPBTmThreadsSlot1(void *); - -void SCCudaPBRunningTests(int); -void SCCudaPBSetProfile(char *); - -#endif /* __SC_CUDA_SUPPORT__ */ - -#endif /* __CUDA_PACKET_BATCHER_H__ */ diff --git a/src/cuda-ptxdump.h b/src/cuda-ptxdump.h deleted file mode 100644 index 45ccdc654a..0000000000 --- a/src/cuda-ptxdump.h +++ /dev/null @@ -1,2550 +0,0 @@ -/* Auto-generated by ptxdump.py DO NOT EDIT -* -* This file contains the ptx code of the Cuda kernels. -* A kernel is identified by its name and the compute capability (e.g. _sm_10). -*/ -#ifdef __SC_CUDA_SUPPORT__ -#ifndef __ptxdump_h__ -#define __ptxdump_h__ - -const unsigned char util_mpm_b2g_cuda_kernel_sm_10[6760] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x34, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x31, 0x30, 0x2c, 0x20, 0x6d, 0x61, -0x70, 0x5f, 0x66, 0x36, 0x34, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x36, 0x37, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x38, 0x63, 0x4c, -0x33, 0x78, 0x63, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x31, 0x30, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x36, 0x37, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x31, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x25, 0x72, 0x68, 0x3c, 0x36, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, -0x3c, 0x36, 0x34, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, -0x64, 0x20, 0x25, 0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x35, 0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x31, 0x2c, 0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x31, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x63, 0x76, -0x74, 0x2e, 0x75, 0x33, 0x32, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, -0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x34, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x31, 0x20, 0x62, 0x72, 0x61, -0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x62, -0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, -0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, -0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3a, 0x0a, 0x09, -0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, -0x25, 0x72, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x38, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x37, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, -0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, -0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, -0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x39, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, -0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, -0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, -0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, -0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, -0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, -0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, -0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x75, -0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, -0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, -0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, -0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, -0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x31, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, -0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x33, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, -0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x35, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, -0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x37, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, -0x39, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x39, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, -0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, -0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, -0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, -0x38, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x31, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, -0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, -0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, -0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, -0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, -0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x35, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, -0x36, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, -0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, -0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, -0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, -0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x30, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x37, 0x30, 0x36, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, -0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, -0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, -0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, -0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x68, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x68, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x32, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x36, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x3b, 0x0a, 0x09, 0x73, -0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, -0x72, 0x34, 0x36, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x37, 0x39, 0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, -0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, -0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, -0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, -0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, -0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x37, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, -0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, -0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, -0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x34, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, -0x30, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x35, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, -0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x30, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x35, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x33, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x35, 0x33, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, -0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x35, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x35, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x3b, 0x0a, -0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, 0x09, 0x40, -0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3a, 0x0a, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, -0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x38, -0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, -0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, -0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, -0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, -0x09, 0x5b, 0x25, 0x72, 0x32, 0x32, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x32, 0x3b, -0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x3b, -0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x7d, 0x20, -0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char util_mpm_b2g_cuda_kernel_sm_11[6760] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x34, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x31, 0x31, 0x2c, 0x20, 0x6d, 0x61, -0x70, 0x5f, 0x66, 0x36, 0x34, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x38, 0x62, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x4b, 0x4b, 0x51, -0x68, 0x4d, 0x33, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x31, 0x31, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x38, 0x62, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x31, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x25, 0x72, 0x68, 0x3c, 0x36, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, -0x3c, 0x36, 0x34, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, -0x64, 0x20, 0x25, 0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x35, 0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x31, 0x2c, 0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x31, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x63, 0x76, -0x74, 0x2e, 0x75, 0x33, 0x32, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, -0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x34, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x31, 0x20, 0x62, 0x72, 0x61, -0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x62, -0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, -0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, -0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3a, 0x0a, 0x09, -0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, -0x25, 0x72, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x38, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x37, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, -0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, -0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, -0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x39, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, -0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, -0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, -0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, -0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, -0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, -0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, -0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x75, -0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, -0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, -0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, -0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, -0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x31, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, -0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x33, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, -0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x35, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, -0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x37, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, -0x39, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x39, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, -0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, -0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, -0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, -0x38, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x31, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, -0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, -0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, -0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, -0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, -0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x35, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, -0x36, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, -0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, -0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, -0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, -0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x30, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x37, 0x30, 0x36, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, -0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, -0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, -0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, -0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x68, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x68, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x32, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x36, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x3b, 0x0a, 0x09, 0x73, -0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, -0x72, 0x34, 0x36, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x37, 0x39, 0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, -0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, -0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, -0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, -0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, -0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x37, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, -0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, -0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, -0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x34, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, -0x30, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x35, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, -0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x30, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x35, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x33, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x35, 0x33, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, -0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x35, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x35, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x3b, 0x0a, -0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, 0x09, 0x40, -0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3a, 0x0a, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, -0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x38, -0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, -0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, -0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, -0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, -0x09, 0x5b, 0x25, 0x72, 0x32, 0x32, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x32, 0x3b, -0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x3b, -0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x7d, 0x20, -0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char util_mpm_b2g_cuda_kernel_sm_12[6760] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x34, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x2c, 0x20, 0x6d, 0x61, -0x70, 0x5f, 0x66, 0x36, 0x34, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x61, 0x66, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x74, 0x48, 0x64, -0x42, 0x71, 0x54, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x61, 0x66, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x31, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x25, 0x72, 0x68, 0x3c, 0x36, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, -0x3c, 0x36, 0x34, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, -0x64, 0x20, 0x25, 0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x35, 0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x31, 0x2c, 0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x31, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x63, 0x76, -0x74, 0x2e, 0x75, 0x33, 0x32, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, -0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x34, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x31, 0x20, 0x62, 0x72, 0x61, -0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x62, -0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, -0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, -0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3a, 0x0a, 0x09, -0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, -0x25, 0x72, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x38, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x37, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, -0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, -0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, -0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x39, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, -0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, -0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, -0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, -0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, -0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, -0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, -0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x75, -0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, -0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, -0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, -0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, -0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x31, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, -0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x33, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, -0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x35, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, -0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x37, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, -0x39, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x39, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, -0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, -0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, -0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, -0x38, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x31, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, -0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, -0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, -0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, -0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, -0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x35, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, -0x36, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, -0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, -0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, -0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, -0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x30, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x37, 0x30, 0x36, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, -0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, -0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, -0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, -0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x68, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x68, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x32, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x36, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x3b, 0x0a, 0x09, 0x73, -0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, -0x72, 0x34, 0x36, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x37, 0x39, 0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, -0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, -0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, -0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, -0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, -0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x37, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, -0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, -0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, -0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x34, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, -0x30, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x35, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, -0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x30, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x35, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x33, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x35, 0x33, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, -0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x35, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x35, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x3b, 0x0a, -0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, 0x09, 0x40, -0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3a, 0x0a, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, -0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x38, -0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, -0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, -0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, -0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, -0x09, 0x5b, 0x25, 0x72, 0x32, 0x32, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x32, 0x3b, -0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x3b, -0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x7d, 0x20, -0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char util_mpm_b2g_cuda_kernel_sm_13[6744] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x34, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x64, 0x33, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x6c, 0x5a, 0x6c, -0x54, 0x41, 0x51, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x64, 0x33, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x33, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x25, 0x72, 0x68, 0x3c, 0x36, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, -0x3c, 0x36, 0x34, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, -0x64, 0x20, 0x25, 0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x35, 0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x31, 0x2c, 0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x31, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x63, 0x76, -0x74, 0x2e, 0x75, 0x33, 0x32, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, -0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x34, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, -0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, -0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x31, 0x20, 0x62, 0x72, 0x61, -0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x62, -0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, -0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, -0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, 0x34, 0x3a, 0x0a, 0x09, -0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, -0x25, 0x72, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x38, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x37, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, -0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, -0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, -0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x39, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, -0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x30, 0x2b, 0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, -0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, -0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, -0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, -0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, -0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, -0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x75, -0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x36, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, -0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, -0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, -0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, -0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, -0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x31, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x32, 0x37, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, -0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x33, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x33, 0x2c, 0x20, 0x34, 0x3b, 0x0a, -0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, -0x33, 0x35, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, -0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x37, 0x2b, 0x30, -0x5d, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, -0x39, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x39, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, -0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, -0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, -0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, -0x38, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x31, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, -0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, -0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, -0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, -0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, -0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, -0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, -0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x35, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, -0x36, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, -0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, -0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, -0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, -0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x30, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, -0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x37, 0x30, 0x36, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, -0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, -0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, -0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, -0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x25, -0x72, 0x68, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, -0x72, 0x68, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, 0x68, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x68, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x33, 0x2c, 0x20, 0x32, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x36, -0x2c, 0x20, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x3b, 0x0a, 0x09, 0x73, -0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, -0x72, 0x34, 0x36, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x37, 0x39, 0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, -0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, -0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, -0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, -0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, -0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, -0x37, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, -0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, -0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, -0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, -0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x34, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, -0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, -0x30, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x35, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, -0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x30, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x35, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x34, 0x38, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x33, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x5b, 0x25, 0x72, 0x35, 0x33, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, -0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x34, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, 0x3b, 0x0a, 0x09, -0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x35, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x35, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x3b, 0x0a, -0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, -0x25, 0x72, 0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, -0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, 0x09, 0x40, -0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, 0x3a, 0x0a, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, -0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, -0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x38, -0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, -0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, -0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x25, 0x72, -0x68, 0x32, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, -0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, -0x09, 0x5b, 0x25, 0x72, 0x32, 0x32, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x68, 0x32, 0x3b, -0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, -0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x3b, -0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x7d, 0x20, -0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char util_mpm_b2g_cuda_kernel_sm_20[6506] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x32, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x66, 0x37, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x41, 0x63, 0x44, -0x65, 0x43, 0x4c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x63, 0x66, 0x37, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x33, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, 0x3c, 0x36, 0x38, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x64, 0x20, 0x25, -0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x35, -0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x2c, -0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, -0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x31, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, -0x34, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, -0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, -0x33, 0x34, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, -0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x31, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x31, 0x31, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, -0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x31, 0x2b, -0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, -0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, -0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, -0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x39, 0x2b, 0x30, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x31, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, -0x32, 0x32, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, -0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, -0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, -0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, -0x33, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, -0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, -0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, -0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, -0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x31, -0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x33, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x33, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x31, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, -0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, -0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x33, 0x34, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, -0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x36, 0x3b, 0x0a, 0x09, 0x6d, -0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x38, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x30, -0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x3b, -0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, -0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, -0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, -0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x36, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, -0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x32, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x4c, -0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, -0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, 0x30, 0x0a, 0x09, 0x73, -0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, -0x36, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x34, 0x36, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, -0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x35, 0x20, 0x62, 0x72, -0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, 0x36, 0x3b, 0x0a, 0x20, -0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, -0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, -0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, -0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, -0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, 0x36, 0x3a, -0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, -0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, -0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, -0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, -0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x38, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x63, 0x76, 0x74, 0x2e, 0x75, -0x31, 0x36, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, -0x34, 0x38, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x32, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x30, 0x2c, 0x20, -0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x3b, 0x0a, 0x09, 0x73, 0x74, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, 0x72, 0x35, -0x30, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x39, -0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, -0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, -0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, -0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, -0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x30, -0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x3b, -0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, -0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, -0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x33, 0x09, -0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x32, -0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x6c, -0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x32, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x61, -0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, 0x20, 0x25, 0x72, -0x35, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x35, 0x34, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, -0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x5b, 0x25, -0x72, 0x35, 0x32, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, -0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x37, 0x2b, -0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, -0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x39, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x33, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x36, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, -0x3b, 0x0a, 0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x36, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x34, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x3b, -0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x70, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x35, 0x3b, 0x0a, -0x09, 0x40, 0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, -0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, -0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, -0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, -0x33, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x36, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, -0x65, 0x74, 0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x40, 0x25, -0x70, 0x38, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, -0x35, 0x38, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x39, 0x34, 0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, -0x31, 0x34, 0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, -0x09, 0x30, 0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x5b, 0x25, 0x72, 0x32, 0x33, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x32, -0x38, 0x3b, 0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, -0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, -0x74, 0x3b, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, -0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char util_mpm_b2g_cuda_kernel_sm_21[6506] = { -0x09, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x32, 0x0a, 0x09, 0x2e, -0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x0a, 0x09, 0x2f, 0x2f, -0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x6f, -0x70, 0x65, 0x6e, 0x36, 0x34, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x2f, 0x62, 0x65, 0x0a, 0x09, 0x2f, -0x2f, 0x20, 0x6e, 0x76, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x63, 0x20, 0x33, 0x2e, 0x32, 0x20, 0x62, -0x75, 0x69, 0x6c, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x31, 0x2d, -0x30, 0x33, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, 0x6e, 0x67, -0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x64, 0x31, 0x62, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x39, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x70, 0x70, 0x33, 0x2e, 0x69, -0x20, 0x28, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x63, 0x63, 0x42, 0x49, 0x23, 0x2e, 0x75, 0x73, 0x58, -0x37, 0x67, 0x42, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, -0x0a, 0x09, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x70, 0x74, 0x78, 0x2c, -0x20, 0x49, 0x53, 0x41, 0x3a, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x2c, 0x20, 0x45, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x3a, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x2c, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, -0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x33, 0x32, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, -0x2d, 0x4f, 0x33, 0x09, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x67, -0x30, 0x09, 0x28, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, -0x09, 0x2f, 0x2f, 0x20, 0x20, 0x2d, 0x6d, 0x32, 0x09, 0x28, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, -0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x2f, 0x2f, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x09, 0x2e, 0x66, -0x69, 0x6c, 0x65, 0x09, 0x31, 0x09, 0x22, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2d, -0x6c, 0x69, 0x6e, 0x65, 0x3e, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x09, -0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x6d, 0x70, 0x78, 0x66, 0x74, 0x5f, 0x30, 0x30, 0x30, -0x30, 0x30, 0x64, 0x31, 0x62, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x38, -0x5f, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x64, 0x61, 0x66, 0x65, -0x32, 0x2e, 0x67, 0x70, 0x75, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x33, 0x09, -0x22, 0x75, 0x74, 0x69, 0x6c, 0x2d, 0x6d, 0x70, 0x6d, 0x2d, 0x62, 0x32, 0x67, 0x2d, 0x63, 0x75, -0x64, 0x61, 0x2d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2e, 0x63, 0x75, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x69, 0x62, -0x2f, 0x67, 0x63, 0x63, 0x2f, 0x69, 0x36, 0x38, 0x36, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, -0x67, 0x6e, 0x75, 0x2f, 0x34, 0x2e, 0x34, 0x2e, 0x35, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x74, 0x64, 0x64, 0x65, 0x66, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x72, 0x74, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, -0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x37, 0x09, 0x22, 0x2f, 0x75, -0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, -0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, -0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, -0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, -0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, -0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x39, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, -0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x31, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, -0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x32, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, -0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, -0x72, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x34, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x63, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, -0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x35, 0x09, 0x22, -0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x62, 0x69, 0x74, -0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x36, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, -0x64, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, -0x65, 0x09, 0x31, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, -0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, -0x6c, 0x75, 0x64, 0x65, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x74, -0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, -0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, -0x66, 0x69, 0x6c, 0x65, 0x09, 0x31, 0x39, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, -0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, -0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x66, 0x75, 0x6e, -0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, -0x09, 0x32, 0x30, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, -0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, -0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, -0x74, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x31, 0x09, -0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, -0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, -0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x32, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x31, 0x31, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, -0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, -0x33, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, -0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, -0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x32, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, -0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, -0x6c, 0x65, 0x09, 0x32, 0x34, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, -0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, -0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x31, 0x33, 0x5f, 0x64, 0x6f, 0x75, 0x62, -0x6c, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0x0a, -0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x35, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, 0x2f, -0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x2e, -0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, 0x5f, 0x32, 0x30, 0x5f, -0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, -0x2e, 0x68, 0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x36, 0x09, 0x22, 0x2f, -0x75, 0x73, 0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, -0x69, 0x6e, 0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x6d, -0x5f, 0x32, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x68, -0x22, 0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x37, 0x09, 0x22, 0x2f, 0x75, 0x73, -0x72, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, -0x2f, 0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x73, 0x75, 0x72, 0x66, -0x61, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x22, -0x0a, 0x09, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x09, 0x32, 0x38, 0x09, 0x22, 0x2f, 0x75, 0x73, 0x72, -0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x63, 0x75, 0x64, 0x61, 0x2f, 0x62, 0x69, 0x6e, 0x2f, -0x2e, 0x2e, 0x2f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, -0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x62, 0x6c, 0x5f, 0x70, 0x74, -0x78, 0x33, 0x2e, 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x09, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, -0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, -0x4d, 0x71, 0x20, 0x28, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, -0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, -0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, -0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, -0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, -0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, -0x09, 0x09, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, -0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, -0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, -0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, -0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, 0x61, -0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, -0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x2c, 0x0a, 0x09, 0x09, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, -0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, 0x6f, 0x77, -0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x09, 0x7b, 0x0a, -0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x25, 0x72, 0x3c, 0x36, 0x38, -0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x72, 0x65, 0x67, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x64, 0x20, 0x25, -0x70, 0x3c, 0x31, 0x30, 0x3e, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x35, -0x33, 0x09, 0x30, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x2c, -0x20, 0x25, 0x63, 0x74, 0x61, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, -0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x2c, 0x20, 0x33, 0x32, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x33, 0x2c, 0x20, 0x25, 0x74, 0x69, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x09, 0x61, 0x64, -0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, -0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, -0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x6e, 0x6f, 0x70, 0x5d, 0x3b, 0x0a, 0x09, -0x73, 0x65, 0x74, 0x70, 0x2e, 0x67, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x31, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, 0x33, -0x34, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x42, -0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, -0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x35, 0x36, -0x33, 0x34, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x32, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, -0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x37, 0x2c, 0x20, 0x5b, -0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, -0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x39, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x38, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x30, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, -0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x31, -0x2c, 0x20, 0x25, 0x72, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x30, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, -0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x31, 0x31, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, -0x33, 0x09, 0x36, 0x35, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, -0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, -0x31, 0x31, 0x2b, 0x38, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, -0x36, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x31, 0x2b, -0x34, 0x5d, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x36, 0x37, 0x09, 0x30, -0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x35, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, -0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x37, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6c, 0x64, -0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x37, -0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, -0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, -0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, -0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, 0x64, 0x61, 0x70, 0x61, -0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, -0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, 0x70, 0x61, -0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x75, 0x66, -0x66, 0x65, 0x72, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x31, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x38, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x3b, -0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x31, 0x39, 0x2b, 0x30, 0x5d, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x31, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, -0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x32, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x31, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x37, 0x2c, 0x20, 0x25, 0x72, -0x32, 0x32, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x65, -0x74, 0x70, 0x2e, 0x6c, 0x74, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x32, 0x2c, 0x20, -0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x35, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, -0x32, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x39, 0x34, 0x37, -0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, -0x35, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x31, 0x32, 0x3b, 0x0a, 0x09, 0x61, 0x64, -0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x32, -0x33, 0x2c, 0x20, 0x32, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x37, 0x2c, 0x20, 0x5b, 0x5f, 0x5f, 0x63, 0x75, -0x64, 0x61, 0x70, 0x61, 0x72, 0x6d, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, -0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x5f, 0x67, 0x5f, 0x75, 0x38, 0x5f, 0x6c, -0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5d, 0x3b, 0x0a, -0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, -0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x3a, 0x0a, 0x20, -0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x38, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, -0x20, 0x09, 0x25, 0x72, 0x32, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, -0x31, 0x36, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, -0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x31, -0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x33, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, -0x72, 0x33, 0x32, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x31, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, -0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, -0x33, 0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x32, 0x39, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, -0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x34, 0x2c, 0x20, 0x25, -0x72, 0x33, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, -0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, -0x5b, 0x25, 0x72, 0x33, 0x34, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x35, 0x2c, 0x20, -0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x37, -0x2c, 0x20, 0x25, 0x72, 0x33, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x33, 0x36, 0x3b, 0x0a, 0x09, 0x6d, -0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x33, 0x37, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x33, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, -0x25, 0x72, 0x33, 0x38, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x34, 0x30, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x33, 0x39, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x31, 0x2c, 0x20, 0x30, -0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x70, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x31, 0x3b, -0x0a, 0x09, 0x40, 0x25, 0x70, 0x33, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, -0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, 0x33, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, -0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, -0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, 0x36, 0x09, 0x30, -0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x32, 0x2c, -0x20, 0x25, 0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x38, -0x37, 0x09, 0x30, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x34, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x32, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x34, 0x2c, 0x20, -0x25, 0x72, 0x34, 0x33, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x4c, -0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, -0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x30, 0x09, 0x30, 0x0a, 0x09, 0x73, -0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, -0x34, 0x32, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x72, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x31, -0x35, 0x3b, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, -0x36, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, -0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x35, 0x2c, 0x20, 0x25, -0x72, 0x34, 0x36, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x34, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, -0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, -0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, -0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6c, -0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x35, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, -0x2c, 0x20, 0x25, 0x72, 0x34, 0x34, 0x3b, 0x0a, 0x09, 0x40, 0x25, 0x70, 0x35, 0x20, 0x62, 0x72, -0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, 0x36, 0x3b, 0x0a, 0x20, -0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, -0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, -0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, -0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, -0x63, 0x09, 0x33, 0x09, 0x39, 0x33, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x73, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, -0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, -0x34, 0x35, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x38, 0x37, 0x30, 0x36, 0x3a, -0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, -0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, -0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, -0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, -0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x39, 0x35, 0x09, 0x30, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, -0x73, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x38, 0x3b, -0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x63, 0x76, 0x74, 0x2e, 0x75, -0x31, 0x36, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x25, 0x72, -0x34, 0x38, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, 0x75, 0x33, 0x32, 0x20, -0x09, 0x25, 0x72, 0x34, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x37, 0x2c, 0x20, 0x32, 0x3b, 0x0a, -0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x30, 0x2c, 0x20, -0x25, 0x72, 0x32, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x39, 0x3b, 0x0a, 0x09, 0x73, 0x74, 0x2e, -0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, 0x36, 0x20, 0x09, 0x5b, 0x25, 0x72, 0x35, -0x30, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x38, 0x34, 0x35, 0x30, 0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x39, -0x33, 0x38, 0x3a, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, -0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, -0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, -0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, 0x36, 0x38, 0x32, -0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x30, 0x09, 0x30, 0x0a, 0x09, -0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x31, 0x2c, 0x20, 0x30, -0x3b, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x65, 0x71, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x70, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x31, 0x3b, -0x0a, 0x09, 0x40, 0x25, 0x70, 0x36, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, -0x30, 0x5f, 0x32, 0x35, 0x38, 0x3b, 0x0a, 0x20, 0x2f, 0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, -0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, -0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, -0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x37, -0x36, 0x38, 0x32, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x33, 0x09, -0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x32, -0x2c, 0x20, 0x25, 0x72, 0x31, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x32, 0x3b, 0x0a, 0x09, 0x6c, -0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, -0x33, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x32, 0x2b, 0x31, 0x32, 0x5d, 0x3b, 0x0a, 0x09, 0x61, -0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x34, 0x2c, 0x20, 0x25, 0x72, -0x35, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, -0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x35, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x35, 0x34, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, -0x62, 0x61, 0x6c, 0x2e, 0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x5b, 0x25, -0x72, 0x35, 0x32, 0x2b, 0x31, 0x31, 0x5d, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x35, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x36, 0x2c, 0x20, 0x25, -0x72, 0x32, 0x37, 0x3b, 0x0a, 0x09, 0x6c, 0x64, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, -0x75, 0x38, 0x20, 0x09, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x5b, 0x25, 0x72, 0x35, 0x37, 0x2b, -0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x35, 0x39, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x38, 0x2c, 0x20, 0x34, 0x3b, 0x0a, 0x09, 0x6f, 0x72, -0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x35, 0x35, -0x2c, 0x20, 0x25, 0x72, 0x35, 0x39, 0x3b, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x2e, 0x6c, 0x6f, 0x2e, -0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x31, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x30, 0x2c, -0x20, 0x34, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, -0x36, 0x32, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x31, 0x3b, 0x0a, -0x09, 0x6c, 0x64, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x33, 0x2c, 0x20, 0x5b, -0x25, 0x72, 0x36, 0x32, 0x2b, 0x30, 0x5d, 0x3b, 0x0a, 0x09, 0x73, 0x68, 0x6c, 0x2e, 0x62, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x31, -0x3b, 0x0a, 0x09, 0x61, 0x6e, 0x64, 0x2e, 0x62, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x34, 0x30, -0x2c, 0x20, 0x25, 0x72, 0x36, 0x33, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x34, 0x3b, 0x0a, 0x09, 0x6d, -0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x3b, -0x0a, 0x09, 0x73, 0x65, 0x74, 0x70, 0x2e, 0x6e, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x70, 0x37, 0x2c, 0x20, 0x25, 0x72, 0x34, 0x30, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x35, 0x3b, 0x0a, -0x09, 0x40, 0x25, 0x70, 0x37, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, -0x5f, 0x37, 0x36, 0x38, 0x32, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x32, 0x35, 0x38, -0x3a, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x39, 0x31, 0x34, 0x3a, 0x0a, 0x20, 0x2f, -0x2f, 0x3c, 0x6c, 0x6f, 0x6f, 0x70, 0x3e, 0x20, 0x50, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, -0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x38, -0x33, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x20, -0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, 0x35, 0x38, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, -0x09, 0x33, 0x09, 0x31, 0x30, 0x36, 0x09, 0x30, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x2e, 0x75, 0x33, -0x32, 0x20, 0x09, 0x25, 0x72, 0x36, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x32, 0x2c, 0x20, 0x25, -0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, -0x72, 0x31, 0x36, 0x2c, 0x20, 0x25, 0x72, 0x36, 0x36, 0x2c, 0x20, 0x31, 0x3b, 0x0a, 0x09, 0x73, -0x65, 0x74, 0x70, 0x2e, 0x67, 0x65, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, 0x25, 0x70, 0x38, 0x2c, -0x20, 0x25, 0x72, 0x32, 0x34, 0x2c, 0x20, 0x25, 0x72, 0x31, 0x36, 0x3b, 0x0a, 0x09, 0x40, 0x25, -0x70, 0x38, 0x20, 0x62, 0x72, 0x61, 0x20, 0x09, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, 0x36, -0x35, 0x38, 0x3b, 0x0a, 0x09, 0x62, 0x72, 0x61, 0x2e, 0x75, 0x6e, 0x69, 0x20, 0x09, 0x24, 0x4c, -0x74, 0x5f, 0x30, 0x5f, 0x36, 0x31, 0x34, 0x36, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, -0x39, 0x34, 0x37, 0x34, 0x3a, 0x0a, 0x09, 0x6d, 0x6f, 0x76, 0x2e, 0x75, 0x33, 0x32, 0x20, 0x09, -0x25, 0x72, 0x32, 0x38, 0x2c, 0x20, 0x30, 0x3b, 0x0a, 0x24, 0x4c, 0x74, 0x5f, 0x30, 0x5f, 0x36, -0x31, 0x34, 0x36, 0x3a, 0x0a, 0x09, 0x2e, 0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x30, 0x39, -0x09, 0x30, 0x0a, 0x09, 0x73, 0x74, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x75, 0x31, -0x36, 0x20, 0x09, 0x5b, 0x25, 0x72, 0x32, 0x33, 0x2b, 0x30, 0x5d, 0x2c, 0x20, 0x25, 0x72, 0x32, -0x38, 0x3b, 0x0a, 0x24, 0x4c, 0x42, 0x42, 0x31, 0x37, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, -0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, 0x2e, -0x6c, 0x6f, 0x63, 0x09, 0x33, 0x09, 0x31, 0x31, 0x31, 0x09, 0x30, 0x0a, 0x09, 0x65, 0x78, 0x69, -0x74, 0x3b, 0x0a, 0x24, 0x4c, 0x44, 0x57, 0x65, 0x6e, 0x64, 0x5f, 0x42, 0x32, 0x67, 0x43, 0x75, -0x64, 0x61, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x3a, 0x0a, 0x09, -0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x42, 0x32, 0x67, 0x43, 0x75, 0x64, 0x61, 0x53, 0x65, 0x61, 0x72, -0x63, 0x68, 0x42, 0x4e, 0x44, 0x4d, 0x71, 0x0a, 0x0a, 0x00 -}; - -const unsigned char* SCCudaPtxDumpGetModule(const char* module){ - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_10")) - return util_mpm_b2g_cuda_kernel_sm_10; - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_11")) - return util_mpm_b2g_cuda_kernel_sm_11; - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_12")) - return util_mpm_b2g_cuda_kernel_sm_12; - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_13")) - return util_mpm_b2g_cuda_kernel_sm_13; - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_20")) - return util_mpm_b2g_cuda_kernel_sm_20; - if (!strcmp(module, "util-mpm-b2g-cuda-kernel_sm_21")) - return util_mpm_b2g_cuda_kernel_sm_21; - SCLogError(SC_ERR_FATAL, "Error in SCCudaPtxDumpGetModule, module %s not found. Exiting...",module); - exit(EXIT_FAILURE); -}; -#endif /* __ptxdump_h__ */ -#endif /* __SC_CUDA_SUPPORT__ */ diff --git a/src/decode.h b/src/decode.h index 5b4452d7a7..59d34d9338 100644 --- a/src/decode.h +++ b/src/decode.h @@ -77,10 +77,6 @@ enum { #include "app-layer-protos.h" -#ifdef __SC_CUDA_SUPPORT__ -#define CUDA_MAX_PAYLOAD_SIZE 1500 -#endif - /* forward declaration */ struct DetectionEngineThreadCtx_; @@ -488,26 +484,6 @@ typedef struct Packet_ * It should always point to the lowest * packet in a encapsulated packet */ - /* required for cuda support */ -#ifdef __SC_CUDA_SUPPORT__ - /* indicates if the cuda mpm would be conducted or a normal cpu mpm would - * be conduced on this packet. If it is set to 0, the cpu mpm; else cuda mpm */ - uint8_t cuda_mpm_enabled; - /* indicates if the cuda mpm has finished running the mpm and processed the - * results for this packet, assuming if cuda_mpm_enabled has been set for this - * packet */ - uint16_t cuda_done; - /* used by the detect thread and the cuda mpm dispatcher thread. The detect - * thread would wait on this cond var, if the cuda mpm dispatcher thread - * still hasn't processed the packet. The dispatcher would use this cond - * to inform the detect thread(in case it is waiting on this packet), once - * the dispatcher is done processing the packet results */ - SCMutex cuda_mutex; - SCCondT cuda_cond; - /* the extra 1 in the 1481, is to hold the no_of_matches from the mpm run */ - uint16_t mpm_offsets[CUDA_MAX_PAYLOAD_SIZE + 1]; -#endif - #ifdef PROFILING PktProfiling profile; #endif @@ -610,23 +586,12 @@ typedef struct DecodeThreadVars_ /** * \brief Initialize a packet structure for use. */ -#ifndef __SC_CUDA_SUPPORT__ #define PACKET_INITIALIZE(p) { \ SCMutexInit(&(p)->tunnel_mutex, NULL); \ PACKET_RESET_CHECKSUMS((p)); \ (p)->pkt = ((uint8_t *)(p)) + sizeof(Packet); \ (p)->livedev = NULL; \ } -#else -#define PACKET_INITIALIZE(p) { \ - SCMutexInit(&(p)->tunnel_mutex, NULL); \ - PACKET_RESET_CHECKSUMS((p)); \ - SCMutexInit(&(p)->cuda_mutex, NULL); \ - SCCondInit(&(p)->cuda_cond, NULL); \ - (p)->pkt = ((uint8_t *)(p)) + sizeof(Packet); \ - (p)->livedev = NULL; \ -} -#endif /** * \brief Recycle a packet structure for reuse. @@ -699,39 +664,17 @@ typedef struct DecodeThreadVars_ PACKET_PROFILING_RESET((p)); \ } while (0) -#ifndef __SC_CUDA_SUPPORT__ #define PACKET_RECYCLE(p) PACKET_DO_RECYCLE((p)) -#else -#define PACKET_RECYCLE(p) do { \ - PACKET_DO_RECYCLE((p)); \ - SCMutexDestroy(&(p)->cuda_mutex); \ - SCCondDestroy(&(p)->cuda_cond); \ - SCMutexInit(&(p)->cuda_mutex, NULL); \ - SCCondInit(&(p)->cuda_cond, NULL); \ - PACKET_RESET_CHECKSUMS((p)); \ -} while(0) -#endif /** * \brief Cleanup a packet so that we can free it. No memset needed.. */ -#ifndef __SC_CUDA_SUPPORT__ #define PACKET_CLEANUP(p) do { \ if ((p)->pktvar != NULL) { \ PktVarFree((p)->pktvar); \ } \ SCMutexDestroy(&(p)->tunnel_mutex); \ } while (0) -#else -#define PACKET_CLEANUP(p) do { \ - if ((p)->pktvar != NULL) { \ - PktVarFree((p)->pktvar); \ - } \ - SCMutexDestroy(&(p)->tunnel_mutex); \ - SCMutexDestroy(&(p)->cuda_mutex); \ - SCCondDestroy(&(p)->cuda_cond); \ -} while(0) -#endif /* macro's for setting the action diff --git a/src/detect-engine-mpm.c b/src/detect-engine-mpm.c index cf458214be..87dc7cf1f3 100644 --- a/src/detect-engine-mpm.c +++ b/src/detect-engine-mpm.c @@ -49,9 +49,6 @@ #include "stream.h" -#include "util-cuda-handlers.h" -#include "util-mpm-b2g-cuda.h" - #include "util-enum.h" #include "util-debug.h" #include "util-print.h" @@ -59,11 +56,7 @@ /** \todo make it possible to use multiple pattern matcher algorithms next to eachother. */ -#ifdef __SC_CUDA_SUPPORT__ -#define PM MPM_B2G_CUDA -#else #define PM MPM_AC -#endif #define POPULATE_MPM_AVOID_PACKET_MPM_PATTERNS 0x01 #define POPULATE_MPM_AVOID_STREAM_MPM_PATTERNS 0x02 @@ -228,36 +221,11 @@ uint32_t PacketPatternSearch(DetectEngineThreadCtx *det_ctx, Packet *p) if (mpm_ctx == NULL) SCReturnInt(0); -#ifndef __SC_CUDA_SUPPORT__ ret = mpm_table[mpm_ctx->mpm_type].Search(mpm_ctx, &det_ctx->mtc, &det_ctx->pmq, p->payload, p->payload_len); -#else - /* if the user has enabled cuda support, but is not using the cuda mpm - * algo, then we shouldn't take the path of the dispatcher. Call the mpm - * directly */ - if (mpm_ctx->mpm_type != MPM_B2G_CUDA) { - ret = mpm_table[mpm_ctx->mpm_type].Search(mpm_ctx, - &det_ctx->mtc, - &det_ctx->pmq, - p->payload, - p->payload_len); - SCReturnInt(ret); - } - - if (p->cuda_mpm_enabled) { - ret = B2gCudaResultsPostProcessing(p, mpm_ctx, &det_ctx->mtc, - &det_ctx->pmq); - } else { - ret = mpm_table[mpm_ctx->mpm_type].Search(mpm_ctx, - &det_ctx->mtc, - &det_ctx->pmq, - p->payload, - p->payload_len); - } -#endif SCReturnInt(ret); } @@ -2125,13 +2093,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) SCLogDebug("sh->mpm_proto_tcp_ctx == NULL. This should never happen"); exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_proto_tcp_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_proto_tcp_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_proto_tcp_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_proto_tcp_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif if (de_ctx->sgh_mpm_context == ENGINE_SGH_MPM_FACTORY_CONTEXT_SINGLE) { sh->mpm_proto_udp_ctx_ts = MpmFactoryGetMpmCtxForProfile(de_ctx, de_ctx->sgh_mpm_context_proto_udp_packet, 0); @@ -2144,13 +2107,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) SCLogDebug("sh->mpm_proto_udp_ctx == NULL. This should never happen"); exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_proto_udp_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_proto_udp_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_proto_udp_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_proto_udp_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif if (de_ctx->sgh_mpm_context == ENGINE_SGH_MPM_FACTORY_CONTEXT_SINGLE) { sh->mpm_proto_other_ctx = @@ -2163,11 +2121,7 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) SCLogDebug("sh->mpm_proto_other_ctx == NULL. This should never happen"); exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_proto_other_ctx, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_proto_other_ctx, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } /* if (has_co_packet) */ if (has_co_stream) { @@ -2182,14 +2136,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) SCLogDebug("sh->mpm_stream_ctx == NULL. This should never happen"); exit(EXIT_FAILURE); } - -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_stream_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_stream_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_stream_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_stream_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_uri) { @@ -2205,13 +2153,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_uri_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_uri_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_uri_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_uri_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hcbd) { @@ -2227,13 +2170,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hcbd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hcbd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hcbd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hcbd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hsbd) { @@ -2249,13 +2187,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hsbd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hsbd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hsbd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hsbd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hhd) { @@ -2271,13 +2204,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hhd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hhd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hhd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hhd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hrhd) { @@ -2293,13 +2221,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hrhd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hrhd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hrhd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hrhd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hmd) { @@ -2315,13 +2238,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hmd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hmd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hmd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hmd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hcd) { @@ -2337,13 +2255,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hcd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hcd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hcd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hcd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hrud) { @@ -2359,13 +2272,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hrud_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hrud_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hrud_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hrud_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hsmd) { @@ -2381,13 +2289,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hsmd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hsmd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hsmd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hsmd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hscd) { @@ -2403,13 +2306,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hscd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hscd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hscd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hscd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_huad) { @@ -2425,13 +2323,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_huad_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_huad_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_huad_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_huad_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hhhd) { @@ -2447,13 +2340,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hhhd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hhhd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hhhd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hhhd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_hrhhd) { @@ -2469,13 +2357,8 @@ int PatternMatchPrepareGroup(DetectEngineCtx *de_ctx, SigGroupHead *sh) exit(EXIT_FAILURE); } -#ifndef __SC_CUDA_SUPPORT__ MpmInitCtx(sh->mpm_hrhhd_ctx_ts, de_ctx->mpm_matcher, -1); MpmInitCtx(sh->mpm_hrhhd_ctx_tc, de_ctx->mpm_matcher, -1); -#else - MpmInitCtx(sh->mpm_hrhhd_ctx_ts, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); - MpmInitCtx(sh->mpm_hrhhd_ctx_tc, de_ctx->mpm_matcher, de_ctx->cuda_rc_mod_handle); -#endif } if (has_co_packet || diff --git a/src/detect.c b/src/detect.c index c232c0792e..1a7b2e8d23 100644 --- a/src/detect.c +++ b/src/detect.c @@ -183,8 +183,6 @@ #include "util-unittest-helper.h" #include "util-debug.h" #include "util-hashlist.h" -#include "util-cuda-handlers.h" -#include "util-mpm-b2g-cuda.h" #include "util-cuda.h" #include "util-privs.h" #include "util-profiling.h" @@ -4431,31 +4429,6 @@ int SigGroupBuild(DetectEngineCtx *de_ctx) exit(EXIT_FAILURE); } -#ifdef __SC_CUDA_SUPPORT__ - size_t cuda_total = 0; - size_t cuda_free_before_alloc = 0; - /* we register a module that would require cuda handler service. This - * module would hold the context for all the patterns in the rules */ - de_ctx->cuda_rc_mod_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - if (de_ctx->mpm_matcher == MPM_B2G_CUDA) { - CUcontext dummy_context; - if (SCCudaHlGetCudaContext(&dummy_context, "mpm", - de_ctx->cuda_rc_mod_handle) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda context for the " - "module SC_RULES_CONTENT_B2G_CUDA"); - } - SCCudaCtxPushCurrent(dummy_context); - if (SCCudaMemGetInfo(&cuda_free_before_alloc, &cuda_total) == 0) { - SCLogInfo("Total Memory available in the CUDA context used for mpm " - "with b2g: %.2f MB", cuda_total/(1024.0 * 1024.0)); - SCLogInfo("Free Memory available in the CUDA context used for b2g " - "mpm before any allocation is made on the GPU for the " - "context: %.2f MB", cuda_free_before_alloc/(1024.0 * 1024.0)); - } - } - -#endif - if (SigAddressPrepareStage3(de_ctx) != 0) { SCLogError(SC_ERR_DETECT_PREPARE, "initializing the detection engine failed"); exit(EXIT_FAILURE); @@ -4465,32 +4438,6 @@ int SigGroupBuild(DetectEngineCtx *de_ctx) exit(EXIT_FAILURE); } -#ifdef __SC_CUDA_SUPPORT__ - size_t cuda_free_after_alloc = 0; - /* if a user has selected some other mpm algo other than b2g_cuda, inspite of - * enabling cuda support, then no cuda contexts or cuda vars would be created. - * Pop the cuda context, only on confirming that the MPM algo selected is the - * CUDA mpm algo */ - if (de_ctx->mpm_matcher == MPM_B2G_CUDA) { - if (SCCudaMemGetInfo(&cuda_free_after_alloc, &cuda_total) == 0) { - SCLogInfo("Free Memory available in the CUDA context used for b2g mpm " - "after allocation is made on the GPU for the context: %.2f MB", - cuda_free_after_alloc/(1024.0 * 1024.0)); - SCLogInfo("Total memory consumed by the CUDA context for the b2g mpm: " - "%.2f MB", (cuda_free_before_alloc/(1024.0 * 1024.0)) - - (cuda_free_after_alloc/(1024.0 * 1024.0))); - } - /* the AddressPrepareStage3 actually handles the creation of device - * pointers on the gpu. The cuda context that stage3 used would still be - * attached to this host thread. We need to pop this cuda context so that - * the dispatcher thread that we are going to create for the above module - * we registered can attach to this cuda context */ - CUcontext context; - if (SCCudaCtxPopCurrent(&context) == -1) - exit(EXIT_FAILURE); - } -#endif - if (de_ctx->sgh_mpm_context == ENGINE_SGH_MPM_FACTORY_CONTEXT_SINGLE) { MpmCtx *mpm_ctx = NULL; mpm_ctx = MpmFactoryGetMpmCtxForProfile(de_ctx, de_ctx->sgh_mpm_context_proto_tcp_packet, 0); diff --git a/src/detect.h b/src/detect.h index 0513e639f1..0dbdd65815 100644 --- a/src/detect.h +++ b/src/detect.h @@ -622,13 +622,6 @@ typedef struct DetectEngineCtx_ { uint16_t mpm_matcher; /**< mpm matcher this ctx uses */ -#ifdef __SC_CUDA_SUPPORT__ - /* cuda rules content module handle. Holds the handler serivice's - * (util-cuda-handler.c) handle for a module. This module would - * hold the cuda context for all the rules content */ - int cuda_rc_mod_handle; -#endif - /* Config options */ uint16_t max_uniq_toclient_src_groups; @@ -843,12 +836,6 @@ typedef struct DetectionEngineThreadCtx_ { } filestore[DETECT_FILESTORE_MAX]; DetectEngineCtx *de_ctx; -#ifdef __SC_CUDA_SUPPORT__ - /* each detection thread would have it's own queue where the cuda dispatcher - * thread can dump the packets once it has processed them */ - Tmq *cuda_mpm_rc_disp_outq; -#endif - /** store for keyword contexts that need a per thread storage because of * thread safety issues */ void **keyword_ctxs_array; diff --git a/src/log-droplog.c b/src/log-droplog.c index 0b05ae0867..03972e2d01 100644 --- a/src/log-droplog.c +++ b/src/log-droplog.c @@ -48,8 +48,6 @@ #include "util-unittest.h" #include "util-unittest-helper.h" #include "util-classification-config.h" -#include "util-mpm-b2g-cuda.h" -#include "util-cuda-handlers.h" #include "util-privs.h" #include "util-print.h" #include "util-proto-name.h" diff --git a/src/runmode-af-packet.c b/src/runmode-af-packet.c index 281b093267..bfaf832c1c 100644 --- a/src/runmode-af-packet.c +++ b/src/runmode-af-packet.c @@ -39,7 +39,6 @@ #include "runmode-af-packet.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "detect-engine-mpm.h" #include "alert-fastlog.h" diff --git a/src/runmode-erf-dag.c b/src/runmode-erf-dag.c index 8d87d5e099..4fa9a6fccb 100644 --- a/src/runmode-erf-dag.c +++ b/src/runmode-erf-dag.c @@ -22,7 +22,6 @@ #include "runmode-erf-dag.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "alert-fastlog.h" diff --git a/src/runmode-erf-file.c b/src/runmode-erf-file.c index 4e70e07135..c8a1f95de6 100644 --- a/src/runmode-erf-file.c +++ b/src/runmode-erf-file.c @@ -22,7 +22,6 @@ #include "runmode-erf-file.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "alert-fastlog.h" diff --git a/src/runmode-ipfw.c b/src/runmode-ipfw.c index c79ab61caa..5ba9e92a4f 100644 --- a/src/runmode-ipfw.c +++ b/src/runmode-ipfw.c @@ -33,7 +33,6 @@ #include "runmode-ipfw.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "alert-fastlog.h" diff --git a/src/runmode-nfq.c b/src/runmode-nfq.c index 58a58b9890..3f750414bf 100644 --- a/src/runmode-nfq.c +++ b/src/runmode-nfq.c @@ -32,7 +32,6 @@ #include "runmode-nfq.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "alert-fastlog.h" diff --git a/src/runmode-pcap-file.c b/src/runmode-pcap-file.c index 29e00b0710..d68618e04d 100644 --- a/src/runmode-pcap-file.c +++ b/src/runmode-pcap-file.c @@ -22,7 +22,6 @@ #include "runmode-pcap-file.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "detect-engine-mpm.h" @@ -150,7 +149,6 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx) char tname[16]; uint16_t cpu = 0; TmModule *tm_module; - int cuda = 0; RunModeInitialize(); /* Available cpus */ @@ -165,116 +163,42 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx) TimeModeSetOffline(); -#if defined(__SC_CUDA_SUPPORT__) - if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { - cuda = 1; + /* create the threads */ + ThreadVars *tv_receivepcap = + TmThreadCreatePacketHandler("ReceivePcapFile", + "packetpool", "packetpool", + "detect-queue1", "simple", + "pktacqloop"); + if (tv_receivepcap == NULL) { + printf("ERROR: TmThreadsCreate failed\n"); + exit(EXIT_FAILURE); } -#endif - - if (cuda == 0) { - /* create the threads */ - ThreadVars *tv_receivepcap = - TmThreadCreatePacketHandler("ReceivePcapFile", - "packetpool", "packetpool", - "detect-queue1", "simple", - "pktacqloop"); - if (tv_receivepcap == NULL) { - printf("ERROR: TmThreadsCreate failed\n"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName("ReceivePcapFile"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName failed for ReceivePcap\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_receivepcap, tm_module, file); - - tm_module = TmModuleGetByName("DecodePcapFile"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName DecodePcap failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_receivepcap, tm_module, NULL); - - tm_module = TmModuleGetByName("StreamTcp"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName StreamTcp failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_receivepcap, tm_module, (void *)de_ctx); - - TmThreadSetCPU(tv_receivepcap, RECEIVE_CPU_SET); - - if (TmThreadSpawn(tv_receivepcap) != TM_ECODE_OK) { - printf("ERROR: TmThreadSpawn failed\n"); - exit(EXIT_FAILURE); - } -#if defined(__SC_CUDA_SUPPORT__) - } else { - /* create the threads */ - ThreadVars *tv_receivepcap = - TmThreadCreatePacketHandler("ReceivePcapFile", - "packetpool", "packetpool", - "cuda-pb", "simple", - "pktacqloop"); - if (tv_receivepcap == NULL) { - printf("ERROR: TmThreadsCreate failed\n"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName("ReceivePcapFile"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName failed for ReceivePcap\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_receivepcap, tm_module, file); - - TmThreadSetCPU(tv_receivepcap, RECEIVE_CPU_SET); - - tm_module = TmModuleGetByName("DecodePcapFile"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName DecodePcap failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_receivepcap, tm_module, NULL); - - TmThreadSetCPU(tv_receivepcap, RECEIVE_CPU_SET); - - if (TmThreadSpawn(tv_receivepcap) != TM_ECODE_OK) { - printf("ERROR: TmThreadSpawn failed\n"); - exit(EXIT_FAILURE); - } - - ThreadVars *tv_cuda_PB = - TmThreadCreate("CUDA_PB", - "cuda-pb", "simple", - "detect-queue1", "simple", - "custom", SCCudaPBTmThreadsSlot1, 0); - if (tv_cuda_PB == NULL) { - printf("ERROR: TmThreadsCreate failed for CUDA_PB\n"); - exit(EXIT_FAILURE); - } - tv_cuda_PB->type = TVT_PPT; + tm_module = TmModuleGetByName("ReceivePcapFile"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName failed for ReceivePcap\n"); + exit(EXIT_FAILURE); + } + TmSlotSetFuncAppend(tv_receivepcap, tm_module, file); - tm_module = TmModuleGetByName("CudaPacketBatcher"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName CudaPacketBatcher failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_cuda_PB, tm_module, de_ctx); + tm_module = TmModuleGetByName("DecodePcapFile"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName DecodePcap failed\n"); + exit(EXIT_FAILURE); + } + TmSlotSetFuncAppend(tv_receivepcap, tm_module, NULL); - tm_module = TmModuleGetByName("StreamTcp"); - if (tm_module == NULL) { - printf("ERROR: TmModuleGetByName StreamTcp failed\n"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_cuda_PB, tm_module, NULL); + tm_module = TmModuleGetByName("StreamTcp"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName StreamTcp failed\n"); + exit(EXIT_FAILURE); + } + TmSlotSetFuncAppend(tv_receivepcap, tm_module, (void *)de_ctx); - if (TmThreadSpawn(tv_cuda_PB) != TM_ECODE_OK) { - printf("ERROR: TmThreadSpawn failed\n"); - exit(EXIT_FAILURE); - } + TmThreadSetCPU(tv_receivepcap, RECEIVE_CPU_SET); -#endif + if (TmThreadSpawn(tv_receivepcap) != TM_ECODE_OK) { + printf("ERROR: TmThreadSpawn failed\n"); + exit(EXIT_FAILURE); } /* start with cpu 1 so that if we're creating an odd number of detect diff --git a/src/runmode-pcap.c b/src/runmode-pcap.c index 08d8d1a717..1ea1ba5976 100644 --- a/src/runmode-pcap.c +++ b/src/runmode-pcap.c @@ -22,7 +22,6 @@ #include "runmode-pcap.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "detect-engine-mpm.h" diff --git a/src/runmode-pfring.c b/src/runmode-pfring.c index c1fa684502..6acb24f840 100644 --- a/src/runmode-pfring.c +++ b/src/runmode-pfring.c @@ -23,7 +23,6 @@ #include "source-pfring.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "alert-fastlog.h" diff --git a/src/runmode-unix-socket.c b/src/runmode-unix-socket.c index 8fb15d53c0..d589233245 100644 --- a/src/runmode-unix-socket.c +++ b/src/runmode-unix-socket.c @@ -22,7 +22,6 @@ #include "runmode-pcap-file.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "source-pfring.h" #include "detect-engine-mpm.h" diff --git a/src/runmodes.c b/src/runmodes.c index 3f03800752..560c159100 100644 --- a/src/runmodes.c +++ b/src/runmodes.c @@ -46,8 +46,6 @@ #include "output.h" -#include "cuda-packet-batcher.h" - #include "source-pfring.h" int debuglog_enabled = 0; diff --git a/src/suricata.c b/src/suricata.c index a5a91b81d8..217c03690b 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -178,11 +178,6 @@ #include "util-daemon.h" #include "reputation.h" -/* holds the cuda b2g module */ -#include "util-mpm-b2g-cuda.h" -#include "util-cuda-handlers.h" -#include "cuda-packet-batcher.h" - #include "output.h" #include "util-privs.h" @@ -1455,11 +1450,6 @@ int main(int argc, char **argv) * logging module. */ SCLogLoadConfig(daemon); -#ifdef __SC_CUDA_SUPPORT__ - /* load the cuda configuration */ - SCCudaHlGetYamlConf(); -#endif /* __SC_CUDA_SUPPORT__ */ - /* Load the Host-OS lookup. */ SCHInfoLoadFromConfig(); if (!list_keywords && !list_app_layer_protocols && @@ -1598,11 +1588,6 @@ int main(int argc, char **argv) /* file log */ TmModuleLogFileLogRegister(); TmModuleLogFilestoreRegister(); - /* cuda */ -#ifdef __SC_CUDA_SUPPORT__ - TmModuleCudaMpmB2gRegister(); - TmModuleCudaPacketBatcherRegister(); -#endif TmModuleDebugList(); AppLayerHtpNeedFileInspection(); @@ -1724,15 +1709,6 @@ int main(int argc, char **argv) else { uint32_t failed = UtRunTests(regex_arg); UtCleanup(); -#ifdef __SC_CUDA_SUPPORT__ - /* need this in case any of the cuda dispatcher threads are still - * running, kill them, so that we can free the cuda contexts. We - * need to free those cuda contexts so that next when we call - * deregister functions, we will need to attach to those contexts - * the contexts and its associated data */ - TmThreadKillThreads(); - SCCudaHlDeRegisterAllRegisteredModules(); -#endif if (failed) { exit(EXIT_FAILURE); } @@ -1897,10 +1873,6 @@ int main(int argc, char **argv) if (sig_file == NULL && rule_reload == 1) UtilSignalHandlerSetup(SIGUSR2, SignalHandlerSigusr2); -#ifdef __SC_CUDA_SUPPORT__ - SCCudaPBSetUpQueuesAndBuffers(); -#endif /* __SC_CUDA_SUPPORT__ */ - SCThresholdConfInitContext(de_ctx,NULL); SCAsn1LoadConfig(); @@ -1962,14 +1934,6 @@ int main(int argc, char **argv) RunModeDispatch(run_mode, runmode_custom_mode, de_ctx); -#ifdef __SC_CUDA_SUPPORT__ - if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { - /* start the dispatcher thread for this module */ - if (B2gCudaStartDispatcherThreadRC("SC_RULES_CONTENT_B2G_CUDA") == -1) - exit(EXIT_FAILURE); - } -#endif - /* In Unix socket runmode, Flow manager is started on demand */ if (run_mode != RUNMODE_UNIX_SOCKET) { /* Spawn the unix socket manager thread */ @@ -2050,10 +2014,6 @@ int main(int argc, char **argv) /* Update the engine stage/status flag */ (void) SC_ATOMIC_CAS(&engine_stage, SURICATA_RUNTIME, SURICATA_DEINIT); -#ifdef __SC_CUDA_SUPPORT__ - SCCudaPBKillBatchingPackets(); -#endif - UnixSocketKillSocketThread(); if (run_mode != RUNMODE_UNIX_SOCKET) { @@ -2119,30 +2079,6 @@ int main(int argc, char **argv) SCPidfileRemove(pid_filename); - /** \todo review whats needed here */ -#ifdef __SC_CUDA_SUPPORT__ - if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { - /* all threadvars related to cuda should be free by now, which means - * the cuda contexts would be floating */ - if (SCCudaHlPushCudaContextFromModule("SC_RULES_CONTENT_B2G_CUDA") == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Call to " - "SCCudaHlPushCudaContextForModule() failed during the " - "shutdown phase just before the call to SigGroupCleanup()"); - } - } -#endif -#ifdef __SC_CUDA_SUPPORT__ - if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { - /* pop the cuda context we just pushed before the call to SigGroupCleanup() */ - if (SCCudaCtxPopCurrent(NULL) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Call to SCCudaCtxPopCurrent() " - "during the shutdown phase just before the call to " - "SigGroupCleanup()"); - return 0; - } - } -#endif - AppLayerHtpPrintStats(); if (global_de_ctx) { @@ -2174,13 +2110,6 @@ int main(int argc, char **argv) SCProfilingDestroy(); #endif -#ifdef __SC_CUDA_SUPPORT__ - /* all cuda contexts attached to any threads should be free by now. - * if any host_thread is still attached to any cuda_context, they need - * to pop them by the time we reach here, if they aren't using those - * cuda contexts in any way */ - SCCudaHlDeRegisterAllRegisteredModules(); -#endif #ifdef OS_WIN32 if (daemon) { return 0; diff --git a/src/tm-modules.c b/src/tm-modules.c index 9757b663bb..908938b3ac 100644 --- a/src/tm-modules.c +++ b/src/tm-modules.c @@ -255,10 +255,6 @@ const char * TmModuleTmmIdToString(TmmId id) CASE_CODE (TMM_DECODEIPFW); CASE_CODE (TMM_VERDICTIPFW); CASE_CODE (TMM_RECEIVEIPFW); -#ifdef __SC_CUDA_SUPPORT__ - CASE_CODE (TMM_CUDA_MPM_B2G); - CASE_CODE (TMM_CUDA_PACKET_BATCHER); -#endif CASE_CODE (TMM_RECEIVEERFFILE); CASE_CODE (TMM_DECODEERFFILE); CASE_CODE (TMM_RECEIVEERFDAG); diff --git a/src/tm-threads-common.h b/src/tm-threads-common.h index 53e53d0e55..2a59a7d73f 100644 --- a/src/tm-threads-common.h +++ b/src/tm-threads-common.h @@ -65,10 +65,6 @@ typedef enum { TMM_DECODEIPFW, TMM_VERDICTIPFW, TMM_RECEIVEIPFW, -#ifdef __SC_CUDA_SUPPORT__ - TMM_CUDA_MPM_B2G, - TMM_CUDA_PACKET_BATCHER, -#endif TMM_RECEIVEERFFILE, TMM_DECODEERFFILE, TMM_RECEIVEERFDAG, diff --git a/src/util-cuda-handlers.c b/src/util-cuda-handlers.c deleted file mode 100644 index e500f40f85..0000000000 --- a/src/util-cuda-handlers.c +++ /dev/null @@ -1,1068 +0,0 @@ -/* Copyright (C) 2007-2010 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file Provides cuda utility functions. - * - * \author Anoop Saldanha - * - * A module in the engine that wants to use the cuda engine, might need - * some utilities to handle contexts, modules and device_pointers. - * - * Let us say we have a module that needs to share a context among various - * sections inside it. To enable it share contexts within various - * sections the module first register itself using the function - * SCCudaHlRegisterModule() and receive a unique handle. Once it has - * retrieved the unique handle, it can then call SCCudaHlGetCudaContext(), - * with the handle. A new cuda context would be created and the internal - * data structures would be updated to associate this newly created - * context with this module handle. Any future calls to - * SCCudaHlGetCudaContext() with the same handle will return the - * cuda_context, which has already been created and associated with the - * handle. Any calls to SCCudaHlGetCudaContext() with a new handle, - * would result in the creation of a new cuda context. - * - * Similarly if we want to create a new cuda_module against a particular - * context, we can call SCCudaHlGetCudaModule() with the handle and it - * should work as above. Please do note that a cuda module can't be - * created against a handle using SCCudaHlGetCudaModule(), unless - * a cuda_context has been associated with the handle by a previous call - * to SCCudaHlGetCudaContext(). Also do note that, a cuda module is - * created against a cuda context that is associated with the current - * host thread. So do takecare to associate your host thread with the - * cuda_context that is associated with the handle, against which you - * want to call SCCudaHlGetCudaModule(). - * - * \todo Provide support for multiple cuda context storage, although it is - * highly unlikely we would need this feature. - * - * We also need to use a mutex for module_data. - */ - -#include "suricata-common.h" -#include "suricata.h" -#include "detect.h" -#include "decode.h" - -#include "util-cuda.h" -#include "util-cuda-handlers.h" -#include "util-mpm-b2g-cuda.h" - -#include "tmqh-simple.h" - -#include "conf.h" -#include "util-error.h" -#include "util-debug.h" -#include "util-unittest.h" -#include "packet-queue.h" -#include "util-mpm.h" - -/* macros decides if cuda is enabled for the platform or not */ -#ifdef __SC_CUDA_SUPPORT__ - -/* file only exists if cuda is enabled */ -#include "cuda-ptxdump.h" - -static SCCudaHlModuleData *module_data = NULL; - -static uint8_t module_handle = 1; - -/* holds the parsed cuda configuration from our yaml file */ -static SCCudaHlCudaProfile *cuda_profiles = NULL; - -/* used by unittests only */ -static SCCudaHlCudaProfile *backup_cuda_profiles = NULL; - -/** - * \brief Needed by unittests. Backup the existing cuda profile in handlers. - */ -void SCCudaHlBackupRegisteredProfiles(void) -{ - backup_cuda_profiles = cuda_profiles; - cuda_profiles = NULL; - - return; -} - -/** - * \brief Needed by unittests. Restore the previous backup of handlers' - * cuda profile. - */ -void SCCudaHlRestoreBackupRegisteredProfiles(void) -{ - cuda_profiles = backup_cuda_profiles; - - return; -} - -/** - * \brief Parse the "cuda" subsection config from our conf file. - */ -void SCCudaHlGetYamlConf(void) -{ - SCCudaHlCudaProfile *profile = NULL; - - /* "mpm" profile, found under "cuda.mpm" in the conf file */ - profile = SCMalloc(sizeof(SCCudaHlCudaProfile)); - if (unlikely(profile == NULL)) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(profile, 0, sizeof(SCCudaHlCudaProfile)); - profile->name = "mpm"; - profile->data = MpmCudaConfParse(); - if (cuda_profiles == NULL) { - cuda_profiles = profile; - } else { - profile->next = cuda_profiles; - cuda_profiles = profile; - } - - return; -} - -/** - * \brief Get a particular cuda profile specified as arg. - * - * \param profile_name Name of the the profile to retrieve. - * - * \retval Data associated with the profile. - */ -void *SCCudaHlGetProfile(char *profile_name) -{ - SCCudaHlCudaProfile *profile = cuda_profiles; - - if (cuda_profiles == NULL ) { - SCLogInfo("No cuda profile registered"); - return NULL; - } - - if (profile_name == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "argument profile NULL"); - return NULL; - } - - while (profile != NULL && strcasecmp(profile->name, profile_name) != 0) { - profile = profile->next; - } - - if (profile != NULL) - return profile->data; - else - return NULL; -} - -/** - * \brief Clean the cuda profiles, held in cuda_profiles. - */ -void SCCudaHlCleanProfiles(void) -{ - SCCudaHlCudaProfile *profile = cuda_profiles; - SCCudaHlCudaProfile *profile_next = NULL; - - while (profile != NULL) { - profile_next = profile->next; - if (profile->data != NULL) { - if (strcasecmp(profile->name, "mpm") == 0) { - MpmCudaConfCleanup(profile->data); - } - } - SCFree(profile); - profile = profile_next; - } - cuda_profiles = NULL; - - return; -} - -/** - * \internal - * \brief Get a unique handle for a new module registration. This new handle - * returned uniquely represents a module. All future calls to functions - * requires suppling this handle. - * - * \param module_handle A unique module handle that needs to used to refer - * to data(like cuda_contexts, cuda_modules, device pointers). - */ -static int SCCudaHlGetUniqueHandle(void) -{ - return module_handle++; -} - -/** - * \internal - * \brief Returns a SCCudaHlModuleData instance from the global data store - * that matches the handle sent as arg. - * - * \param handle The handle for the SCCudaHlModuleData that has to be returned. - * - * \retval data The SCCudaHlModuleData instance that matches the handle. - */ -SCCudaHlModuleData *SCCudaHlGetModuleData(uint8_t handle) -{ - SCCudaHlModuleData *data = module_data; - - if (data == NULL) - return NULL; - - while (data != NULL && data->handle != handle) { - data = data->next; - } - - return data; -} - -/** - * \internal - * \brief Returns a SCCudaHlModuleCUmodule instance that matches the cumodule_handle - * from a SCCudaHlModuleData. - * - * \param data The module data this CUmodule belongs to, obtained by a call to - * SCCudaHlGetModuleData() - * \param cumodule_handle The handle for the SCCudaHlModuleCUmodule that has to be returned. - * - * \retval The SCCudaHlModuleCUmodule instance that matches the handle. - */ -static SCCudaHlModuleCUmodule *SCCudaHlGetModuleCUmodule(SCCudaHlModuleData *data, uint8_t cumodule_handle) -{ - SCCudaHlModuleCUmodule *cumodule = NULL; - - if (data == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENT, "Argument data cannot be NULL"); - return NULL; - } - - cumodule = data->cuda_modules; - if (cumodule == NULL) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, - "No cumodule registered by the cumodule_handle %"PRIu8, cumodule_handle); - return NULL; - } - - while (cumodule != NULL && cumodule->cuda_module_handle != cumodule_handle) { - cumodule = cumodule->next; - } - - return cumodule; -} - -/** - * \brief Returns a cuda_module against the handle in the argument. - * - * If a cuda_module is not present for a handle, it is created - * and associated with this handle and the cuda_module is returned - * in the argument. - * - * \param p_module Pointer to a cuda module instance that should be updated - * with a cuda module. - * \param handle A unique handle which identifies a module. Obtained from - * a call to SCCudaHlGetUniqueHandle(). - * - * \retval A unique handle within the module that is associated with the - * loaded CUmodule. Needed for future API calls. - * \retval -1 on failure. - */ -int SCCudaHlGetCudaModuleFromFile(CUmodule *p_module, const char *filename, int handle) -{ - SCCudaHlModuleData *data = NULL; - SCCudaHlModuleCUmodule *new_module_cumodule = NULL; - SCCudaHlModuleCUmodule *module_cumodules = NULL; - - if (p_module == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments" - "p_module NULL"); - return -1; - } - - /* check if the particular module that wants a CUDA module is already - * registered or not. If it is registered, check if a context has - * been associated with the module. If yes, then we can go ahead and - * create a cuda module and associate it with the module referenced by - * the handle in the functions arguments. If no, log warning and get - * out of here */ - if ( ((data = SCCudaHlGetModuleData(handle)) == NULL) || - (data->cuda_context == 0)) { - SCLogDebug("Module not registered or no cuda context associated with " - "this module. You can't create a CUDA module without" - "associating a context with a module first. To use this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), and then register " - "a cuda context with that module using " - "SCCudaHlGetCudaContext(), after which you can call this " - "function "); - return -1; - } - - /* Register new CUmodule in the module */ - new_module_cumodule = SCMalloc(sizeof(SCCudaHlModuleCUmodule)); - if (unlikely(new_module_cumodule == NULL)) { - exit(EXIT_FAILURE); - } - memset(new_module_cumodule, 0, sizeof(SCCudaHlModuleCUmodule)); - - /* Create a cuda module, update the module with this cuda module reference - * and then return the module reference back to the calling function using - * the argument */ - if (SCCudaModuleLoad(p_module, filename) == -1) - goto error; - - new_module_cumodule->cuda_module = p_module[0]; - new_module_cumodule->cuda_module_handle = SCCudaHlGetUniqueHandle(); - - /* insert it into the cuda_modules list for the module instance */ - if (data->cuda_modules == NULL) { - data->cuda_modules = new_module_cumodule; - return new_module_cumodule->cuda_module_handle; - } - - module_cumodules = data->cuda_modules; - while (module_cumodules->next != NULL) - module_cumodules = module_cumodules->next; - module_cumodules->next = new_module_cumodule; - - return new_module_cumodule->cuda_module_handle; - - error: - return -1; -} - -/** - * \brief Returns a cuda context against the handle in the argument. - * - * If a cuda_context is not present for a handle, it is created - * and associated with this handle and the context is returned - * in the argument. If a cuda_context is already present for - * a handle, it is returned. - * - * \param p_context Pointer to a cuda context instance that should be updated - * with a cuda context. - * \param cuda_profile The cuda profile, supplied as a string. - * \param handle A unique handle which identifies a module. Obtained from - * a call to SCCudaHlGetUniqueHandle(). - * - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlGetCudaContext(CUcontext *p_context, char *cuda_profile, int handle) -{ - SCCudaHlModuleData *data = NULL; - SCCudaDevices *devices = NULL; - - if (p_context == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments. " - "p_context NULL"); - return -1; - } - - /* check if the particular module that wants a CUDA context - * is already registered or not. If it is not registered - * log a warning and get out of here */ - if ( (data = SCCudaHlGetModuleData(handle)) == NULL) { - SCLogDebug("Module not registered. You can't create a CUDA context " - "without registering a module first. To use this " - "registration facility, first register a module using " - "SCCudaHlRegisterModule(), and then register " - "a cuda context with that module hanle using " - "SCCudaHlGetCudaContext(), after which you can call this " - "function "); - return -1; - } - - if (data->cuda_context != 0) { - p_context[0] = data->cuda_context; - return 0; - } - - int device_id = SC_CUDA_DEFAULT_DEVICE; - if (cuda_profile != NULL) { - /* Get default log level and format. */ - MpmCudaConf *profile = SCCudaHlGetProfile(cuda_profile); - if (profile != NULL) { - if (SCCudaIsCudaDeviceIdValid(profile->device_id)) { - device_id = profile->device_id; - } else { - SCLogError(SC_ERR_CUDA_ERROR, "Invalid device id \"%d\" supplied. " - "Using the first device.", profile->device_id); - } - } - } - - /* Get the device list for this CUDA platform and create a new cuda context */ - devices = SCCudaGetDeviceList(); - if (SCCudaCtxCreate(p_context, 0, devices->devices[device_id]->device) == -1) - goto error; - data->cuda_context = p_context[0]; - - return 0; - - error: - return -1; -} - -/** - * \brief Returns a cuda_module against the handle in the argument. - * - * If a cuda_module is not present for a handle, it is created - * and associated with this handle and the cuda_module is returned - * in the argument. - * - * \param p_module The loaded CUmodule that is returned. - * \param ptx_image Name of the module source file, w/o the .cu extension - * \param handle A unique handle which identifies a module. Obtained from - * a call to SCCudaHlGetUniqueHandle(). - * - * \retval A unique handle within the module that is associated with the - * loaded CUmodule. Needed for future API calls. - * \retval -1 on failure. - */ -int SCCudaHlGetCudaModule(CUmodule *p_module, const char *ptx_image, int handle) -{ - SCCudaHlModuleData *data = NULL; - SCCudaHlModuleCUmodule *new_module_cumodule = NULL; - SCCudaHlModuleCUmodule *module_cumodules = NULL; - - if (p_module == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments" - "p_module NULL"); - return -1; - } - - /* check if the particular module that wants a CUDA module is already - * registered or not. If it is registered, check if a context has - * been associated with the module. If yes, then we can go ahead and - * create a cuda module and associate it with the module referenced by - * the handle in the functions arguments. If no, log warning and get - * out of here */ - if ( ((data = SCCudaHlGetModuleData(handle)) == NULL) || - (data->cuda_context == 0)) { - SCLogDebug("Module not registered or no cuda context associated with " - "this module. You can't create a CUDA module without" - "associating a context with a module first. To use this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), and then register " - "a cuda context with that module using " - "SCCudaHlGetCudaContext(), after which you can call this " - "function "); - return -1; - } - - /* Register new CUmodule in the module */ - new_module_cumodule = SCMalloc(sizeof(SCCudaHlModuleCUmodule)); - if (unlikely(new_module_cumodule == NULL)) { - exit(EXIT_FAILURE); - } - memset(new_module_cumodule, 0, sizeof(SCCudaHlModuleCUmodule)); - - /* select the ptx image based on the compute capability supported by all - * devices (i.e. the lowest) */ - char* image = SCMalloc(strlen(ptx_image)+15); - if (unlikely(image == NULL)) { - exit(EXIT_FAILURE); - } - memset(image, 0x0, strlen(ptx_image)+15); - - int major = INT_MAX; - int minor = INT_MAX; - SCCudaDevices *devices = SCCudaGetDeviceList(); - int i=0; - for (; icount; i++){ - if (devices->devices[i]->major_rev < major){ - major = devices->devices[i]->major_rev; - minor = devices->devices[i]->minor_rev; - } - if (devices->devices[i]->major_rev == major && - devices->devices[i]->minor_rev < minor){ - minor = devices->devices[i]->minor_rev; - } - } - snprintf(image, strlen(ptx_image) + 15, "%s_sm_%u%u", - ptx_image, major, minor); - - /* we don't have a cuda module associated with this module. Create a - * cuda module, update the module with this cuda module reference and - * then return the module refernce back to the calling function using - * the argument */ - SCLogDebug("Loading kernel module: %s\n",image); - if (SCCudaModuleLoadData(p_module, (void *)SCCudaPtxDumpGetModule(image)) == -1) - goto error; - SCFree(image); - - new_module_cumodule->cuda_module = p_module[0]; - new_module_cumodule->cuda_module_handle = SCCudaHlGetUniqueHandle(); - - /* insert it into the cuda_modules list for the module instance */ - if (data->cuda_modules == NULL) { - data->cuda_modules = new_module_cumodule; - return new_module_cumodule->cuda_module_handle; - } - - module_cumodules = data->cuda_modules; - while (module_cumodules->next != NULL) - module_cumodules = module_cumodules->next; - module_cumodules->next = new_module_cumodule; - - return new_module_cumodule->cuda_module_handle; - - error: - SCFree(image); - return -1; -} - -/** - * \brief Verify if a device pointer by a particular name is registered under - * a module. If it is registered, return this device pointer instance - * back; else return NULL. - * - * \param data Pointer to the module SCCudaHlModuleData instance which has to - * checked for the registration of the device pointer. - * \param name Name of the device pointer to search in the module. - * - * \retval module_device_ptr Pointer to the device pointer instance on finding - * it; NULL otherwise. - */ -SCCudaHlModuleDevicePointer *SCCudaHlCudaDevicePtrAvailable(SCCudaHlModuleCUmodule *cumodule, - const char *name) -{ - SCCudaHlModuleDevicePointer *module_device_ptr = cumodule->device_ptrs; - - while (module_device_ptr != NULL && - strcmp(module_device_ptr->name, name) != 0) { - module_device_ptr = module_device_ptr->next; - } - - return module_device_ptr; -} - -/** - * \brief Returns a cuda_device_pointer against the handle in the argument. - * - * If a device pointer by the name \"name\" is not registered for the - * handle, it is created and associated with this handle and cuda mem is - * alloted and the cuda_device_pointer is returned in the argument. - * If a device pointer by the name \"name\" is already registered with - * the handle, the cuda_device_pointer is returned in the argument. - * - * \param device_ptr Pointer to the device pointer instance which should be - * with the cuda_device_pointer that has to be returned back. - * \param name Name of the device pointer by which we have to search - * module for its existance. - * \param size Size of the cuda device memory to be alloted. - * \param host_ptr If any host memory has to be transferred to the cuda device - * memory, it can sent using this argument. host_ptr should - * hold atleast size bytes in memory. - * \param handle A unique handle which identifies a module. Obtained from - * a call to SCCudaHlGetUniqueHandle(). - * \param cumodule_handle A handle that identifies the CUmodule within the above module. - * Obtained from a call to SCCudaHlGetCudaModule() or - * SCCudaHlGetCudaModuleFromFile(). - * - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlGetCudaDevicePtr(CUdeviceptr *device_ptr, const char *name, - size_t size, void *host_ptr, int handle, - int cumodule_handle) -{ - SCCudaHlModuleData *data = NULL; - SCCudaHlModuleCUmodule *cumodule = NULL; - SCCudaHlModuleDevicePointer *new_module_device_ptr = NULL; - SCCudaHlModuleDevicePointer *module_device_ptr = NULL; - - if (device_ptr == NULL || name == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments" - "device_ptr is NULL or name is NULL"); - goto error; - } - - /* check if the particular module that wants to allocate device memory is - * already registered or not. If it is registered, check if a context has - * been associated with the module. If yes, then we can go ahead and - * create the device memory or return the reference to the device memory if - * we already have the device memory associated with the module. If no, " - * log warning and get out of here */ - if ( ((data = SCCudaHlGetModuleData(handle)) == NULL) || - (data->cuda_context == 0)) { - SCLogDebug("Module not registered or no cuda context associated with " - "this module. You can't create a CUDA module without" - "associating a context with a module first. To use this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), and then register " - "a cuda context with that module using " - "SCCudaHlGetCudaContext(), after which you can call this " - "function "); - goto error; - } - - if ( (cumodule = SCCudaHlGetModuleCUmodule(data, cumodule_handle)) == NULL ) { - SCLogDebug("CUmodule not registered with the module. Before you can request" - "a device pointer for a module you need to load the CUmodule into" - "the engine module using SCCudaHlGetCudaModule() or" - "SCCudaHlGetCudaModuleFromFile()."); - goto error; - } - - /* if we already have a device pointer registered by this name return the - * cuda device pointer instance */ - if ( (module_device_ptr = SCCudaHlCudaDevicePtrAvailable(cumodule, name)) != NULL) { - device_ptr[0] = module_device_ptr->d_ptr; - return 0; - } - - new_module_device_ptr = SCMalloc(sizeof(SCCudaHlModuleDevicePointer)); - if (unlikely(new_module_device_ptr == NULL)) - goto error; - memset(new_module_device_ptr, 0, sizeof(SCCudaHlModuleDevicePointer)); - - if ( (new_module_device_ptr->name = SCStrdup(name)) == NULL) { - SCLogError(SC_ERR_FATAL, "Fatal error encountered in SCCudaHlGetCudaDevicePtr. Exiting..."); - exit(EXIT_FAILURE); - } - - /* allocate the cuda memory */ - if (SCCudaMemAlloc(&new_module_device_ptr->d_ptr, size) == -1) - goto error; - - /* if the user has supplied a host buffer, copy contents to the device mem */ - if (host_ptr != NULL) { - if (SCCudaMemcpyHtoD(new_module_device_ptr->d_ptr, host_ptr, - size) == -1) { - goto error; - } - } - - /* send the newly assigned device pointer back to the caller */ - device_ptr[0] = new_module_device_ptr->d_ptr; - - /* insert it into the device_ptr list for the module instance */ - if (cumodule->device_ptrs == NULL) { - cumodule->device_ptrs = new_module_device_ptr; - return 0; - } - - module_device_ptr = cumodule->device_ptrs; - while (module_device_ptr->next != NULL) - module_device_ptr = module_device_ptr->next; - module_device_ptr->next = new_module_device_ptr; - - return 0; - - error: - if (new_module_device_ptr != NULL) - SCFree(new_module_device_ptr); - return -1; -} - -/** - * \brief Frees a Cuda Device Pointer. - * - * If a device pointer by the name \"name\" is registered for this - * handle, it is freed. - * - * \param name Name of the device pointer by which we have to search - * module for its existance. - * \param handle A unique handle which identifies a module. Obtained from - * a call to SCCudaHlGetUniqueHandle(). - * \param cumodule A handle that identifies the CUmodule within the above module. - * Obtained from a call to SCCudaHlGetCudaModule() or - * SCCudaHlGetCudaModuleFromFile(). - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlFreeCudaDevicePtr(const char *name, int handle, int cumodule_handle) -{ - SCCudaHlModuleData *data = NULL; - SCCudaHlModuleCUmodule *cumodule = NULL; - SCCudaHlModuleDevicePointer *module_device_ptr = NULL; - SCCudaHlModuleDevicePointer *temp_module_device_ptr = NULL; - - if (name == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments" - "device_ptr is NULL or name is NULL"); - goto error; - } - - /* check if the particular module that wants to free device memory is - * already registered or not. If it is registered, check if a context has - * been associated with the module. If yes, then we can go ahead and - * free the device memory. - */ - if ( ((data = SCCudaHlGetModuleData(handle)) == NULL) || - (data->cuda_context == 0)) { - SCLogDebug("Module not registered or no cuda context associated with " - "this module. You can't create a CUDA module without" - "associating a context with a module first. To use this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), and then register " - "a cuda context with that module using " - "SCCudaHlGetCudaContext(), after which you can call this " - "function "); - goto error; - } - - if ( (cumodule = SCCudaHlGetModuleCUmodule(data, cumodule_handle)) == NULL ) { - SCLogDebug("CUmodule not registered with the module. Before you can request" - "a device pointer for a module you need to load the CUmodule into" - "the engine module using SCCudaHlGetCudaModule() or" - "SCCudaHlGetCudaModuleFromFile()."); - goto error; - } - - /* if we do not have a device pointer registered by this name get out */ - if ( (module_device_ptr = SCCudaHlCudaDevicePtrAvailable(cumodule, name)) == NULL) { - goto error; - } - - SCCudaMemFree(module_device_ptr->d_ptr); - module_device_ptr->d_ptr = 0; - if (module_device_ptr == cumodule->device_ptrs) { - cumodule->device_ptrs = cumodule->device_ptrs->next; - } else { - temp_module_device_ptr = cumodule->device_ptrs; - while (strcmp(temp_module_device_ptr->next->name, name) != 0) { - temp_module_device_ptr = temp_module_device_ptr->next; - } - temp_module_device_ptr->next = temp_module_device_ptr->next->next; - } - SCFree(module_device_ptr->name); - SCFree(module_device_ptr); - - return 0; - - error: - return -1; -} - -/** - * \brief Registers a Dispatcher function against this handle. - * - * \param SCCudaHlDispFunc Pointer to a dispatcher function to be registered - * for this handle. - * \param handle A unique handle which identifies a module. Obtained - * from a call to SCCudaHlGetUniqueHandle(). - * - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlRegisterDispatcherFunc(void *(*SCCudaHlDispFunc)(void *), int handle) -{ - SCCudaHlModuleData *data = NULL; - - if (SCCudaHlDispFunc == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments" - "SCCudaHlDispFunc NULL"); - return -1; - } - - if ( (data = SCCudaHlGetModuleData(handle)) == NULL) { - SCLogDebug("Module not registered. To avail the benefits of this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), after which you " - "can call this function"); - return -1; - } - - data->SCCudaHlDispFunc = SCCudaHlDispFunc; - - return 0; -} - -/** - * \brief Get the name of the module associated with the module whose handle is - * sent as the arg. - * - * \param handle The handle of the module which has to be searched. - * - * \retval data->name The name of the module on finding a module that matches - * the handle sent as argument; NULL on failure. - */ -const char *SCCudaHlGetModuleName(int handle) -{ - SCCudaHlModuleData *data = module_data; - - while (data != NULL && data->handle != handle) { - data = data->next; - } - - if (data == NULL) - return NULL; - - return data->name; -} - -/** - * \brief Get the handle associated with this module who name is sent as the arg. - * - * \param name The name of the module which has to be searched. - * - * \retval data->handle The handle to the module on finding a module that - * matches the name sent as argument; -1 on failure. - */ -int SCCudaHlGetModuleHandle(const char *name) -{ - SCCudaHlModuleData *data = module_data; - - while (data != NULL && - strcmp(data->name, name) != 0) { - data = data->next; - } - - if (data == NULL) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "A cuda module by the name \"%s\" " - "hasn't been registered", name); - return -1; - } - - return data->handle; -} - -/** - * \brief Register a new module. To understand what exactly these utilities are - * needed for please look at the file comments. - * - * \param name A unique name to register the module with. No module should have - * registered itself previously with this name. - * - * \retval handle A unique handle that is associated with this module and all - * future use of API would require supplying this handle. - */ -int SCCudaHlRegisterModule(const char *name) -{ - SCCudaHlModuleData *data = module_data; - SCCudaHlModuleData *new_data = NULL; - - while (data != NULL && - strcmp(data->name, name) != 0) { - data = data->next; - } - - if (data != NULL) { - SCLogInfo("Module \"%s\" already registered. Returning the handle " - "for the already registered module", name); - return data->handle; - } - - /* the module is not already registered. Register the module */ - new_data = SCMalloc(sizeof(SCCudaHlModuleData)); - if (unlikely(new_data == NULL)) { - exit(EXIT_FAILURE); - } - memset(new_data, 0, sizeof(SCCudaHlModuleData)); - - if ( (new_data->name = SCStrdup(name)) == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - - new_data->handle = SCCudaHlGetUniqueHandle(); - - /* first module to be registered */ - if (module_data == NULL) { - module_data = new_data; - return new_data->handle; - } - - /* add this new module_data instance to the global module_data list */ - data = module_data; - while (data->next != NULL) - data = data->next; - data->next = new_data; - - return new_data->handle; -} - -/** - * \brief DeRegister a registered module. - * - * \param name Name of the module to deregister. - * - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlDeRegisterModule(const char *name) -{ - SCCudaHlModuleData *data = NULL; - SCCudaHlModuleData *prev_data = NULL; - SCCudaHlModuleCUmodule *cumodule = NULL; - SCCudaHlModuleCUmodule *temp_cumodule = NULL; - SCCudaHlModuleDevicePointer *device_ptr = NULL; - SCCudaHlModuleDevicePointer *temp_device_ptr = NULL; - int module_handle = SCCudaHlGetModuleHandle(name); - - /* get the module */ - data = (module_handle == -1) ? NULL : SCCudaHlGetModuleData(module_handle); - - /* a module by this name doesn't exist. Log Error and return */ - if (data == NULL) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Module \"%s\" not " - "registered", name); - return -1; - } - - /* the application must take care to check that the following cuda context - * which is being freed is floating(not attached to any host thread) */ - if (data->cuda_context != 0) - SCCudaCtxPushCurrent(data->cuda_context); - - /* looks like we do have a module registered by this name. - * Go through all CUmodules registered in this module and - * free cuda device pointers and unload the module. - */ - cumodule = data->cuda_modules; - while (cumodule != NULL) { - /* free all device pointers */ - device_ptr = cumodule->device_ptrs; - while (device_ptr != NULL) { - temp_device_ptr = device_ptr; - device_ptr = device_ptr->next; - if (SCCudaMemFree(temp_device_ptr->d_ptr) == -1) - goto error; - SCFree(temp_device_ptr->name); - SCFree(temp_device_ptr); - } - cumodule->device_ptrs = NULL; - - /* unload the cuda module */ - temp_cumodule = cumodule; - cumodule = cumodule->next; - if (SCCudaModuleUnload(temp_cumodule->cuda_module) == -1) - goto error; - SCFree(temp_cumodule); - } - data->cuda_modules = NULL; - - if (data->name != NULL) - SCFree((void *)data->name); - - /* clean the dispatcher function registered */ - data->SCCudaHlDispFunc = NULL; - - /* destroy the cuda context */ - if (data->cuda_context != 0) { - if (SCCudaCtxDestroy(data->cuda_context) == -1) - goto error; - } - - /* find the previous module data instance */ - if (module_data == data) { - module_data = module_data->next; - } else { - prev_data = module_data; - while (prev_data->next != data) - prev_data = prev_data->next; - prev_data->next = data->next; - } - - /* delete the module data instance */ - SCFree(data); - - /* mission accomplished. let's go */ - return 0; - error: - return -1; -} - -/** - * \brief DeRegister all the modules registered under cuda handlers. - */ -void SCCudaHlDeRegisterAllRegisteredModules(void) -{ - SCCudaHlModuleData *data = module_data; - SCCudaHlModuleData *next_data = NULL; - - next_data = data; - while (data != NULL) { - next_data = data->next; - if (SCCudaHlDeRegisterModule(data->name) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Error de-registering module " - "\"%s\"", data->name); - } - data = next_data; - } - - module_data = NULL; - - return; -} - -/** - * \brief Pushes a cuda context for the calling thread. - * - * Before calling this function make sure that the cuda context belonging - * to the registered module, is floating(not attached to any host thread). - * - * \param name Name of the registered module whose cuda context has to be - * pushed for the calling thread. - * - * \retval 0 On success. - * \retval -1 On failure. - */ -int SCCudaHlPushCudaContextFromModule(const char *name) -{ - SCCudaHlModuleData *data = SCCudaHlGetModuleData(SCCudaHlGetModuleHandle(name)); - - if (data == NULL) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "No module registered by the " - "name \"%s\"", name); - return -1; - } - - if (SCCudaCtxPushCurrent(data->cuda_context) == -1) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR, "Error pushing cuda context from " - "module \"%s\" for this calling thread\n", name); - return -1; - } - - return 0; -} - -/** - * \brief Used for testing purposes. Running tests with cuda enabled - * requires some hacks, which is what this function does. - * - * \retval 1 Always. - */ -int SCCudaHlTestEnvCudaContextInit(void) -{ - CUcontext context; - int module_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - if (SCCudaHlGetCudaContext(&context, NULL, module_handle) == -1) { - printf("Error getting a cuda context"); - } - if (SCCudaHlPushCudaContextFromModule("SC_RULES_CONTENT_B2G_CUDA") == -1) { - printf("Call to SCCudaHlPushCudaContextForModule() failed\n"); - } - - return 1; -} - -/** - * \brief Used for testing purposes. Running tests with cuda enabled - * requires some hacks, which is what this function does. - * - * \retval 1 Always. - */ -int SCCudaHlTestEnvCudaContextDeInit(void) -{ - if (SCCudaCtxPopCurrent(NULL) == -1) { - printf("Call to SCCudaCtxPopCurrent() failed\n"); - return 0; - } - - return 1; -} - -#endif /* __SC_CUDA_SUPPORT */ diff --git a/src/util-cuda-handlers.h b/src/util-cuda-handlers.h deleted file mode 100644 index b014663819..0000000000 --- a/src/util-cuda-handlers.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2007-2010 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file Provides cuda utility functions. - * - * \author Anoop Saldanha - */ - -/* macros decides if cuda is enabled for the platform or not */ -#ifdef __SC_CUDA_SUPPORT__ - -#include - -#ifndef __UTIL_MPM_CUDA_HANDLERS_H__ -#define __UTIL_MPM_CUDA_HANDLERS_H__ - -typedef enum { - SC_CUDA_HL_MTYPE_RULE_NONE = -1, - SC_CUDA_HL_MTYPE_RULE_CONTENTS = 0, - SC_CUDA_HL_MTYPE_RULE_URICONTENTS, - SC_CUDA_HL_MTYPE_APP_LAYER, - SC_CUDA_HL_MTYPE_RULE_CUSTOM, - SC_CUDA_HL_MTYPE_MAX, -} SCCudaHlModuleType; - -typedef struct SCCudaHlModuleDevicePointer_ { - /* device pointer name. This is a primary key. For the same module you - * can't register different device pointers */ - char *name; - CUdeviceptr d_ptr; - - struct SCCudaHlModuleDevicePointer_ *next; -} SCCudaHlModuleDevicePointer; - -typedef struct SCCudaHlModuleCUmodule_ { - /* Handle for this CUmodule. This has to be first obtained from the - * call to SCCudaHlGetCudaModule() or SCCudaHlGetCudaModuleFromFile() */ - int cuda_module_handle; - - CUmodule cuda_module; - SCCudaHlModuleDevicePointer *device_ptrs; - - struct SCCudaHlModuleCUmodule_ *next; -} SCCudaHlModuleCUmodule; - -typedef struct SCCudaHlModuleData_ { - /* The unique module handle. This has to be first obtained from the - * call to SCCudaHlGetUniqueHandle() */ - const char *name; - int handle; - - CUcontext cuda_context; - SCCudaHlModuleCUmodule *cuda_modules; - void *(*SCCudaHlDispFunc)(void *); - - struct SCCudaHlModuleData_ *next; -} SCCudaHlModuleData; - -/** - * \brief Used to hold the cuda configuration from our conf yaml file - */ -typedef struct SCCudaHlCudaProfile_ { - /* profile name. Should be unique */ - char *name; - /* the data associated with this profile */ - void *data; - - struct SCCudaHlCudaProfile_ *next; -} SCCudaHlCudaProfile; - -void SCCudaHlGetYamlConf(void); -void *SCCudaHlGetProfile(char *); -void SCCudaHlCleanProfiles(void); -void SCCudaHlBackupRegisteredProfiles(void); -void SCCudaHlRestoreBackupRegisteredProfiles(void); - -int SCCudaHlGetCudaContext(CUcontext *, char *, int); -int SCCudaHlGetCudaModule(CUmodule *, const char *, int); -int SCCudaHlGetCudaModuleFromFile(CUmodule *, const char *, int); -int SCCudaHlGetCudaDevicePtr(CUdeviceptr *, const char *, size_t, void *, int, int); -int SCCudaHlFreeCudaDevicePtr(const char *, int, int); -int SCCudaHlRegisterDispatcherFunc(void *(*SCCudaHlDispFunc)(void *), int); - -SCCudaHlModuleData *SCCudaHlGetModuleData(uint8_t); -const char *SCCudaHlGetModuleName(int); -int SCCudaHlGetModuleHandle(const char *); - -int SCCudaHlRegisterModule(const char *); -int SCCudaHlDeRegisterModule(const char *); -void SCCudaHlDeRegisterAllRegisteredModules(void); - -int SCCudaHlPushCudaContextFromModule(const char *); - -int SCCudaHlTestEnvCudaContextInit(void); -int SCCudaHlTestEnvCudaContextDeInit(void); - -void SCCudaHlProcessPacketWithDispatcher(Packet *, DetectEngineThreadCtx *, - void *); -void SCCudaHlProcessUriWithDispatcher(uint8_t *, uint16_t, DetectEngineThreadCtx *, - void *); - -#endif /* __UTIL_CUDA_HANDLERS__ */ - -#endif /* __SC_CUDA_SUPPORT__ */ diff --git a/src/util-mpm-b2g-cuda.c b/src/util-mpm-b2g-cuda.c deleted file mode 100644 index ed35500df1..0000000000 --- a/src/util-mpm-b2g-cuda.c +++ /dev/null @@ -1,3752 +0,0 @@ -/* Copyright (C) 2007-2013 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Victor Julien - * \author Anoop Saldanha - * \author Martin Beyer - */ - -#include "suricata-common.h" -#include "suricata.h" -#include "detect.h" -#include "detect-engine-mpm.h" -#include "util-bloomfilter.h" -#include "util-mpm-b2g-cuda.h" -#include "util-mpm.h" -#include "util-print.h" - -#include "threadvars.h" - -#include "util-error.h" -#include "util-debug.h" -#include "util-unittest.h" -#include "conf.h" - -#include "util-cuda-handlers.h" -#include "util-cuda.h" -#include "util-cpu.h" -#include "tm-threads.h" -#include "threads.h" -#include "tmqh-simple.h" - -#include "detect-engine-address.h" -#include "detect-engine-port.h" -#include "detect-engine.h" -#include "detect-parse.h" - -#include "cuda-packet-batcher.h" - -/* macros decides if cuda is enabled for the platform or not */ -#ifdef __SC_CUDA_SUPPORT__ - -#define INIT_HASH_SIZE 65536 - -#ifdef B2G_CUDA_COUNTERS -#define COUNT(counter) (counter) -#else -#define COUNT(counter) -#endif /* B2G_CUDA_COUNTERS */ - -static uint32_t b2g_hash_size = 0; -static uint32_t b2g_bloom_size = 0; -static void *b2g_func; - -/* threadvars Cuda(C) Mpm(M) B2G(B) Rules(R) Content(C) */ -ThreadVars *tv_CMB2_RC = NULL; - -void B2gCudaInitCtx(MpmCtx *, int); -void B2gCudaThreadInitCtx(MpmCtx *, MpmThreadCtx *, uint32_t); -void B2gCudaDestroyCtx(MpmCtx *); -void B2gCudaThreadDestroyCtx(MpmCtx *, MpmThreadCtx *); -int B2gCudaAddPatternCI(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, - uint32_t, uint32_t, uint8_t); -int B2gCudaAddPatternCS(MpmCtx *, uint8_t *, uint16_t, uint16_t, uint16_t, - uint32_t, uint32_t, uint8_t); -int B2gCudaPreparePatterns(MpmCtx *mpm_ctx); -uint32_t B2gCudaSearchWrap(MpmCtx *, MpmThreadCtx *, - PatternMatcherQueue *, uint8_t *, - uint16_t); -uint32_t B2gCudaSearch1(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -#ifdef B2G_CUDA_SEARCH2 -uint32_t B2gCudaSearch2(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -#endif -uint32_t B2gCudaSearch(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -uint32_t B2gCudaSearchBNDMq(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -void B2gCudaPrintInfo(MpmCtx *); -void B2gCudaPrintSearchStats(MpmThreadCtx *); -void B2gCudaRegisterTests(void); - -/** - * \brief Register the CUDA B2g Mpm. - */ -void MpmB2gCudaRegister(void) -{ - mpm_table[MPM_B2G_CUDA].name = "b2g_cuda"; - mpm_table[MPM_B2G_CUDA].max_pattern_length = B2G_CUDA_WORD_SIZE; - mpm_table[MPM_B2G_CUDA].InitCtx = B2gCudaInitCtx; - mpm_table[MPM_B2G_CUDA].InitThreadCtx = B2gCudaThreadInitCtx; - mpm_table[MPM_B2G_CUDA].DestroyCtx = B2gCudaDestroyCtx; - mpm_table[MPM_B2G_CUDA].DestroyThreadCtx = B2gCudaThreadDestroyCtx; - mpm_table[MPM_B2G_CUDA].AddPattern = B2gCudaAddPatternCS; - mpm_table[MPM_B2G_CUDA].AddPatternNocase = B2gCudaAddPatternCI; - mpm_table[MPM_B2G_CUDA].Prepare = B2gCudaPreparePatterns; - mpm_table[MPM_B2G_CUDA].Search = B2gCudaSearchWrap; - mpm_table[MPM_B2G_CUDA].Cleanup = NULL; - mpm_table[MPM_B2G_CUDA].PrintCtx = B2gCudaPrintInfo; - mpm_table[MPM_B2G_CUDA].PrintThreadCtx = B2gCudaPrintSearchStats; - mpm_table[MPM_B2G_CUDA].RegisterUnittests = B2gCudaRegisterTests; -} - -void B2gCudaPrintInfo(MpmCtx *mpm_ctx) -{ -#ifdef DEBUG - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - SCLogDebug("MPM B2g Cuda Information:"); - SCLogDebug("Memory allocs: %" PRIu32, mpm_ctx->memory_cnt); - SCLogDebug("Memory alloced: %" PRIu32, mpm_ctx->memory_size); - SCLogDebug(" Sizeofs:"); - SCLogDebug(" MpmCtx %" PRIuMAX, (uintmax_t)sizeof(MpmCtx)); - SCLogDebug(" B2gCudaCtx %" PRIuMAX, (uintmax_t)sizeof(B2gCudaCtx)); - SCLogDebug(" B2gCudaPattern %" PRIuMAX, (uintmax_t)sizeof(B2gCudaPattern)); - SCLogDebug(" B2gCudaHashItem %" PRIuMAX, (uintmax_t)sizeof(B2gCudaHashItem)); - SCLogDebug("Unique Patterns: %" PRIu32, mpm_ctx->pattern_cnt); - SCLogDebug("Smallest: %" PRIu32, mpm_ctx->minlen); - SCLogDebug("Largest: %" PRIu32, mpm_ctx->maxlen); - SCLogDebug("Hash size: %" PRIu32, ctx->hash_size); -#endif - - return; -} - -static inline B2gCudaPattern *B2gCudaAllocPattern(MpmCtx *mpm_ctx) -{ - B2gCudaPattern *p = SCMalloc(sizeof(B2gCudaPattern)); - if (unlikely(p == NULL)) - return NULL; - memset(p, 0, sizeof(B2gCudaPattern)); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += sizeof(B2gCudaPattern); - - return p; -} - -static inline B2gCudaHashItem *B2gCudaAllocHashItem(MpmCtx *mpm_ctx) -{ - B2gCudaHashItem *hi = SCMalloc(sizeof(B2gCudaHashItem)); - if (unlikely(hi == NULL)) - return NULL; - memset(hi, 0, sizeof(B2gCudaHashItem)); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += sizeof(B2gCudaHashItem); - - return hi; -} - -static void B2gCudaHashFree(MpmCtx *mpm_ctx, B2gCudaHashItem *hi) -{ - if (hi == NULL) - return; - - B2gCudaHashItem *t = hi->nxt; - B2gCudaHashFree(mpm_ctx, t); - - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= sizeof(B2gCudaHashItem); - SCFree(hi); - - return; -} - -static inline void memcpy_tolower(uint8_t *d, uint8_t *s, uint16_t len) -{ - uint16_t i; - for (i = 0; i < len; i++) - d[i] = u8_tolower(s[i]); - - return; -} - -static inline uint32_t B2gCudaInitHash(B2gCudaPattern *p) -{ - uint32_t hash = p->len * p->original_pat[0]; - if (p->len > 1) - hash += p->original_pat[1]; - - return (hash % INIT_HASH_SIZE); -} - -static inline uint32_t B2gCudaInitHashRaw(uint8_t *pat, uint16_t patlen) -{ - uint32_t hash = patlen * pat[0]; - if (patlen > 1) - hash += pat[1]; - - return (hash % INIT_HASH_SIZE); -} - -static inline int B2gCudaInitHashAdd(B2gCudaCtx *ctx, B2gCudaPattern *p) -{ - uint32_t hash = B2gCudaInitHash(p); - - if (ctx->init_hash[hash] == NULL) { - ctx->init_hash[hash] = p; - return 0; - } - - B2gCudaPattern *tt = NULL; - B2gCudaPattern *t = ctx->init_hash[hash]; - - /* get the list tail */ - do { - tt = t; - t = t->next; - } while (t != NULL); - - tt->next = p; - - return 0; -} - -static inline int B2gCudaCmpPattern(B2gCudaPattern *p, uint8_t *pat, - uint16_t patlen, char flags) -{ - if (p->len != patlen) - return 0; - - if (p->flags != flags) - return 0; - - if (memcmp(p->cs, pat, patlen) != 0) - return 0; - - return 1; -} - -static inline B2gCudaPattern *B2gCudaInitHashLookup(B2gCudaCtx *ctx, uint8_t *pat, - uint16_t patlen, char flags, - uint32_t pid) -{ - uint32_t hash = B2gCudaInitHashRaw(pat, patlen); - - if (ctx->init_hash[hash] == NULL) - return NULL; - - B2gCudaPattern *t = ctx->init_hash[hash]; - for ( ; t != NULL; t = t->next) { - //if (B2gCudaCmpPattern(t, pat, patlen, flags) == 1) - if (t->flags == flags && t->id == pid) - return t; - } - - return NULL; -} - -void B2gCudaFreePattern(MpmCtx *mpm_ctx, B2gCudaPattern *p) -{ - if (p != NULL && p->cs != NULL && p->cs != p->ci) { - SCFree(p->cs); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= p->len; - } - - if (p != NULL && p->ci != NULL) { - SCFree(p->ci); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= p->len; - } - - if (p != NULL) { - SCFree(p); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= sizeof(B2gCudaPattern); - } - - return; -} - -static inline int B2gCudaAddPattern(MpmCtx *mpm_ctx, uint8_t *pat, - uint16_t patlen, uint16_t offset, - uint16_t depth, uint32_t pid, - uint32_t sid, uint8_t flags) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - - SCLogDebug("ctx %p len %"PRIu16" pid %" PRIu32, ctx, patlen, pid); - - if (patlen == 0) - return 0; - - /* get a memory piece */ - B2gCudaPattern *p = B2gCudaInitHashLookup(ctx, pat, patlen, flags, pid); - if (p == NULL) { - SCLogDebug("allocing new pattern"); - - p = B2gCudaAllocPattern(mpm_ctx); - if (p == NULL) - goto error; - - p->len = patlen; - p->flags = flags; - p->id = pid; - - p->original_pat = SCMalloc(patlen); - if (p->original_pat == NULL) - goto error; - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += patlen; - memcpy(p->original_pat, pat, patlen); - - /* setup the case insensitive part of the pattern */ - p->ci = SCMalloc(patlen); - if (p->ci == NULL) - goto error; - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += patlen; - memcpy_tolower(p->ci, pat, patlen); - - /* setup the case sensitive part of the pattern */ - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - /* nocase means no difference between cs and ci */ - p->cs = p->ci; - } else { - if (memcmp(p->ci,pat,p->len) == 0) { - /* no diff between cs and ci: pat is lowercase */ - p->cs = p->ci; - } else { - p->cs = SCMalloc(patlen); - if (p->cs == NULL) - goto error; - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += patlen; - memcpy(p->cs, pat, patlen); - } - } - - //printf("B2gAddPattern: ci \""); prt(p->ci,p->len); - //printf("\" cs \""); prt(p->cs,p->len); - //printf("\"\n"); - - /* put in the pattern hash */ - B2gCudaInitHashAdd(ctx, p); - - if (mpm_ctx->pattern_cnt == 65535) { - printf("Max search words reached\n"); - exit(1); - } - - mpm_ctx->pattern_cnt++; - - if (mpm_ctx->maxlen < patlen) mpm_ctx->maxlen = patlen; - if (mpm_ctx->minlen == 0) mpm_ctx->minlen = patlen; - else if (mpm_ctx->minlen > patlen) mpm_ctx->minlen = patlen; - } - - return 0; - -error: - B2gCudaFreePattern(mpm_ctx, p); - return -1; -} - -int B2gCudaAddPatternCI(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, - uint16_t offset, uint16_t depth, uint32_t pid, - uint32_t sid, uint8_t flags) -{ - flags |= MPM_PATTERN_FLAG_NOCASE; - return B2gCudaAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags); -} - -int B2gCudaAddPatternCS(MpmCtx *mpm_ctx, uint8_t *pat, uint16_t patlen, - uint16_t offset, uint16_t depth, uint32_t pid, - uint32_t sid, uint8_t flags) -{ - return B2gCudaAddPattern(mpm_ctx, pat, patlen, offset, depth, pid, sid, flags); -} - -static inline uint32_t B2gCudaBloomHash(void *data, uint16_t datalen, uint8_t iter, - uint32_t hash_size) -{ - uint8_t *d = (uint8_t *)data; - uint16_t i; - uint32_t hash = (uint32_t)u8_tolower(*d); - - for (i = 1; i < datalen; i++) { - d++; - hash += (u8_tolower(*d)) ^ i; - } - hash <<= (iter+1); - hash %= hash_size; - - return hash; -} - -static void B2gCudaPrepareHash(MpmCtx *mpm_ctx) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - uint16_t i = 0; - uint16_t idx = 0; - uint8_t idx8 = 0; - - ctx->hash = (B2gCudaHashItem **)SCMalloc(sizeof(B2gCudaHashItem *) * - ctx->hash_size); - if (ctx->hash == NULL) - goto error; - memset(ctx->hash, 0, sizeof(B2gCudaHashItem *) * ctx->hash_size); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (sizeof(B2gCudaHashItem *) * ctx->hash_size); - -#ifdef B2G_CUDA_SEARCH2 - ctx->hash2 = (B2gCudaHashItem **)SCMalloc(sizeof(B2gCudaHashItem *) * - ctx->hash_size); - if (ctx->hash2 == NULL) - goto error; - memset(ctx->hash2, 0, sizeof(B2gCudaHashItem *) * ctx->hash_size); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (sizeof(B2gCudaHashItem *) * ctx->hash_size); -#endif - - /* alloc the pminlen array */ - ctx->pminlen = (uint8_t *)SCMalloc(sizeof(uint8_t) * ctx->hash_size); - if (ctx->pminlen == NULL) - goto error; - memset(ctx->pminlen, 0, sizeof(uint8_t) * ctx->hash_size); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (sizeof(uint8_t) * ctx->hash_size); - - for (i = 0; i < mpm_ctx->pattern_cnt; i++) - { - if(ctx->parray[i]->len == 1) { - idx8 = (uint8_t)ctx->parray[i]->ci[0]; - if (ctx->hash1[idx8].flags == 0) { - ctx->hash1[idx8].idx = i; - ctx->hash1[idx8].flags |= 0x01; - } else { - B2gCudaHashItem *hi = B2gCudaAllocHashItem(mpm_ctx); - if (hi == NULL) - goto error; - hi->idx = i; - hi->flags |= 0x01; - - /* Append this HashItem to the list */ - B2gCudaHashItem *thi = &ctx->hash1[idx8]; - while (thi->nxt) - thi = thi->nxt; - thi->nxt = hi; - } - ctx->pat_1_cnt++; -#ifdef B2G_CUDA_SEARCH2 - } else if(ctx->parray[i]->len == 2) { - idx = B2G_CUDA_HASH16(ctx->parray[i]->ci[0], ctx->parray[i]->ci[1]); - if (ctx->hash2[idx] == NULL) { - B2gCudaHashItem *hi = B2gCudaAllocHashItem(mpm_ctx); - if (hi == NULL) - goto error; - hi->idx = i; - hi->flags |= 0x01; - - ctx->hash2[idx] = hi; - } else { - B2gCudaHashItem *hi = B2gCudaAllocHashItem(mpm_ctx); - if (hi == NULL) - goto error; - hi->idx = i; - hi->flags |= 0x01; - - /* Append this HashItem to the list */ - B2gCudaHashItem *thi = ctx->hash2[idx]; - while (thi->nxt) - thi = thi->nxt; - thi->nxt = hi; - } - ctx->pat_2_cnt++; -#endif - } else { - idx = B2G_CUDA_HASH16(ctx->parray[i]->ci[ctx->m - 2], - ctx->parray[i]->ci[ctx->m - 1]); - SCLogDebug("idx %" PRIu32 ", %c.%c", idx, ctx->parray[i]->ci[ctx->m - 2], - ctx->parray[i]->ci[ctx->m - 1]); - - if (ctx->hash[idx] == NULL) { - B2gCudaHashItem *hi = B2gCudaAllocHashItem(mpm_ctx); - if (hi == NULL) - goto error; - hi->idx = i; - hi->flags |= 0x01; - ctx->pminlen[idx] = ctx->parray[i]->len; - - ctx->hash[idx] = hi; - } else { - B2gCudaHashItem *hi = B2gCudaAllocHashItem(mpm_ctx); - if (hi == NULL) - goto error; - hi->idx = i; - hi->flags |= 0x01; - - if (ctx->parray[i]->len < ctx->pminlen[idx]) - ctx->pminlen[idx] = ctx->parray[i]->len; - - /* Append this HashItem to the list */ - B2gCudaHashItem *thi = ctx->hash[idx]; - while (thi->nxt) - thi = thi->nxt; - thi->nxt = hi; - } - ctx->pat_x_cnt++; - } - } - - /* alloc the bloom array */ - ctx->bloom = (BloomFilter **)SCMalloc(sizeof(BloomFilter *) * ctx->hash_size); - if (ctx->bloom == NULL) - goto error; - memset(ctx->bloom, 0, sizeof(BloomFilter *) * ctx->hash_size); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (sizeof(BloomFilter *) * ctx->hash_size); - - uint32_t h; - for (h = 0; h < ctx->hash_size; h++) { - B2gCudaHashItem *hi = ctx->hash[h]; - if (hi == NULL) - continue; - - ctx->bloom[h] = BloomFilterInit(b2g_bloom_size, 2, B2gCudaBloomHash); - if (ctx->bloom[h] == NULL) - continue; - - mpm_ctx->memory_cnt += BloomFilterMemoryCnt(ctx->bloom[h]); - mpm_ctx->memory_size += BloomFilterMemorySize(ctx->bloom[h]); - - if (ctx->pminlen[h] > 8) - ctx->pminlen[h] = 8; - - B2gCudaHashItem *thi = hi; - do { - SCLogDebug("adding \"%c%c\" to the bloom", ctx->parray[thi->idx]->ci[0], - ctx->parray[thi->idx]->ci[1]); - BloomFilterAdd(ctx->bloom[h], ctx->parray[thi->idx]->ci, - ctx->pminlen[h]); - thi = thi->nxt; - } while (thi != NULL); - } - - return; - -error: - return; -} - -int B2gCudaBuildMatchArray(MpmCtx *mpm_ctx) -{ - SCEnter(); - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - - ctx->B2G = SCMalloc(sizeof(B2G_CUDA_TYPE) * ctx->hash_size); - if (ctx->B2G == NULL) - return -1; - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (sizeof(B2G_CUDA_TYPE) * ctx->hash_size); - - memset(ctx->B2G, 0, b2g_hash_size * sizeof(B2G_CUDA_TYPE)); - - uint32_t j; - uint32_t a; - - /* fill the match array */ - for (j = 0; j <= (ctx->m - B2G_CUDA_Q); j++) { - for (a = 0; a < mpm_ctx->pattern_cnt; a++) { - if (ctx->parray[a]->len < ctx->m) - continue; - - uint16_t h = B2G_CUDA_HASH16(u8_tolower(ctx->parray[a]->ci[j]), - u8_tolower(ctx->parray[a]->ci[j + 1])); - ctx->B2G[h] = ctx->B2G[h] | (1 << (ctx->m - j)); - - SCLogDebug("h %" PRIu16 ", ctx->B2G[h] %" PRIu32, h, ctx->B2G[h]); - } - } - - ctx->s0 = 1; - - SCReturnInt(0); -} - -int B2gCudaSetDeviceBuffers(MpmCtx *mpm_ctx) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - - /* search kernel */ - if (SCCudaMemAlloc(&ctx->cuda_B2G, - sizeof(B2G_CUDA_TYPE) * ctx->hash_size) == -1) { - goto error; - } - if (SCCudaMemcpyHtoD(ctx->cuda_B2G, ctx->B2G, - sizeof(B2G_CUDA_TYPE) * ctx->hash_size) == -1) { - goto error; - } - - return 0; - - error: - return -1; -} - -int B2gCudaSetKernelArgs(MpmCtx *mpm_ctx) -{ - return 0; -} - -int B2gCudaPreparePatterns(MpmCtx *mpm_ctx) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - - if (mpm_ctx->pattern_cnt == 0 || ctx->init_hash == NULL) { - SCLogDebug("no patterns supplied to this mpm_ctx"); - return 0; - } - - /* alloc the pattern array */ - ctx->parray = (B2gCudaPattern **)SCMalloc(mpm_ctx->pattern_cnt * - sizeof(B2gCudaPattern *)); - if (ctx->parray == NULL) - goto error; - memset(ctx->parray, 0, mpm_ctx->pattern_cnt * sizeof(B2gCudaPattern *)); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += (mpm_ctx->pattern_cnt * sizeof(B2gCudaPattern *)); - - /* populate it with the patterns in the hash */ - uint32_t i = 0, p = 0; - for (i = 0; i < INIT_HASH_SIZE; i++) { - B2gCudaPattern *node = ctx->init_hash[i]; - B2gCudaPattern *nnode = NULL; - for ( ; node != NULL; ) { - nnode = node->next; - node->next = NULL; - - ctx->parray[p] = node; - - p++; - node = nnode; - } - } - /* we no longer need the hash, so free it's memory */ - SCFree(ctx->init_hash); - ctx->init_hash = NULL; - - /* set 'm' to the smallest pattern size */ - ctx->m = mpm_ctx->minlen; - - /* make sure 'm' stays in bounds - m can be max WORD_SIZE - 1 */ - if (ctx->m >= B2G_CUDA_WORD_SIZE) { - ctx->m = B2G_CUDA_WORD_SIZE - 1; - } - if (ctx->m < 2) - ctx->m = 2; - - ctx->hash_size = b2g_hash_size; - B2gCudaPrepareHash(mpm_ctx); - B2gCudaBuildMatchArray(mpm_ctx); - - if (B2gCudaSetDeviceBuffers(mpm_ctx) == -1) - goto error; - - if (B2gCudaSetKernelArgs(mpm_ctx) == -1) - goto error; - - SCLogDebug("ctx->pat_1_cnt %" PRIu16, ctx->pat_1_cnt); - if (ctx->pat_1_cnt) { - ctx->Search = B2gCudaSearch1; -#ifdef B2G_CUDA_SEARCH2 - ctx->Search = B2gCudaSearch2; - if (ctx->pat_2_cnt) { - ctx->MBSearch2 = B2gCudaSearch2; - } -#endif - ctx->MBSearch = b2g_func; -#ifdef B2G_SEARCH2 - } else if (ctx->pat_2_cnt) { - ctx->Search = B2gSearch2; - ctx->MBSearch = b2g_cuda_func; -#endif - } - - return 0; - - error: - return -1; -} - -void B2gCudaPrintSearchStats(MpmThreadCtx *mpm_thread_ctx) -{ -#ifdef B2G_CUDA_COUNTERS - B2gCudaThreadCtx *tctx = (B2gCudaThreadCtx *)mpm_thread_ctx->ctx; - - printf("B2g Thread Search stats (tctx %p)\n", tctx); - printf("Total calls: %" PRIu32 "\n", tctx->stat_calls); - printf("Avg m/search: %0.2f\n", (tctx->stat_calls ? - (float)((float)tctx->stat_m_total / - (float)tctx->stat_calls) : 0)); - printf("D != 0 (possible match): %" PRIu32 "\n", tctx->stat_d0); - printf("Avg hash items per bucket %0.2f (%" PRIu32 ")\n", - tctx->stat_d0 ? (float)((float)tctx->stat_d0_hashloop / - (float)tctx->stat_d0) : 0, - tctx->stat_d0_hashloop); - printf("Loop match: %" PRIu32 "\n", tctx->stat_loop_match); - printf("Loop no match: %" PRIu32 "\n", tctx->stat_loop_no_match); - printf("Num shifts: %" PRIu32 "\n", tctx->stat_num_shift); - printf("Total shifts: %" PRIu32 "\n", tctx->stat_total_shift); - printf("Avg shifts: %0.2f\n", (tctx->stat_num_shift ? - (float)((float)tctx->stat_total_shift / - (float)tctx->stat_num_shift)) : 0); - printf("Total BloomFilter checks: %" PRIu32 "\n", tctx->stat_bloom_calls); - printf("BloomFilter hits: %0.4f%% (%" PRIu32 ")\n", - (tctx->stat_bloom_calls ? ((float)tctx->stat_bloom_hits / - (float)tctx->stat_bloom_calls) * 100) : 0, - tctx->stat_bloom_hits); - printf("Avg pminlen: %0.2f\n\n", - (tctx->stat_pminlen_calls ? ((float)tctx->stat_pminlen_total / - (float)tctx->stat_pminlen_calls)) : 0); -#endif /* B2G_CUDA_COUNTERS */ - -} - -static inline int memcmp_lowercase(uint8_t *s1, uint8_t *s2, uint16_t n) -{ - size_t i; - - /* check backwards because we already tested the first - * 2 to 4 chars. This way we are more likely to detect - * a miss and thus speed up a little... */ - for (i = n - 1; i; i--) { - if (u8_tolower(*(s2 + i)) != s1[i]) - return 1; - } - - return 0; -} - -/** - * \brief Function to get the user defined values for b2g algorithm from the - * config file 'suricata.yaml' - */ -static void B2gGetConfig() -{ - ConfNode *b2g_conf; - const char *hash_val = NULL; - const char *bloom_val = NULL; - const char *algo = NULL; - - /* init defaults */ - b2g_hash_size = HASHSIZE_LOW; - b2g_bloom_size = BLOOMSIZE_MEDIUM; - b2g_func = B2G_CUDA_SEARCHFUNC; - - ConfNode *pm = ConfGetNode("pattern-matcher"); - - if (pm != NULL) { - - TAILQ_FOREACH(b2g_conf, &pm->head, next) { - if (strncmp(b2g_conf->val, "b2g", 3) == 0) { - - algo = ConfNodeLookupChildValue - (b2g_conf->head.tqh_first, "algo"); - hash_val = ConfNodeLookupChildValue - (b2g_conf->head.tqh_first, "hash_size"); - bloom_val = ConfNodeLookupChildValue - (b2g_conf->head.tqh_first, "bf_size"); - - if (algo != NULL) { - if (strcmp(algo, "B2gSearch") == 0) { - b2g_func = B2gCudaSearch; - } else if (strcmp(algo, "B2gSearchBNDMq") == 0) { - b2g_func = B2gCudaSearchBNDMq; - } - } - - if (hash_val != NULL) - b2g_hash_size = MpmGetHashSize(hash_val); - - if (bloom_val != NULL) - b2g_bloom_size = MpmGetBloomSize(bloom_val); - - SCLogDebug("hash size is %"PRIu32" and bloom size is %"PRIu32"", - b2g_hash_size, b2g_bloom_size); - } - } - } -} - -void B2gCudaInitCtx(MpmCtx *mpm_ctx, int module_handle) -{ - if (mpm_ctx->ctx != NULL) - return; - - SCLogDebug("mpm_ctx %p, ctx %p", mpm_ctx, mpm_ctx->ctx); - - mpm_ctx->ctx = SCMalloc(sizeof(B2gCudaCtx)); - if (mpm_ctx->ctx == NULL) - return; - - memset(mpm_ctx->ctx, 0, sizeof(B2gCudaCtx)); - - mpm_ctx->memory_cnt++; - mpm_ctx->memory_size += sizeof(B2gCudaCtx); - - /* initialize the hash we use to speed up pattern insertions */ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - - /* hold the cuda module handle against which we are registered. This is our - * only reference to know our place of birth */ - ctx->module_handle = module_handle; - - ctx->init_hash = SCMalloc(sizeof(B2gCudaPattern *) * INIT_HASH_SIZE); - if (ctx->init_hash == NULL) - return; - - memset(ctx->init_hash, 0, sizeof(B2gCudaPattern *) * INIT_HASH_SIZE); - - /* Initialize the defaults value from the config file. The given check make - sure that we query config file only once for config values */ - if (b2g_hash_size == 0) - B2gGetConfig(); - - /* init defaults search functions */ - ctx->Search = b2g_func; - - return; -} - -void B2gCudaDestroyCtx(MpmCtx *mpm_ctx) -{ - SCLogDebug("mpm_ctx %p", mpm_ctx); - - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - if (ctx == NULL) - return; - - if (ctx->init_hash) { - SCFree(ctx->init_hash); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (INIT_HASH_SIZE * sizeof(B2gCudaPattern *)); - } - - if (ctx->parray) { - uint32_t i; - for (i = 0; i < mpm_ctx->pattern_cnt; i++) { - if (ctx->parray[i] != NULL) { - B2gCudaFreePattern(mpm_ctx, ctx->parray[i]); - } - } - - SCFree(ctx->parray); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (mpm_ctx->pattern_cnt * sizeof(B2gCudaPattern)); - } - - if (ctx->B2G) { - SCFree(ctx->B2G); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (sizeof(B2G_CUDA_TYPE) * ctx->hash_size); - } - - if (ctx->bloom) { - uint32_t h; - for (h = 0; h < ctx->hash_size; h++) { - if (ctx->bloom[h] == NULL) - continue; - - mpm_ctx->memory_cnt -= BloomFilterMemoryCnt(ctx->bloom[h]); - mpm_ctx->memory_size -= BloomFilterMemorySize(ctx->bloom[h]); - - BloomFilterFree(ctx->bloom[h]); - } - - SCFree(ctx->bloom); - - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (sizeof(BloomFilter *) * ctx->hash_size); - } - - if (ctx->hash) { - uint32_t h; - for (h = 0; h < ctx->hash_size; h++) { - if (ctx->hash[h] == NULL) - continue; - - B2gCudaHashFree(mpm_ctx, ctx->hash[h]); - } - - SCFree(ctx->hash); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (sizeof(B2gCudaHashItem) * ctx->hash_size); - } - - if (ctx->pminlen) { - SCFree(ctx->pminlen); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= (sizeof(uint8_t) * ctx->hash_size); - } - - CUcontext dummy_context; - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(ctx->module_handle); - if (module_data == NULL) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "How did we even fail to get a " - "module_data if we are having a module_handle"); - goto error; - } - if (SCCudaHlGetCudaContext(&dummy_context, "mpm", ctx->module_handle) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda context for the " - "module %s", module_data->name); - goto error; - } - SCCudaCtxPushCurrent(dummy_context); - - if (ctx->cuda_B2G != 0) { - if (SCCudaMemFree(ctx->cuda_B2G) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error freeing ctx->cuda_B2G "); - goto error; - } - ctx->cuda_B2G = 0; - } - SCCudaCtxPopCurrent(&dummy_context); - - SCFree(mpm_ctx->ctx); - mpm_ctx->memory_cnt--; - mpm_ctx->memory_size -= sizeof(B2gCudaCtx); - - - error: - return; -} - -void B2gCudaThreadInitCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - uint32_t matchsize) -{ - memset(mpm_thread_ctx, 0, sizeof(MpmThreadCtx)); - - /* size can be null when optimized */ - if (sizeof(B2gCudaThreadCtx) > 0) { - mpm_thread_ctx->ctx = SCMalloc(sizeof(B2gCudaThreadCtx)); - if (mpm_thread_ctx->ctx == NULL) - return; - - memset(mpm_thread_ctx->ctx, 0, sizeof(B2gCudaThreadCtx)); - - mpm_thread_ctx->memory_cnt++; - mpm_thread_ctx->memory_size += sizeof(B2gCudaThreadCtx); - } - - return; -} - -void B2gCudaThreadDestroyCtx(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx) -{ - B2gCudaThreadCtx *ctx = (B2gCudaThreadCtx *)mpm_thread_ctx->ctx; - - B2gCudaPrintSearchStats(mpm_thread_ctx); - - /* can be NULL if B2gThreadCtx is optimized to 0 */ - if (ctx != NULL) { - mpm_thread_ctx->memory_cnt--; - mpm_thread_ctx->memory_size -= sizeof(B2gCudaThreadCtx); - SCFree(mpm_thread_ctx->ctx); - } - - return; -} - -inline uint32_t B2gCudaSearchWrap(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq, uint8_t *buf, - uint16_t buflen) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - return ctx ? ctx->Search(mpm_ctx, mpm_thread_ctx, pmq, buf, buflen) : 0; -} - -uint32_t B2gCudaSearchBNDMq(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq, uint8_t *buf, - uint16_t buflen) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; -#ifdef B2G_COUNTERS - B2gCudaThreadCtx *tctx = (B2gCudaThreadCtx *)mpm_thread_ctx->ctx; -#endif - uint32_t pos = ctx->m - B2G_CUDA_Q + 1, matches = 0; - B2G_CUDA_TYPE d; - - //printf("\n"); - //PrintRawDataFp(stdout, buf, buflen); - - SCLogDebug("buflen %"PRIu16", ctx->m %"PRIu32", pos %"PRIu32"", buflen, - ctx->m, pos); - - COUNT(tctx->stat_calls++); - COUNT(tctx->stat_m_total+=ctx->m); - - if (buflen < ctx->m) - return 0; - - while (pos <= (uint32_t)(buflen - B2G_CUDA_Q + 1)) { - uint16_t h = B2G_CUDA_HASH16(u8_tolower(buf[pos - 1]),u8_tolower(buf[pos])); - d = ctx->B2G[h]; - - if (d != 0) { - COUNT(tctx->stat_d0++); - uint32_t j = pos; - uint32_t first = pos - (ctx->m - B2G_CUDA_Q + 1); - - do { - j = j - 1; - - if (d >= (uint32_t)(1 << (ctx->m - 1))) { - if (j > first) pos = j; - else { - /* get our patterns from the hash */ - h = B2G_CUDA_HASH16(u8_tolower(buf[j + ctx->m - 2]),u8_tolower(buf[j + ctx->m - 1])); - - if (ctx->bloom[h] != NULL) { - COUNT(tctx->stat_pminlen_calls++); - COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]); - - if ((buflen - j) < ctx->pminlen[h]) { - goto skip_loop; - } else { - COUNT(tctx->stat_bloom_calls++); - - if (BloomFilterTest(ctx->bloom[h], buf+j, ctx->pminlen[h]) == 0) { - COUNT(tctx->stat_bloom_hits++); - - SCLogDebug("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "", - ctx->bloom[h], buflen, pos, ctx->pminlen[h]); - goto skip_loop; - } - } - } - - B2gCudaHashItem *hi = ctx->hash[h], *thi; - for (thi = hi; thi != NULL; thi = thi->nxt) { - COUNT(tctx->stat_d0_hashloop++); - B2gCudaPattern *p = ctx->parray[thi->idx]; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if ((buflen - j) < p->len) { - continue; - } - - if (memcmp_lowercase(p->ci, buf+j, p->len) == 0) { -#ifdef PRINTMATCH - printf("CI Exact match: "); prt(p->ci, p->len); printf("\n"); -#endif - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } else { - if (buflen - j < p->len) - continue; - - if (memcmp(p->cs, buf+j, p->len) == 0) { -#ifdef PRINTMATCH - printf("CS Exact match: "); prt(p->cs, p->len); printf("\n"); -#endif - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } - } -skip_loop: - SCLogDebug("skipped"); - //SCLogDebug("output at pos %" PRIu32 ": ", j); prt(buf + (j), ctx->m); printf("\n"); - ; - } - } - - if (j == 0) { - break; - } - - h = B2G_CUDA_HASH16(u8_tolower(buf[j - 1]),u8_tolower(buf[j])); - d = (d << 1) & ctx->B2G[h]; - } while (d != 0); - } - COUNT(tctx->stat_num_shift++); - COUNT(tctx->stat_total_shift += (ctx->m - B2G_Q + 1)); - pos = pos + ctx->m - B2G_CUDA_Q + 1; - - SCLogDebug("pos %"PRIu32"", pos); - } - - SCLogDebug("matches %"PRIu32"", matches); - return matches; -} - -uint32_t B2gCudaSearch(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; -#ifdef B2G_CUDA_COUNTERS - B2gCudaThreadCtx *tctx = (B2gCudaThreadCtx *)mpm_thread_ctx->ctx; -#endif - uint32_t pos = 0, matches = 0; - B2G_CUDA_TYPE d; - uint32_t j; - - COUNT(tctx->stat_calls++); - COUNT(tctx->stat_m_total+=ctx->m); - - if (buflen < ctx->m) - return 0; - - while (pos <= (buflen - ctx->m)) { - j = ctx->m - 1; - d = ~0; - - do { - uint16_t h = B2G_CUDA_HASH16(u8_tolower(buf[pos + j - 1]),u8_tolower(buf[pos + j])); - d = ((d << 1) & ctx->B2G[h]); - j = j - 1; - } while (d != 0 && j != 0); - - /* (partial) match, move on to verification */ - if (d != 0) { - COUNT(tctx->stat_d0++); - //printf("output at pos %" PRIu32 ": ", pos); prt(buf + pos, ctx->m); printf("\n"); - - /* get our patterns from the hash */ - uint16_t h = B2G_CUDA_HASH16(u8_tolower(buf[pos + ctx->m - 2]),u8_tolower(buf[pos + ctx->m - 1])); - - if (ctx->bloom[h] != NULL) { - COUNT(tctx->stat_pminlen_calls++); - COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]); - - if ((buflen - pos) < ctx->pminlen[h]) { - goto skip_loop; - } else { - COUNT(tctx->stat_bloom_calls++); - - if (BloomFilterTest(ctx->bloom[h], buf+pos, ctx->pminlen[h]) == 0) { - COUNT(tctx->stat_bloom_hits++); - - //printf("Bloom: %p, buflen %" PRIu32 ", pos %" PRIu32 ", p_min_len %" PRIu32 "\n", ctx->bloom[h], buflen, pos, ctx->pminlen[h]); - goto skip_loop; - } - } - } - - B2gCudaHashItem *hi = ctx->hash[h], *thi; - for (thi = hi; thi != NULL; thi = thi->nxt) { - COUNT(tctx->stat_d0_hashloop++); - B2gCudaPattern *p = ctx->parray[thi->idx]; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if (buflen - pos < p->len) - continue; - - if (memcmp_lowercase(p->ci, buf+pos, p->len) == 0) { - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } else { - if (buflen - pos < p->len) - continue; - - if (memcmp(p->cs, buf+pos, p->len) == 0) { - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } - } -skip_loop: - //pos = pos + ctx->s0; - pos = pos + 1; - } else { - COUNT(tctx->stat_num_shift++); - COUNT(tctx->stat_total_shift += (j + 1)); - - pos = pos + j + 1; - } - } - - //printf("Total matches %" PRIu32 "\n", matches); - return matches; -} - -#ifdef B2G_CUDA_SEARCH2 -uint32_t B2gCudaSearch2(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen) -{ - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - uint8_t *bufmin = buf; - uint8_t *bufend = buf + buflen - 1; - uint32_t cnt = 0; - B2gCudaPattern *p; - B2gCudaHashItem *thi, *hi; - - if (buflen < 2) - return 0; - - //printf("BUF "); prt(buf,buflen); printf("\n"); - - while (buf <= bufend) { - uint8_t h8 = u8_tolower(*buf); - hi = &ctx->hash1[h8]; - - if (hi->flags & 0x01) { - for (thi = hi; thi != NULL; thi = thi->nxt) { - p = ctx->parray[thi->idx]; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if (h8 == p->ci[0]) { - cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } - } else { - if (*buf == p->cs[0]) { - cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } - } - } - } - - /* save one conversion by reusing h8 */ - uint16_t h16 = B2G_HASH16(h8, u8_tolower(*(buf+1))); - hi = ctx->hash2[h16]; - - for (thi = hi; thi != NULL; thi = thi->nxt) { - p = ctx->parray[thi->idx]; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if (h8 == p->ci[0] && u8_tolower(*(buf+1)) == p->ci[1]) { - //printf("CI Exact match: "); prt(p->ci, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B2gSearch1)\n"); -// for (em = p->em; em; em = em->next) { - if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id)) - cnt++; -// } - } - } else { - if (*buf == p->cs[0] && *(buf+1) == p->cs[1]) { - //printf("CS Exact match: "); prt(p->cs, p->len); printf(" in buf "); prt(buf, p->len);printf(" (B2gSearch1)\n"); -// for (em = p->em; em; em = em->next) { - if (MpmVerifyMatch(mpm_thread_ctx, pmq, p->id)) - cnt++; -// } - } - } - } - buf += 1; - } - - //printf("B2gSearch2: after 2byte cnt %" PRIu32 "\n", cnt); - if (ctx->pat_x_cnt > 0) { - /* Pass bufmin on because buf no longer points to the - * start of the buffer. */ - cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen); - //printf("B2gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt); - } - return cnt; -} -#endif - -uint32_t B2gCudaSearch1(MpmCtx *mpm_ctx, MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq, uint8_t *buf, uint16_t buflen) -{ - SCEnter(); - - B2gCudaCtx *ctx = (B2gCudaCtx *)mpm_ctx->ctx; - uint8_t *bufmin = buf; - uint8_t *bufend = buf + buflen - 1; - uint32_t cnt = 0; - B2gCudaPattern *p; - B2gCudaHashItem *thi, *hi; - - if (buflen == 0) - SCReturnUInt(0); - - //printf("BUF "); prt(buf,buflen); printf("\n"); - - while (buf <= bufend) { - uint8_t h = u8_tolower(*buf); - hi = &ctx->hash1[h]; - - if (hi->flags & 0x01) { - for (thi = hi; thi != NULL; thi = thi->nxt) { - p = ctx->parray[thi->idx]; - - if (p->len != 1) - continue; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if (u8_tolower(*buf) == p->ci[0]) { - cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } - } else { - if (*buf == p->cs[0]) { - cnt += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } - } - } - } - buf += 1; - } - - //printf("B2gSearch1: after 1byte cnt %" PRIu32 "\n", cnt); -#ifdef B2G_CUDA_SEARCH2 - if (ctx->pat_2_cnt) { - /* Pass bufmin on because buf no longer points to the - * start of the buffer. */ - cnt += ctx->MBSearch2(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen); - //printf("B2gSearch1: after 2+byte cnt %" PRIu32 "\n", cnt); - } else -#endif - if (ctx->pat_x_cnt) { - cnt += ctx->MBSearch(mpm_ctx, mpm_thread_ctx, pmq, bufmin, buflen); - } - SCReturnUInt(cnt); -} - -/*********************Cuda_Specific_Mgmt_Code_Starts_Here**********************/ - -/* - * \brief This data holds all resources needed by a cuda stream such as - * device pointers, host pointers, CUmodule and Kernel function. These - * are only valid within the context of the associated B2gCudaMpmThreadCtxData. - */ -typedef struct B2gCudaMpmStreamData_ { - /* Stream used for asynchronous memcopy in the Cuda MPM dispatcher. - * This is != NULL if the memory is allocated page-locked, i.e. profile->page_locked - * is set. Only streams != NULL are used for async. processing. */ - CUstream cuda_stream; - - /* Flag that indicates if there is some asynchronous operation in progress */ - uint8_t cuda_async; - - /* The CUmodule for this stream and corresponding handle. We need to load the - * cuda module for every stream to avoid rebinding the kernel configuration - * with every kernel call. */ - int b2g_cuda_cumodule_handle; - CUmodule b2g_cuda_cumodule; - - /* the search kernel */ - CUfunction b2g_cuda_search_kernel; - - /* the cuda_search_kernel argument offsets */ - uint8_t b2g_cuda_search_kernel_arg0_offset; - uint8_t b2g_cuda_search_kernel_arg1_offset; - uint8_t b2g_cuda_search_kernel_arg2_offset; - uint8_t b2g_cuda_search_kernel_arg3_offset; - uint8_t b2g_cuda_search_kernel_arg4_offset; - uint8_t b2g_cuda_search_kernel_arg5_offset; - uint8_t b2g_cuda_search_kernel_arg_total; - - /* the results buffer to hold the match offsets for the packets */ - uint16_t *results_buffer; - /* gpu buffer corresponding to the above buffer */ - CUdeviceptr cuda_results_buffer; - - /* gpu buffer corresponding to SCCudaPBPacketsBuffer->packets_buffer */ - CUdeviceptr cuda_packets_buffer; - /* gpu buffer corresponding to SCCudaPBPacketsBuffer->packets_offset_buffer */ - CUdeviceptr cuda_packets_offset_buffer; - /* gpu buffer corresponding to SCCudaPBPacketsBuffer->packets_payload_offset_buffer */ - CUdeviceptr cuda_packets_payload_offset_buffer; - /* gpu buffer corresponding to the global symbol g_u8_lowercasetable - * XXX Remove this. Store it as a constant buffer inside the kernel*/ - CUdeviceptr cuda_g_u8_lowercasetable; -} B2gCudaMpmStreamData; - -/* - * \brief Cuda specific data for the MPM's thread context. - */ -typedef struct B2gCudaMpmThreadCtxData_ { - int b2g_cuda_module_handle; - CUcontext b2g_cuda_context; - - /* Data of the cuda streams of this context */ - B2gCudaMpmStreamData *stream_data; - uint8_t no_of_streams; - /* Data store for packet buffers that are currently processed */ - Tmq *tmq_streamq; -} B2gCudaMpmThreadCtxData; - -/* - * \brief Initialize data for the cuda streams. - * - * \param tctx The thread context data of the Cuda MPM. - * \param profile The cuda profile used by the MPM. - * - * \retval 0 on succes, -1 on failure. - */ -static int B2gCudaMpmStreamDataInit(B2gCudaMpmThreadCtxData *tctx, MpmCudaConf *profile) -{ - SCCudaHlModuleData *module_data = NULL; - B2gCudaMpmStreamData *sd = NULL; - uint8_t i = 0; - - module_data = SCCudaHlGetModuleData(tctx->b2g_cuda_module_handle); - if (module_data == NULL) { - SCLogError(SC_ERR_CUDA_HANDLER_ERROR,"No Cuda module data"); - goto error; - } - - SCLogDebug("Initializing data for %"PRIu16" cuda streams", tctx->no_of_streams); - for (i = 0; i < tctx->no_of_streams; ++i) { - sd = &tctx->stream_data[i]; - - /* Init cuda stream */ - if (profile->page_locked) { - if (SCCudaStreamCreate(&sd->cuda_stream, 0) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error creating Cuda stream."); - exit(EXIT_FAILURE); - } - } else { - SCLogDebug("Disabled asynchronous cuda processing"); - sd->cuda_stream = NULL; - } - - /* Load the CUmodule */ - sd->b2g_cuda_cumodule_handle = SCCudaHlGetCudaModule(&sd->b2g_cuda_cumodule, - "util-mpm-b2g-cuda-kernel", - module_data->handle); - if (sd->b2g_cuda_cumodule_handle == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda module"); - goto error; - } - - /* Get kernel from module */ - if (SCCudaModuleGetFunction(&sd->b2g_cuda_search_kernel, - sd->b2g_cuda_cumodule, - B2G_CUDA_SEARCHFUNC_NAME) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda function"); - goto error; - } - - /* Configure kernel execution */ - if (SCCudaFuncSetBlockShape(sd->b2g_cuda_search_kernel, 32, 1, 1) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error setting function block shape"); - goto error; - } - -#define ALIGN_UP(offset, alignment) do { \ - (offset) = ((offset) + (alignment) - 1) & ~((alignment) - 1); \ - } while (0) - - int offset = 0; - - ALIGN_UP(offset, __alignof(void *)); - sd->b2g_cuda_search_kernel_arg0_offset = offset; - offset += sizeof(void *); - - ALIGN_UP(offset, __alignof(void *)); - sd->b2g_cuda_search_kernel_arg1_offset = offset; - offset += sizeof(void *); - - ALIGN_UP(offset, __alignof(void *)); - sd->b2g_cuda_search_kernel_arg2_offset = offset; - offset += sizeof(void *); - - ALIGN_UP(offset, __alignof(void *)); - sd->b2g_cuda_search_kernel_arg3_offset = offset; - offset += sizeof(void *); - - ALIGN_UP(offset, __alignof(uint16_t)); - sd->b2g_cuda_search_kernel_arg4_offset = offset; - offset += sizeof(void *); - - ALIGN_UP(offset, __alignof(void *)); - sd->b2g_cuda_search_kernel_arg5_offset = offset; - offset += sizeof(void *); - - tctx->stream_data[i].b2g_cuda_search_kernel_arg_total = offset; - - /* buffer to hold the b2g cuda mpm match results for 4000 packets. The - * extra 2 bytes(the extra + 1 ) is to hold the no of - * matches for the payload. The remaining profile->packet_size_limit - * positions in the buffer is to hold the match offsets */ - if (profile->page_locked) { - if (SCCudaMemHostAlloc((void**)&sd->results_buffer, - sizeof(uint16_t) * (profile->packet_size_limit + 1) * - profile->packet_buffer_limit, - CU_MEMHOSTALLOC_PORTABLE) == -1){ - SCLogError(SC_ERR_CUDA_ERROR, "Error allocating page-locked memory\n"); - exit(EXIT_FAILURE); - } - } else { - sd->results_buffer = SCMalloc(sizeof(uint16_t) * - (profile->packet_size_limit + 1) * - profile->packet_buffer_limit); - if (sd->results_buffer == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - } - - if (SCCudaHlGetCudaDevicePtr(&sd->cuda_results_buffer, - "MPM_B2G_RESULTS", - sizeof(uint16_t) * - (profile->packet_size_limit + 1) * - profile->packet_buffer_limit, - NULL, module_data->handle, - sd->b2g_cuda_cumodule_handle) == -1) { - goto error; - } - - if (SCCudaHlGetCudaDevicePtr(&sd->cuda_g_u8_lowercasetable, - "G_U8_LOWERCASETABLE", 256 * sizeof(char), - g_u8_lowercasetable, module_data->handle, - sd->b2g_cuda_cumodule_handle) == -1) { - goto error; - } - - if (SCCudaHlGetCudaDevicePtr(&sd->cuda_packets_buffer, - "MPM_B2G_PACKETS_BUFFER", - profile->packet_buffer_limit * - (profile->packet_size_limit + - sizeof(SCCudaPBPacketDataForGPUNonPayload)), - NULL, module_data->handle, - sd->b2g_cuda_cumodule_handle) == -1) { - goto error; - } - - if (SCCudaHlGetCudaDevicePtr(&sd->cuda_packets_offset_buffer, - "MPM_B2G_PACKETS_BUFFER_OFFSETS", - sizeof(uint32_t) * profile->packet_buffer_limit, - NULL, module_data->handle, - sd->b2g_cuda_cumodule_handle) == -1) { - goto error; - } - - if (SCCudaHlGetCudaDevicePtr(&sd->cuda_packets_payload_offset_buffer, - "MPM_B2G_PACKETS_PAYLOAD_BUFFER_OFFSETS", - sizeof(uint32_t) * profile->packet_buffer_limit, - NULL, module_data->handle, - sd->b2g_cuda_cumodule_handle) == -1) { - goto error; - } - - - if (SCCudaParamSetv(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg0_offset, - (void *)&sd->cuda_results_buffer, - sizeof(void *)) == -1) { - goto error; - } - - if (SCCudaParamSetv(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg1_offset, - (void *)&sd->cuda_packets_buffer, - sizeof(void *)) == -1) { - goto error; - } - - if (SCCudaParamSetv(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg2_offset, - (void *)&sd->cuda_packets_offset_buffer, - sizeof(void *)) == -1) { - goto error; - } - - if (SCCudaParamSetv(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg3_offset, - (void *)&sd->cuda_packets_payload_offset_buffer, - sizeof(void *)) == -1) { - goto error; - } - - if (SCCudaParamSetv(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg5_offset, - (void *)&sd->cuda_g_u8_lowercasetable, - sizeof(void *)) == -1) { - goto error; - } - - if (SCCudaParamSetSize(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg_total) == -1) { - goto error; - } - } - - return 0; - - error: - return -1; -} - -/* - * \brief DeInitialize data for the cuda streams. - * - * \param tctx The thread context data of the Cuda MPM. - * \param profile The cuda profile used by the MPM. - * - * \retval 0 on succes, -1 on failure - */ -static int B2gCudaMpmStreamDataDeInit(B2gCudaMpmThreadCtxData *tctx, MpmCudaConf *profile) -{ - B2gCudaMpmStreamData *sd = NULL; - uint8_t i = 0; - - if (tctx == NULL || profile == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENT, "Arguments cannot be NULL"); - goto error; - } - - SCLogDebug("DeInitializing data for %"PRIu16" cuda streams", tctx->no_of_streams); - for (i = 0; i < tctx->no_of_streams; ++i) { - sd = &tctx->stream_data[i]; - - if (sd->cuda_stream != NULL) { - if (SCCudaStreamDestroy(sd->cuda_stream) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating Cuda stream "); - goto error; - } - } - if (profile->page_locked) { - if (SCCudaMemFreeHost(sd->results_buffer) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Error deallocating pagelocked memory: " - "results_buffer\n"); - goto error; - } - } else { - SCFree(sd->results_buffer); - } - SCCudaHlFreeCudaDevicePtr("MPM_B2G_RESULTS", - tctx->b2g_cuda_module_handle, - sd->b2g_cuda_cumodule_handle); - SCCudaHlFreeCudaDevicePtr("MPM_B2G_PACKETS_BUFFER", - tctx->b2g_cuda_module_handle, - sd->b2g_cuda_cumodule_handle); - SCCudaHlFreeCudaDevicePtr("MPM_B2G_PACKETS_BUFFER_OFFSETS", - tctx->b2g_cuda_module_handle, - sd->b2g_cuda_cumodule_handle); - SCCudaHlFreeCudaDevicePtr("MPM_B2G_PACKETS_PAYLOAD_BUFFER_OFFSETS", - tctx->b2g_cuda_module_handle, - sd->b2g_cuda_cumodule_handle); - SCCudaHlFreeCudaDevicePtr("G_U8_LOWERCASETABLE", - tctx->b2g_cuda_module_handle, - sd->b2g_cuda_cumodule_handle); - } - - SCFree(tctx->stream_data); - - return 0; - - error: - return -1; -} - -/** - * \brief The Cuda MPM B2G module's thread init function. - * - * \param tv Pointer to the ThreadVars which has invoked this function. - * \param initdata Pointer to some user sent data. - * \param data Pointer to a pointer which can be used to send data to the - * dispatcher thread. - * - * \retval TM_ECODE_OK Always. - */ -TmEcode B2gCudaMpmDispThreadInit(ThreadVars *tv, void *initdata, void **data) -{ - MpmCudaConf *profile = NULL; - SCCudaHlModuleData *module_data = (SCCudaHlModuleData *)initdata; - - if (PatternMatchDefaultMatcher() != MPM_B2G_CUDA) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "b2g cuda mpm sees mpm that is " - "not b2g_cuda"); - exit(EXIT_FAILURE); - } - - if (SCCudaCtxPushCurrent(module_data->cuda_context) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error pushing cuda context"); - } - - B2gCudaMpmThreadCtxData *tctx = SCMalloc(sizeof(B2gCudaMpmThreadCtxData)); - if (unlikely(tctx == NULL)) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(tctx, 0, sizeof(B2gCudaMpmThreadCtxData)); - - tctx->b2g_cuda_module_handle = module_data->handle; - - /* Check configuration if streams and async operations can be used. - * If (CC == 1.0 || page_locked is disabled) then one stream is used, - * else more streams are used. When using the stream for async processing - * please check if memory has been allocated page-locked. */ - profile = SCCudaHlGetProfile("mpm"); - - SCCudaDevices *devices = SCCudaGetDeviceList(); - if (devices == NULL) { - SCLogError(SC_ERR_CUDA_ERROR, "CUDA environment not initialized. " - "Please initialized the CUDA environment by calling " - "SCCudaInitCudaEnvironment() before making any calls " - "to the CUDA API."); - goto error; - } - if (profile->device_id >= devices->count) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Cuda device does not exist."); - goto error; - } - tctx->no_of_streams = profile->cuda_streams; - - if (!devices->devices[profile->device_id]->attr_gpu_overlap) { - SCLogInfo("Cuda device does not support gpu overlap. Falling back to 1 stream."); - tctx->no_of_streams = 1; - } - if (!profile->page_locked) { - SCLogInfo("In order to use asynchronous operations you need to enable " - "page-locked memory in suricata.yaml."); - tctx->no_of_streams = 1; - } - - /* Initialize resources for the streams */ - tctx->stream_data = SCMalloc(tctx->no_of_streams * sizeof(B2gCudaMpmStreamData)); - if (tctx->stream_data == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory."); - exit(EXIT_FAILURE); - } - memset(tctx->stream_data, 0, tctx->no_of_streams * sizeof(B2gCudaMpmStreamData)); - - if (SCCudaHlGetCudaContext(&tctx->b2g_cuda_context, "mpm", module_data->handle) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda context"); - goto error; - } - - /* Initialize stream data */ - if (B2gCudaMpmStreamDataInit(tctx, profile) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error initializing Cuda device data."); - goto error; - } - - /* Setup queue to hold packet buffers for stream processing */ - char *streamq_name = "b2g_cuda_mpm_streamq"; - tctx->tmq_streamq = TmqGetQueueByName(streamq_name); - if (tctx->tmq_streamq == NULL) { - tctx->tmq_streamq = TmqCreateQueue(streamq_name); - if (tctx->tmq_streamq == NULL) { - goto error; - } - } - tctx->tmq_streamq->q_type = 1; - tctx->tmq_streamq->reader_cnt++; - tctx->tmq_streamq->writer_cnt++; - - *data = tctx; - - return TM_ECODE_OK; - - error: - return TM_ECODE_FAILED; -} - -/** - * \brief The Cuda MPM B2G module's thread de-init function. - * - * \param tv Pointer to the ThreadVars which has invoked this function. - * \param data Pointer to the slot data if anything had been attached in - * the thread init function. - * - * \retval TM_ECODE_OK Always. - */ -TmEcode B2gCudaMpmDispThreadDeInit(ThreadVars *tv, void *data) -{ - B2gCudaMpmThreadCtxData *tctx = data; - MpmCudaConf *profile = NULL; - - if (tctx == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Invalid arguments. data NULL\n"); - return TM_ECODE_OK; - } - - if (PatternMatchDefaultMatcher() != MPM_B2G_CUDA) - return TM_ECODE_OK; - - CUcontext dummy_context; - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(tctx->b2g_cuda_module_handle); - if (module_data == NULL) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "How did we even fail to get a " - "module_data if we are having a module_handle"); - goto error; - } - if (SCCudaHlGetCudaContext(&dummy_context, "mpm", tctx->b2g_cuda_module_handle) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda context for the " - "module %s", module_data->name); - goto error; - } - SCCudaCtxPushCurrent(dummy_context); - - profile = SCCudaHlGetProfile("mpm"); - if (B2gCudaMpmStreamDataDeInit(tctx, profile) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error deallocating Cuda device data."); - goto error; - } - - SCFree(tctx); - - if (SCCudaCtxPopCurrent(NULL) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error popping cuda context"); - } - - return TM_ECODE_OK; - - error: - return TM_ECODE_FAILED; -} - - -/* - * \brief Process a packet buffer on the GPU. - * - * \param pb Pointer to the packet buffer. - * \param tctx Pointer to the thread context which contains the Cuda context, kernel module, - * streams, CPU+GPU memory etc. - * \param s ID of the stream to be used. - * - * \retval 0 on succes, -1 on failure - */ -static int B2gCudaMpmProcessBuffer(SCCudaPBPacketsBuffer *pb, B2gCudaMpmThreadCtxData *tctx, uint16_t s) -{ - B2gCudaMpmStreamData *sd = NULL; - - if (pb == NULL || tctx == NULL || s >= tctx->no_of_streams) { - SCLogError(SC_ERR_INVALID_ARGUMENT, "Either pb == NULL || tctx == NULL" - "or the CUstream does not exist"); - goto error; - } - - SCLogDebug("Process packet buffer %p in stream %"PRIu16, pb, s); - - sd = &tctx->stream_data[s]; - - if (sd->cuda_stream != NULL) { - SCLogDebug("B2g Cuda: Asynchronous processing enabled."); - sd->cuda_async = 1; - } - - /* H->D */ - if (sd->cuda_async) { - if (SCCudaMemcpyHtoDAsync(sd->cuda_packets_buffer, - pb->packets_buffer, - pb->packets_buffer_len, - sd->cuda_stream) == -1) { - goto error; - } - - if (SCCudaMemcpyHtoDAsync(sd->cuda_packets_offset_buffer, - pb->packets_offset_buffer, - sizeof(uint32_t) * pb->nop_in_buffer, - sd->cuda_stream) == -1) { - goto error; - } - - if (SCCudaMemcpyHtoDAsync(sd->cuda_packets_payload_offset_buffer, - pb->packets_payload_offset_buffer, - sizeof(uint32_t) * pb->nop_in_buffer, - sd->cuda_stream) == -1) { - goto error; - } - } else { - if (SCCudaMemcpyHtoD(sd->cuda_packets_buffer, - pb->packets_buffer, - pb->packets_buffer_len) == -1) { - goto error; - } - - if (SCCudaMemcpyHtoD(sd->cuda_packets_offset_buffer, - pb->packets_offset_buffer, - sizeof(uint32_t) * pb->nop_in_buffer) == -1) { - goto error; - } - - if (SCCudaMemcpyHtoD(sd->cuda_packets_payload_offset_buffer, - pb->packets_payload_offset_buffer, - sizeof(uint32_t) * pb->nop_in_buffer) == -1) { - goto error; - } - } - - if (SCCudaParamSeti(sd->b2g_cuda_search_kernel, - sd->b2g_cuda_search_kernel_arg4_offset, - pb->nop_in_buffer) == -1) { - goto error; - } - - /* Kernel: - * the no of threads per block has already been set to 32 - * \todo if we are very sure we are allocating a multiple of block_size - * buffer_threshold, then we can remove this + 1 here below */ - int no_of_cuda_blocks = (pb->nop_in_buffer / 32) + 1; - if (sd->cuda_async) { - if (SCCudaLaunchGridAsync(sd->b2g_cuda_search_kernel, - no_of_cuda_blocks, - 1, - sd->cuda_stream) == -1) { - goto error; - } - } else { - if (SCCudaLaunchGrid(sd->b2g_cuda_search_kernel, - no_of_cuda_blocks, - 1) == -1) { - goto error; - } - } - - /* D->H */ - if (sd->cuda_async) { - if (SCCudaMemcpyDtoHAsync(sd->results_buffer, - sd->cuda_results_buffer, - sizeof(uint16_t) * - (pb->nop_in_buffer + pb->packets_total_payload_len), - sd->cuda_stream) == -1) { - goto error; - } - } else { - if (SCCudaMemcpyDtoH(sd->results_buffer, - sd->cuda_results_buffer, - sizeof(uint16_t) * - (pb->nop_in_buffer + pb->packets_total_payload_len)) == -1) { - goto error; - } - } - - return 0; - - error: - SCCudaCtxSynchronize(); - sd->cuda_async = 0; - - return -1; -} - -/** - * \brief The dispatcher function for the cuda mpm. Takes a packet, feeds - * it to the gpu and informs the calling client when it has the - * results ready. - * - * \param tv We don't need this. - * \param incoming_buffer Pointer to the Packet which contains all the relevant data, - * like the bufffer, buflen, the contexts. - * \param data Pointer to the slot data if anything had been attached in - * the thread init function. - * \param buffer_dq Pointer to a data queue that can contain additional packet buffers - * that should be processed in other CUstreams (if enabled). The dispatcher - * function will dequeue all buffers that have been processed. The queue will - * not be changed if CUstreams are disabled. - * \param post_pq We don't need this. - * - * \retval TM_ECODE_OK Always. - */ -TmEcode B2gCudaMpmDispatcher(ThreadVars *tv, Packet *incoming_buffer, - void *data, PacketQueue *buffer_dq, PacketQueue *post_pq) -{ - SCCudaPBPacketsBuffer *pb = (SCCudaPBPacketsBuffer *)incoming_buffer; - B2gCudaMpmThreadCtxData *tctx = data; - - SCDQDataQueue *in_dq = (SCDQDataQueue *)buffer_dq; - SCDQDataQueue *out_dq = &data_queues[tctx->tmq_streamq->id]; - SCDQGenericQData *q_ptr = NULL; - SCCudaPBPacketsBuffer *pb_in_queue = NULL; - uint8_t curr_stream = 0; - - uint32_t i = 0; - - SCLogDebug("Running the B2g CUDA mpm dispatcher"); - - if (pb == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Invalid argument. pb is NULL!!"); - return TM_ECODE_OK; - } - - /* Start processing the incoming_buffer */ - if (B2gCudaMpmProcessBuffer(pb, tctx, curr_stream) == -1) { - goto error; - } - - /* Check if there are additional buffers in in_dq */ - while (in_dq != NULL && ++curr_stream < tctx->no_of_streams) { - SCMutexLock(&in_dq->mutex_q); - pb_in_queue = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(in_dq); - SCMutexUnlock(&in_dq->mutex_q); - if (pb_in_queue == NULL) { - break; - } - - /* Add buffer to out_dq and start processing */ - SCDQDataEnqueue(out_dq, (SCDQGenericQData *)pb_in_queue); - if (B2gCudaMpmProcessBuffer(pb_in_queue, tctx, curr_stream) == -1) { - goto error; - } - } - - /* Sync first packet buffer */ - curr_stream = 0; - if (tctx->stream_data[curr_stream].cuda_async) { - SCLogDebug("Synchronize PB %p in Cuda stream %"PRIu16, pb, curr_stream); - if (SCCudaStreamSynchronize(tctx->stream_data[curr_stream].cuda_stream) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Failed to synchronize Cuda stream"); - goto error; - } - tctx->stream_data[curr_stream].cuda_async = 0; - } - i = 0; - for (i = 0; i < pb->nop_in_buffer; i++) { - memcpy(pb->packets_address_buffer[i]->mpm_offsets, - (tctx->stream_data[curr_stream].results_buffer + i + - pb->packets_payload_offset_buffer[i]), - (pb->packets_address_buffer[i]->payload_len + 1) * sizeof(uint16_t)); - SCMutexLock(&pb->packets_address_buffer[i]->cuda_mutex); - pb->packets_address_buffer[i]->cuda_done = 1; - SCMutexUnlock(&pb->packets_address_buffer[i]->cuda_mutex); - SCCondSignal(&pb->packets_address_buffer[i]->cuda_cond); - } - - /* Sync all other buffers in out_dq (if any) */ - q_ptr = out_dq->bot; - while (q_ptr != NULL && ++curr_stream < tctx->no_of_streams) { - pb_in_queue = (SCCudaPBPacketsBuffer *)q_ptr; - - if (tctx->stream_data[curr_stream].cuda_async) { - SCLogDebug("Synchronize PB %p in Cuda stream %"PRIu16, pb_in_queue, curr_stream); - if (SCCudaStreamSynchronize(tctx->stream_data[curr_stream].cuda_stream) == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Failed to synchronize Cuda stream"); - goto error; - } - tctx->stream_data[curr_stream].cuda_async = 0; - } - i = 0; - for (i = 0; i < pb_in_queue->nop_in_buffer; i++) { - memcpy(pb_in_queue->packets_address_buffer[i]->mpm_offsets, - (tctx->stream_data[curr_stream].results_buffer + i + - pb_in_queue->packets_payload_offset_buffer[i]), - (pb_in_queue->packets_address_buffer[i]->payload_len + 1) * sizeof(uint16_t)); - SCMutexLock(&pb_in_queue->packets_address_buffer[i]->cuda_mutex); - pb_in_queue->packets_address_buffer[i]->cuda_done = 1; - SCMutexUnlock(&pb_in_queue->packets_address_buffer[i]->cuda_mutex); - SCCondSignal(&pb_in_queue->packets_address_buffer[i]->cuda_cond); - } - - q_ptr = q_ptr->prev; - } - - SCLogDebug("B2g Cuda mpm dispatcher returning"); - - return TM_ECODE_OK; - - error: - if (SCCudaCtxSynchronize() == -1) { - SCLogError(SC_ERR_CUDA_ERROR, "Failed to synchronize context."); - } - - curr_stream = 0; - tctx->stream_data[curr_stream].cuda_async = 0; - for (i = 0; i < pb->nop_in_buffer; i++) { - SCMutexLock(&pb->packets_address_buffer[i]->cuda_mutex); - pb->packets_address_buffer[i]->cuda_done = 1; - SCMutexUnlock(&pb->packets_address_buffer[i]->cuda_mutex); - SCCondSignal(&pb->packets_address_buffer[i]->cuda_cond); - } - - q_ptr = out_dq->bot; - while (q_ptr != NULL && ++curr_stream < tctx->no_of_streams) { - pb_in_queue = (SCCudaPBPacketsBuffer *)q_ptr; - tctx->stream_data[curr_stream].cuda_async = 0; - - for (i = 0; i < pb_in_queue->nop_in_buffer; i++) { - SCMutexLock(&pb_in_queue->packets_address_buffer[i]->cuda_mutex); - pb_in_queue->packets_address_buffer[i]->cuda_done = 1; - SCMutexUnlock(&pb_in_queue->packets_address_buffer[i]->cuda_mutex); - SCCondSignal(&pb_in_queue->packets_address_buffer[i]->cuda_cond); - } - - q_ptr = q_ptr->prev; - } - - SCLogError(SC_ERR_B2G_CUDA_ERROR, "B2g Cuda mpm dispatcher returning with error"); - - return TM_ECODE_OK; -} - -/** - * \brief The post processing of cuda mpm b2g results for a packet - * is done here. Will be used by the detection thread. We basically - * obtain the match offsets from the cuda mpm search and carry out - * further matches on those offsets. Also if the results are not - * read for a packet, we wait on the conditional, which will then - * be signalled by the cuda mpm dispatcher thread, once the results - * for the packet are ready. - * - * \param p Pointer to the packet whose mpm cuda results are - * to be further processed. - * \param mpm_ctx Pointer to the mpm context for this packet. - * \param mpm_thread_ctx Pointer to the mpm thread context. - * \param pmq Pointer to the patter matcher queue. - * - * \retval matches Holds the no of matches. - */ -int B2gCudaResultsPostProcessing(Packet *p, MpmCtx *mpm_ctx, - MpmThreadCtx *mpm_thread_ctx, - PatternMatcherQueue *pmq) -{ - B2gCudaCtx *ctx = mpm_ctx->ctx; - - while (p->cuda_done == 0) { - SCMutexLock(&p->cuda_mutex); - if (p->cuda_done == 1) { - SCMutexUnlock(&p->cuda_mutex); - break; - } else { - SCCondWait(&p->cuda_cond, &p->cuda_mutex); - SCMutexUnlock(&p->cuda_mutex); - } - } - - /* reset this flag for the packet */ - p->cuda_done = 0; - - uint16_t *no_of_matches = p->mpm_offsets; - uint16_t *host_offsets = p->mpm_offsets + 1; - int i = 0, h = 0; - uint8_t *buf = p->payload; - uint16_t buflen = p->payload_len; - int matches = 0; - for (i = 0; i < no_of_matches[0]; i++) { - h = B2G_CUDA_HASH16(u8_tolower(buf[host_offsets[i] + ctx->m - 2]), - u8_tolower(buf[host_offsets[i] + ctx->m - 1])); - - if (ctx->bloom[h] != NULL) { - COUNT(tctx->stat_pminlen_calls++); - COUNT(tctx->stat_pminlen_total+=ctx->pminlen[h]); - - if ((buflen - host_offsets[i]) < ctx->pminlen[h]) { - continue; - } else { - COUNT(tctx->stat_bloom_calls++); - - if (BloomFilterTest(ctx->bloom[h], buf + host_offsets[i], ctx->pminlen[h]) == 0) { - COUNT(tctx->stat_bloom_hits++); - - continue; - } - } - } - - B2gCudaHashItem *hi = ctx->hash[h], *thi; - for (thi = hi; thi != NULL; thi = thi->nxt) { - COUNT(tctx->stat_d0_hashloop++); - B2gCudaPattern *p = ctx->parray[thi->idx]; - - if (p->flags & MPM_PATTERN_FLAG_NOCASE) { - if ((buflen - host_offsets[i]) < p->len) { - continue; - } - - if (memcmp_lowercase(p->ci, buf + host_offsets[i], p->len) == 0) { - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } else { - if (buflen - host_offsets[i] < p->len) - continue; - - if (memcmp(p->cs, buf + host_offsets[i], p->len) == 0) { - COUNT(tctx->stat_loop_match++); - - matches += MpmVerifyMatch(mpm_thread_ctx, pmq, p->id); - } else { - COUNT(tctx->stat_loop_no_match++); - } - } - } - } - - return matches; -} - -/** - * \brief Registers the Cuda B2G MPM Module. - */ -void TmModuleCudaMpmB2gRegister(void) -{ - tmm_modules[TMM_CUDA_MPM_B2G].name = "Cuda_Mpm_B2g"; - tmm_modules[TMM_CUDA_MPM_B2G].ThreadInit = B2gCudaMpmDispThreadInit; - tmm_modules[TMM_CUDA_MPM_B2G].Func = B2gCudaMpmDispatcher; - tmm_modules[TMM_CUDA_MPM_B2G].ThreadExitPrintStats = NULL; - tmm_modules[TMM_CUDA_MPM_B2G].ThreadDeinit = B2gCudaMpmDispThreadDeInit; - tmm_modules[TMM_CUDA_MPM_B2G].RegisterTests = NULL; -} - -/***************************Code_Specific_To_Mpm_B2g***************************/ - -void *CudaMpmB2gThreadsSlot1(void *td) -{ - ThreadVars *tv = (ThreadVars *)td; - TmSlot *s = (TmSlot *)tv->tm_slots; - SCCudaPBPacketsBuffer *data = NULL; - B2gCudaMpmThreadCtxData *tctx = NULL; - char run = 1; - TmEcode r = TM_ECODE_OK; - - /* Set the thread name */ - SCSetThreadName(tv->name); - - if (tv->thread_setup_flags != 0) - TmThreadSetupOptions(tv); - - SCLogDebug("%s starting", tv->name); - - if (s->SlotThreadInit != NULL) { - void *slot_data = NULL; - r = s->SlotThreadInit(tv, s->slot_initdata, &slot_data); - if (r != TM_ECODE_OK) { - EngineKill(); - - TmThreadsSetFlag(tv, THV_CLOSED | THV_RUNNING_DONE); - pthread_exit((void *) -1); - } - SC_ATOMIC_SET(s->slot_data, slot_data); - } - memset(&s->slot_pre_pq, 0, sizeof(PacketQueue)); - memset(&s->slot_post_pq, 0, sizeof(PacketQueue)); - - tctx = (B2gCudaMpmThreadCtxData *)SC_ATOMIC_GET(s->slot_data); - - TmThreadsSetFlag(tv, THV_INIT_DONE); - while(run) { - TmThreadTestThreadUnPaused(tv); - - /* input data */ - data = (SCCudaPBPacketsBuffer *)TmqhInputSimpleOnQ(&data_queues[tv->inq->id]); - - if (data == NULL) { - //printf("%s: TmThreadsSlot1: p == NULL\n", tv->name); - } else { - /* We pass the current packet buffer (1) to the dispatcher function. The data queue - * is checked by the dispatcher thread if there is another packet buffer (2) ready. - * If the MPM is configured to use multiple CUstreams, buffer (1) and buffer (2) are - * processed in parallel using multiple streams; In this case - * data_queues[tctx->tmq_streamq->id] will contain the results of packet buffer (2). */ - TmSlotFunc SlotFunc = SC_ATOMIC_GET(s->SlotFunc); - r = SlotFunc(tv, - (Packet *)data, - (void *)tctx, - (PacketQueue *)&data_queues[tv->inq->id], - NULL); - /* handle error */ - - /* output the packet buffer (1) */ - TmqhOutputSimpleOnQ(&data_queues[tv->outq->id], (SCDQGenericQData *)data); - - /* output additional packet buffers (2) */ - while (data != NULL) { - data = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tctx->tmq_streamq->id]); - if (data == NULL) { - break; - } - TmqhOutputSimpleOnQ(&data_queues[tv->outq->id], (SCDQGenericQData *)data); - } - } - - if (TmThreadsCheckFlag(tv, THV_KILL)) { - run = 0; - } - } - - TmThreadsSetFlag(tv, THV_RUNNING_DONE); - TmThreadWaitForFlag(tv, THV_DEINIT); - - if (s->SlotThreadExitPrintStats != NULL) { - s->SlotThreadExitPrintStats(tv, SC_ATOMIC_GET(s->slot_data)); - } - - if (s->SlotThreadDeinit != NULL) { - r = s->SlotThreadDeinit(tv, SC_ATOMIC_GET(s->slot_data)); - if (r != TM_ECODE_OK) { - TmThreadsSetFlag(tv, THV_CLOSED); - pthread_exit((void *) -1); - } - } - - SCLogDebug("%s ending", tv->name); - TmThreadsSetFlag(tv, THV_CLOSED); - pthread_exit((void *) 0); -} - -int B2gCudaStartDispatcherThreadRC(const char *name) -{ - SCCudaHlModuleData *data = NULL; - TmModule *tm_module = NULL; - - if (name == NULL) { - SCLogError(SC_ERR_INVALID_ARGUMENTS, "Error invalid arguments. " - "name NULL"); - return -1; - } - - if (tv_CMB2_RC != NULL) { - SCLogError(SC_ERR_TM_THREADS_ERROR, "We already have this thread " - "running from b2g-cuda"); - return 0; - } - - data = SCCudaHlGetModuleData(SCCudaHlGetModuleHandle(name)); - if (data == NULL) { - SCLogDebug("Module not registered. To avail the benefits of this " - "registration facility, first register a module using " - "context using SCCudaHlRegisterModule(), after which you " - "can call this function"); - return -1; - } - - /* create the threads */ - tv_CMB2_RC = TmThreadCreate("Cuda_Mpm_B2g_RC", - "cuda_batcher_mpm_outqueue", "simple", - "cuda_batcher_mpm_inqueue", "simple", - "custom", CudaMpmB2gThreadsSlot1, 0); - if (tv_CMB2_RC == NULL) { - SCLogError(SC_ERR_TM_THREADS_ERROR, "ERROR: TmThreadsCreate failed"); - exit(EXIT_FAILURE); - } - tv_CMB2_RC->type = TVT_PPT; - tv_CMB2_RC->inq->q_type = 1; - tv_CMB2_RC->outq->q_type = 1; - - tm_module = TmModuleGetByName("Cuda_Mpm_B2g"); - if (tm_module == NULL) { - SCLogError(SC_ERR_TM_MODULES_ERROR, - "ERROR: TmModuleGetByName failed for Cuda_Mpm_B2g_RC"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_CMB2_RC, tm_module, data); - - if (TmThreadSpawn(tv_CMB2_RC) != TM_ECODE_OK) { - SCLogError(SC_ERR_TM_THREADS_ERROR, "ERROR: TmThreadSpawn failed"); - exit(EXIT_FAILURE); - } - - TmThreadContinue(tv_CMB2_RC); - - return 0; -} - -/** - * \brief Hacks for the tests. While running the tests, we sometimes need to - * kill the threads to make them pop the cuda contexts. We don't need - * these under normal running. - */ -void B2gCudaKillDispatcherThreadRC(void) -{ - if (tv_CMB2_RC == NULL) - return; - - TmThreadKillThread(tv_CMB2_RC); - TmThreadRemove(tv_CMB2_RC, tv_CMB2_RC->type); - SCFree(tv_CMB2_RC); - tv_CMB2_RC = NULL; - - return; -} - -/*********************************Unittests************************************/ - -#ifdef UNITTESTS - - -static int B2gCudaTest01(void) -{ - Packet *p = NULL; - MpmCtx mpm_ctx; - MpmThreadCtx mpm_thread_ctx; - B2gCudaCtx *ctx = NULL; - int result = 0; - int module_handle = SCCudaHlRegisterModule("B2G_CUDA_TEST"); - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(module_handle); - SCCudaPBPacketsBuffer *pb = NULL; - - /* get the cuda context and push it */ - CUcontext dummy_context; - if (SCCudaHlGetCudaContext(&dummy_context, "mpm", module_handle) == -1) { - SCLogError(SC_ERR_B2G_CUDA_ERROR, "Error getting a cuda context for the " - "module SC_RULES_CONTENT_B2G_CUDA"); - } - SCCudaCtxPushCurrent(dummy_context); - - memset(&mpm_ctx, 0, sizeof(MpmCtx)); - B2gCudaInitCtx(&mpm_ctx, module_handle); - /* pop the context before we make further calls to the mpm cuda dispatcher */ - SCCudaCtxPopCurrent(NULL); - - B2gCudaMpmThreadCtxData *tctx = NULL; - B2gCudaMpmDispThreadInit(NULL, module_data, (void *)&tctx); - - ctx = mpm_ctx.ctx; - - if (tctx->b2g_cuda_context == 0) - goto end; - if (tctx->stream_data[0].b2g_cuda_cumodule == 0) - goto end; - if (tctx->stream_data[0].b2g_cuda_search_kernel == 0) - goto end; - - if (B2gCudaAddPatternCS(&mpm_ctx, (uint8_t *)"one", 3, 0, 0, 1, 1, 0) == -1) - goto end; - - if (B2gCudaPreparePatterns(&mpm_ctx) == -1) - goto end; - B2gCudaThreadInitCtx(&mpm_ctx, &mpm_thread_ctx, 1 /* 1 pattern */); - - result = 1; - - SCCudaPBSetProfile("mpm"); - pb = SCCudaPBAllocSCCudaPBPacketsBuffer(); - SCCudaPBPacketDataForGPU *curr_packet = (SCCudaPBPacketDataForGPU *)pb->packets_buffer; - - char *string = "tone_one_one_one"; - curr_packet->m = ctx->m; - curr_packet->table = ctx->cuda_B2G; - curr_packet->payload_len = strlen(string); - memcpy(curr_packet->payload, string, strlen(string)); - - pb->nop_in_buffer = 1; - pb->packets_buffer_len = sizeof(SCCudaPBPacketDataForGPUNonPayload) + strlen(string); - pb->packets_total_payload_len = strlen(string); - pb->packets_offset_buffer[0] = 0; - pb->packets_payload_offset_buffer[0] = 0; - - p = PacketGetFromAlloc(); - if (unlikely(p == NULL)) - goto end; - pb->packets_address_buffer[0] = p; - p->payload_len = strlen(string); - - B2gCudaMpmDispatcher(NULL, (Packet *)pb, tctx, NULL, NULL); - - result &= (p->mpm_offsets[0] == 4); - result &= (p->mpm_offsets[1] == 1); - result &= (p->mpm_offsets[2] == 5); - result &= (p->mpm_offsets[3] == 9); - result &= (p->mpm_offsets[4] == 13); - - end: - SCCudaPBDeAllocSCCudaPBPacketsBuffer(pb); - B2gCudaMpmDispThreadDeInit(NULL, (void *)tctx); - B2gCudaDestroyCtx(&mpm_ctx); - B2gCudaThreadDestroyCtx(&mpm_ctx, &mpm_thread_ctx); - SCFree(p); - return result; -} - -static int B2gCudaTest02(void) -{ - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - int result = 0; - const char *strings[10] = { - "test_test_one", - "test_two_test", - "test_three_test", - "test_four_test", - "test_five_test", - "test_six_test", - "test_seven_test", - "test_eight_test", - "test_nine_test", - "test_ten_test"}; - /* don't shoot me for hardcoding the results. We will change this in - * sometime, by running a separate mpm on the cpu, and then hold - * the results in this temp buffer */ - int results[10][2] = { {0, 5}, - {0, 9}, - {0, 11}, - {0, 10}, - {0, 10}, - {0, 9}, - {0, 11}, - {0, 11}, - {0, 10}, - {0, 9} }; - Packet *p[10]; - SCCudaPBThreadCtx *pb_tctx = NULL; - - DecodeThreadVars dtv; - ThreadVars tv; - DetectEngineCtx *de_ctx = NULL; - - SCCudaPBPacketsBuffer *pb = NULL; - SCDQDataQueue *dq = NULL; - - char *inq_name = "cuda_batcher_mpm_inqueue"; - char *outq_name = "cuda_batcher_mpm_outqueue"; - - Tmq *tmq_outq = NULL; - Tmq *tmq_inq = NULL; - - uint32_t i = 0, j = 0; - - uint8_t no_of_pkts = 10; - - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - - memset(p, 0, sizeof(p)); - for (i = 0; i < no_of_pkts; i++) { - p[i] = PacketGetFromAlloc(); - if (p[i] == NULL) { - printf("error allocating memory\n"); - exit(EXIT_FAILURE); - } - DecodeEthernet(&tv, &dtv, p[i], raw_eth, sizeof(raw_eth), NULL); - } - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:1;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - SigGroupBuild(de_ctx); - - SCCudaPBSetProfile("mpm"); - SCCudaPBSetUpQueuesAndBuffers(); - - /* get the queues used by the batcher thread */ - tmq_inq = TmqGetQueueByName(inq_name); - if (tmq_inq == NULL) { - printf("tmq_inq NULL\n"); - goto end; - } - tmq_outq = TmqGetQueueByName(outq_name); - if (tmq_outq == NULL) { - printf("tmq_outq NULL\n"); - goto end; - } - - result = 1; - - /* queue state before calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - - SCCudaPBRunningTests(1); - /* init the TM thread */ - SCCudaPBThreadInit(&tv, de_ctx, (void *)&pb_tctx); - SCCudaPBSetBufferPacketThreshhold(no_of_pkts); - - /* queue state after calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - pb = pb_tctx->curr_pb; - - for (i = 0; i < no_of_pkts; i++) { - p[i]->payload = (uint8_t *)strings[i]; - p[i]->payload_len = strlen(strings[i]); - SCCudaPBBatchPackets(NULL, p[i], pb_tctx, NULL, NULL); - } - - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 1); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 8); - - result &= (pb->nop_in_buffer == no_of_pkts); - - int module_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(module_handle); - - B2gCudaMpmThreadCtxData *b2g_tctx = NULL; - B2gCudaMpmDispThreadInit(NULL, module_data, (void *)&b2g_tctx); - - if (b2g_tctx->b2g_cuda_context == 0 || - b2g_tctx->stream_data[0].b2g_cuda_cumodule == 0 || - b2g_tctx->stream_data[0].b2g_cuda_search_kernel == 0) { - result = 0; - goto end; - } - - B2gCudaMpmDispatcher(NULL, (Packet *)pb, b2g_tctx, NULL, NULL); - - for (i = 0; i < no_of_pkts; i++) { - for (j = 0; j < p[i]->mpm_offsets[0]; j++) - result &= (results[i][j] == p[i]->mpm_offsets[j + 1]); - } - - end: - for (i = 0; i < no_of_pkts; i++) { - SCFree(p[i]); - } - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx != NULL) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - SCCudaPBThreadDeInit(NULL, (void *)pb_tctx); - B2gCudaMpmDispThreadDeInit(NULL, (void *)b2g_tctx); - - return result; -} - -static int B2gCudaTest03(void) -{ - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - int result = 0; - const char *strings[10] = { - "test_test_one", - "test_two_test", - "test_three_test", - "test_four_test", - "test_five_test", - "test_six_test", - "test_seven_test", - "test_eight_test", - "test_nine_test", - "test_ten_test"}; - /* don't shoot me for hardcoding the results. We will change this in - * sometime, by having run a separate mpm on the cpu and then hold - * the results in a temp buffer */ - Packet *p[10]; - SCCudaPBThreadCtx *pb_tctx = NULL; - - DecodeThreadVars dtv; - ThreadVars tv; - DetectEngineCtx *de_ctx = NULL; - DetectEngineThreadCtx *det_ctx; - ThreadVars de_tv; - - SCCudaPBPacketsBuffer *pb = NULL; - SCDQDataQueue *dq = NULL; - - char *inq_name = "cuda_batcher_mpm_inqueue"; - char *outq_name = "cuda_batcher_mpm_outqueue"; - - Tmq *tmq_outq = NULL; - Tmq *tmq_inq = NULL; - - uint32_t i = 0, j = 0; - - uint8_t no_of_pkts = 10; - - Signature *sig = NULL; - - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - memset(&de_tv, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - for (i = 0; i < no_of_pkts; i++) { - p[i] = PacketGetFromAlloc(); - if (p[i] == NULL) { - printf("error allocating memory\n"); - exit(EXIT_FAILURE); - } - DecodeEthernet(&tv, &dtv, p[i], raw_eth, sizeof(raw_eth), NULL); - } - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:0;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = de_ctx->sig_list; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"one\"; sid:1;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"two\"; sid:2;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"three\"; sid:3;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"four\"; sid:4;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"five\"; sid:5;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"six\"; sid:6;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"seven\"; sid:7;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"eight\"; sid:8;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"nine\"; sid:9;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"ten\"; sid:10;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - - /* build the signatures */ - SigGroupBuild(de_ctx); - DetectEngineThreadCtxInit(&de_tv, (void *)de_ctx, (void *)&det_ctx); - - SCCudaPBSetProfile("mpm"); - SCCudaPBSetUpQueuesAndBuffers(); - - /* get the queues used by the batcher thread */ - tmq_inq = TmqGetQueueByName(inq_name); - if (tmq_inq == NULL) { - printf("tmq_inq NULL\n"); - goto end; - } - tmq_outq = TmqGetQueueByName(outq_name); - if (tmq_outq == NULL) { - printf("tmq_outq NULL\n"); - goto end; - } - - result = 1; - - /* queue state before calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - - SCCudaPBRunningTests(1); - /* init the TM thread */ - SCCudaPBThreadInit(&tv, de_ctx, (void *)&pb_tctx); - SCCudaPBSetBufferPacketThreshhold(no_of_pkts); - - /* queue state after calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - pb = pb_tctx->curr_pb; - - for (i = 0; i < no_of_pkts; i++) { - p[i]->payload = (uint8_t *)strings[i]; - p[i]->payload_len = strlen(strings[i]); - SCCudaPBBatchPackets(NULL, p[i], pb_tctx, NULL, NULL); - } - - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 1); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 8); - - result &= (pb->nop_in_buffer == no_of_pkts); - - int module_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(module_handle); - - B2gCudaMpmThreadCtxData *b2g_tctx = NULL; - B2gCudaMpmDispThreadInit(NULL, module_data, (void *)&b2g_tctx); - - if (b2g_tctx->b2g_cuda_context == 0 || - b2g_tctx->stream_data[0].b2g_cuda_cumodule == 0 || - b2g_tctx->stream_data[0].b2g_cuda_search_kernel == 0) { - result = 0; - goto end; - } - - B2gCudaMpmDispatcher(NULL, (Packet *)pb, b2g_tctx, NULL, NULL); - - for (i = 0; i < 10; i++) - SigMatchSignatures(&de_tv, de_ctx, det_ctx, p[i]); - - for (i = 0; i < 10; i++) { - if (!PacketAlertCheck(p[i], 0)) { - result = 0; - goto end; - } - for (j = 1; j <= 10; j++) { - if (j == i + 1) { - if (!PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } else { - if (PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } - } - } - - end: - for (i = 0; i < no_of_pkts; i++) { - SCFree(p[i]); - } - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - SCCudaPBThreadDeInit(NULL, (void *)pb_tctx); - B2gCudaMpmDispThreadDeInit(NULL, (void *)b2g_tctx); - - return result; -} - -static int B2gCudaTest04(void) -{ - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - - int result = 0; - const char *strings[10] = { - "test_test_one", - "test_two_test", - "test_three_test", - "test_four_test", - "test_five_test", - "test_six_test", - "test_seven_test", - "test_eight_test", - "test_nine_test", - "test_ten_test"}; - /* don't shoot me for hardcoding the results. We will change this in - * sometime, by having run a separate mpm on the cpu and then hold - * the results in a temp buffer */ - - const uint16_t max_pkts_in_buffer = 5; - const uint16_t no_of_pkts = max_pkts_in_buffer * 2; - - Packet *p[no_of_pkts]; - SCCudaPBThreadCtx *pb_tctx = NULL; - - DecodeThreadVars dtv; - ThreadVars tv; - DetectEngineCtx *de_ctx = NULL; - DetectEngineThreadCtx *det_ctx; - ThreadVars de_tv; - - SCCudaPBPacketsBuffer *pb = NULL; - SCDQDataQueue *dq = NULL; - - char *inq_name = "cuda_batcher_mpm_inqueue"; - char *outq_name = "cuda_batcher_mpm_outqueue"; - - Tmq *tmq_outq = NULL; - Tmq *tmq_inq = NULL; - - uint32_t i = 0, j = 0; - - Signature *sig = NULL; - - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - memset(&de_tv, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - for (i = 0; i < no_of_pkts; i++) { - p[i] = SCMalloc(sizeof(Packet)); - if (p[i] == NULL) { - printf("error allocating memory\n"); - exit(EXIT_FAILURE); - } - memset(p[i], 0, sizeof(Packet)); - p[i]->pkt = (uint8_t *)(p[i] + 1); - DecodeEthernet(&tv, &dtv, p[i], raw_eth, sizeof(raw_eth), NULL); - } - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:0;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = de_ctx->sig_list; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"one\"; sid:1;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"two\"; sid:2;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"three\"; sid:3;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"four\"; sid:4;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"five\"; sid:5;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"six\"; sid:6;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"seven\"; sid:7;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"eight\"; sid:8;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"nine\"; sid:9;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"ten\"; sid:10;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - - /* build the signatures */ - SigGroupBuild(de_ctx); - DetectEngineThreadCtxInit(&de_tv, (void *)de_ctx, (void *)&det_ctx); - - SCCudaPBSetProfile("mpm"); - SCCudaPBSetUpQueuesAndBuffers(); - - /* get the queues used by the batcher thread */ - tmq_inq = TmqGetQueueByName(inq_name); - if (tmq_inq == NULL) { - printf("tmq_inq NULL\n"); - goto end; - } - tmq_outq = TmqGetQueueByName(outq_name); - if (tmq_outq == NULL) { - printf("tmq_outq NULL\n"); - goto end; - } - - result = 1; - - /* queue state before calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - - SCCudaPBRunningTests(1); - /* init the TM thread */ - SCCudaPBThreadInit(&tv, de_ctx, (void *)&pb_tctx); - SCCudaPBSetBufferPacketThreshhold(max_pkts_in_buffer); - - /* queue state after calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - for (i = 0; i < no_of_pkts; i++) { - p[i]->payload = (uint8_t *)strings[i]; - p[i]->payload_len = strlen(strings[i]); - SCCudaPBBatchPackets(NULL, p[i], pb_tctx, NULL, NULL); - } - - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 2); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 7); - - int module_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(module_handle); - - B2gCudaMpmThreadCtxData *b2g_tctx = NULL; - B2gCudaMpmDispThreadInit(NULL, module_data, (void *)&b2g_tctx); - - if (b2g_tctx->no_of_streams < 2) { - printf("At least 2 cuda streams needed for this test. Skipping ..\n"); - goto end; - } - - if (b2g_tctx->b2g_cuda_context == 0 || - b2g_tctx->stream_data[0].b2g_cuda_cumodule == 0 || - b2g_tctx->stream_data[0].b2g_cuda_search_kernel == 0) { - result = 0; - goto end; - } - - SCCudaCtxSynchronize(); - - /* Run the dispatcher function. */ - pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tmq_outq->id]); - if (pb == NULL) { - SCLogError(SC_ERR_INVALID_VALUE, "PacketBuffer should not be empty"); - result = 0; - } - result &= (pb->nop_in_buffer == max_pkts_in_buffer); - B2gCudaMpmDispatcher(NULL, (Packet *)pb, b2g_tctx, (PacketQueue *)&data_queues[tmq_outq->id], NULL); - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - if (data_queues[b2g_tctx->tmq_streamq->id].len != 1) { - result = 0; - } - while ((pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[b2g_tctx->tmq_streamq->id])) != NULL) { - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - } - if (data_queues[b2g_tctx->tmq_streamq->id].len != 0) { - result = 0; - } - - for (i = 0; i < no_of_pkts; i++) - SigMatchSignatures(&de_tv, de_ctx, det_ctx, p[i]); - for (i = 0; i < no_of_pkts; i++) { - if (!PacketAlertCheck(p[i], 0)) { - result = 0; - goto end; - } - for (j = 1; j <= 10; j++) { - if (j == i + 1) { - if (!PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } else { - if (PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } - } - } - - end: - for (i = 0; i < no_of_pkts; i++) { - SCFree(p[i]); - } - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - SCCudaPBThreadDeInit(NULL, (void *)pb_tctx); - B2gCudaMpmDispThreadDeInit(NULL, (void *)b2g_tctx); - - return result; -} - -static int B2gCudaTest05(void) -{ - uint8_t raw_eth[] = { - 0x00, 0x25, 0x00, 0x9e, 0xfa, 0xfe, 0x00, 0x02, - 0xcf, 0x74, 0xfe, 0xe1, 0x08, 0x00, 0x45, 0x00, - 0x01, 0xcc, 0xcb, 0x91, 0x00, 0x00, 0x34, 0x06, - 0xdf, 0xa8, 0xd1, 0x55, 0xe3, 0x67, 0xc0, 0xa8, - 0x64, 0x8c, 0x00, 0x50, 0xc0, 0xb7, 0xd1, 0x11, - 0xed, 0x63, 0x81, 0xa9, 0x9a, 0x05, 0x80, 0x18, - 0x00, 0x75, 0x0a, 0xdd, 0x00, 0x00, 0x01, 0x01, - 0x08, 0x0a, 0x09, 0x8a, 0x06, 0xd0, 0x12, 0x21, - 0x2a, 0x3b, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x20, 0x33, 0x30, 0x32, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x0d, 0x0a, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x0d, 0x0a, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x3a, 0x20, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x0d, 0x0a, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, - 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, - 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, - 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x31, 0x34, 0x20, 0x53, 0x65, 0x70, - 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x30, 0x38, - 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x31, 0x20, 0x47, - 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x3a, 0x20, 0x67, 0x77, 0x73, 0x0d, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, - 0x20, 0x32, 0x31, 0x38, 0x0d, 0x0a, 0x0d, 0x0a, - 0x3c, 0x48, 0x54, 0x4d, 0x4c, 0x3e, 0x3c, 0x48, - 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x6d, 0x65, 0x74, - 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, - 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, - 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, - 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, - 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x33, 0x30, - 0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x3c, - 0x2f, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x3e, 0x3c, - 0x2f, 0x48, 0x45, 0x41, 0x44, 0x3e, 0x3c, 0x42, - 0x4f, 0x44, 0x59, 0x3e, 0x0a, 0x3c, 0x48, 0x31, - 0x3e, 0x33, 0x30, 0x32, 0x20, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x3c, 0x2f, 0x48, 0x31, 0x3e, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x0a, 0x3c, - 0x41, 0x20, 0x48, 0x52, 0x45, 0x46, 0x3d, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x65, 0x73, 0x2f, 0x22, 0x3e, 0x68, - 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x41, 0x3e, 0x2e, - 0x0d, 0x0a, 0x3c, 0x2f, 0x42, 0x4f, 0x44, 0x59, - 0x3e, 0x3c, 0x2f, 0x48, 0x54, 0x4d, 0x4c, 0x3e, - 0x0d, 0x0a }; - - - int result = 0; - const char *strings[10] = { - "test_test_one", - "test_two_test", - "test_three_test", - "test_four_test", - "test_five_test", - "test_six_test", - "test_seven_test", - "test_eight_test", - "test_nine_test", - "test_ten_test"}; - /* don't shoot me for hardcoding the results. We will change this in - * sometime, by having run a separate mpm on the cpu and then hold - * the results in a temp buffer */ - - const uint16_t max_pkts_in_buffer = 300; - const uint16_t no_of_pkts = max_pkts_in_buffer * 4; - uint16_t max_runs = 2; - - Packet *p[no_of_pkts]; - SCCudaPBThreadCtx *pb_tctx = NULL; - - DecodeThreadVars dtv; - ThreadVars tv; - DetectEngineCtx *de_ctx = NULL; - DetectEngineThreadCtx *det_ctx; - ThreadVars de_tv; - - SCCudaPBPacketsBuffer *pb = NULL; - SCCudaPBPacketsBuffer *pb2 = NULL; - SCDQDataQueue *dq = NULL; - - char *inq_name = "cuda_batcher_mpm_inqueue"; - char *outq_name = "cuda_batcher_mpm_outqueue"; - - Tmq *tmq_outq = NULL; - Tmq *tmq_inq = NULL; - - uint32_t i = 0, j = 0; - - Signature *sig = NULL; - - memset(&dtv, 0, sizeof(DecodeThreadVars)); - memset(&tv, 0, sizeof(ThreadVars)); - memset(&de_tv, 0, sizeof(ThreadVars)); - - FlowInitConfig(FLOW_QUIET); - for (i = 0; i < no_of_pkts; i++) { - p[i] = SCMalloc(sizeof(Packet)); - if (p[i] == NULL) { - printf("error allocating memory\n"); - exit(EXIT_FAILURE); - } - memset(p[i], 0, sizeof(Packet)); - p[i]->pkt = (uint8_t *)(p[i] + 1); - DecodeEthernet(&tv, &dtv, p[i], raw_eth, sizeof(raw_eth), NULL); - } - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) { - goto end; - } - de_ctx->mpm_matcher = MPM_B2G_CUDA; - de_ctx->flags |= DE_QUIET; - - de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"test\"; sid:0;)"); - if (de_ctx->sig_list == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = de_ctx->sig_list; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"one\"; sid:1;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"two\"; sid:2;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"three\"; sid:3;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"four\"; sid:4;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"five\"; sid:5;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"six\"; sid:6;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"seven\"; sid:7;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"eight\"; sid:8;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"nine\"; sid:9;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - sig = sig->next; - - sig->next = SigInit(de_ctx, "alert tcp any any -> any any (msg:\"Bamboo\"; " - "content:\"ten\"; sid:10;)"); - if (sig->next == NULL) { - printf("signature parsing failed\n"); - goto end; - } - - /* build the signatures */ - SigGroupBuild(de_ctx); - DetectEngineThreadCtxInit(&de_tv, (void *)de_ctx, (void *)&det_ctx); - - SCCudaPBSetProfile("mpm"); - SCCudaPBSetUpQueuesAndBuffers(); - - /* get the queues used by the batcher thread */ - tmq_inq = TmqGetQueueByName(inq_name); - if (tmq_inq == NULL) { - printf("tmq_inq NULL\n"); - goto end; - } - tmq_outq = TmqGetQueueByName(outq_name); - if (tmq_outq == NULL) { - printf("tmq_outq NULL\n"); - goto end; - } - - result = 1; - - /* queue state before calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 10); - - SCCudaPBRunningTests(1); - /* init the TM thread */ - SCCudaPBThreadInit(&tv, de_ctx, (void *)&pb_tctx); - SCCudaPBSetBufferPacketThreshhold(max_pkts_in_buffer); - - /* queue state after calling the thread init function */ - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 0); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 9); - - int module_handle = SCCudaHlRegisterModule("SC_RULES_CONTENT_B2G_CUDA"); - SCCudaHlModuleData *module_data = SCCudaHlGetModuleData(module_handle); - - B2gCudaMpmThreadCtxData *b2g_tctx = NULL; - B2gCudaMpmDispThreadInit(NULL, module_data, (void *)&b2g_tctx); - - if (b2g_tctx->no_of_streams < 2) { - printf("At least 2 cuda streams needed for this test. Skipping ..\n"); - goto end; - } - - if (b2g_tctx->b2g_cuda_context == 0 || - b2g_tctx->stream_data[0].b2g_cuda_cumodule == 0 || - b2g_tctx->stream_data[0].b2g_cuda_search_kernel == 0) { - result = 0; - goto end; - } - - uint64_t start_ = 0; - uint64_t stop_ = 0; - uint64_t time_nostream_ = 0; - uint64_t time_stream_ = 0; - - SCCudaCtxSynchronize(); - - /* Benchmark the dispatcher function. */ - int run = 0; - for (run = 0; run < max_runs; ++run) { - /* Fill the packet buffers */ - for (i = 0; i < no_of_pkts; i++) { - p[i]->payload = (uint8_t *)strings[i%10]; - p[i]->payload_len = strlen(strings[i%10]); - SCCudaPBBatchPackets(NULL, p[i], pb_tctx, NULL, NULL); - } - - dq = &data_queues[tmq_outq->id]; - result &= (dq->len == 4); - dq = &data_queues[tmq_inq->id]; - result &= (dq->len == 5); - - /* Performance test with two separate calls */ - pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tmq_outq->id]); - pb2 = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tmq_outq->id]); - if (pb == NULL || pb2 == NULL) { - SCLogError(SC_ERR_INVALID_VALUE, "PacketBuffer should not be empty"); - result = 0; - } - result &= (pb->nop_in_buffer == max_pkts_in_buffer); - result &= (pb2->nop_in_buffer == max_pkts_in_buffer); - start_ = UtilCpuGetTicks(); - B2gCudaMpmDispatcher(NULL, (Packet *)pb, b2g_tctx, (PacketQueue *)NULL, (PacketQueue *)NULL); - B2gCudaMpmDispatcher(NULL, (Packet *)pb2, b2g_tctx, (PacketQueue *)NULL, (PacketQueue *)NULL); - stop_ = UtilCpuGetTicks(); - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb2); - time_nostream_ += stop_ - start_; - - /* Performance test with one call using streams */ - pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[tmq_outq->id]); - if (pb == NULL) { - SCLogError(SC_ERR_INVALID_VALUE, "PacketBuffer should not be empty"); - result = 0; - } - result &= (pb->nop_in_buffer == max_pkts_in_buffer); - result &= (pb2->nop_in_buffer == max_pkts_in_buffer); - start_ = UtilCpuGetTicks(); - B2gCudaMpmDispatcher(NULL, (Packet *)pb, b2g_tctx, (PacketQueue *)&data_queues[tmq_outq->id], NULL); - stop_ = UtilCpuGetTicks(); - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - while ((pb = (SCCudaPBPacketsBuffer *)SCDQDataDequeue(&data_queues[b2g_tctx->tmq_streamq->id])) != NULL) { - TmqhOutputSimpleOnQ(&data_queues[tmq_inq->id], (SCDQGenericQData *)pb); - } - time_stream_ += stop_ - start_; - } - - printf("Avg CPU ticks without stream after %i runs: %"PRIu64"\n", run, time_nostream_/run); - printf("Avg CPU ticks with 2 streams after %i runs: %"PRIu64"\n", run, time_stream_/run); - - for (i = 0; i < no_of_pkts; i++) - SigMatchSignatures(&de_tv, de_ctx, det_ctx, p[i]); - for (i = 0; i < no_of_pkts; i++) { - if (!PacketAlertCheck(p[i], 0)) { - result = 0; - goto end; - } - for (j = 1; j <= 10; j++) { - if (j == i%10 + 1) { - if (!PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } else { - if (PacketAlertCheck(p[i], j)) { - result = 0; - goto end; - } - } - } - } - - end: - for (i = 0; i < no_of_pkts; i++) { - SCFree(p[i]); - } - SCCudaPBCleanUpQueuesAndBuffers(); - if (de_ctx) { - SigGroupCleanup(de_ctx); - SigCleanSignatures(de_ctx); - DetectEngineCtxFree(de_ctx); - } - SCCudaPBThreadDeInit(NULL, (void *)pb_tctx); - B2gCudaMpmDispThreadDeInit(NULL, (void *)b2g_tctx); - - return result; -} - -#endif /* UNITTESTS */ - -/*********************************Unittests************************************/ - -void B2gCudaRegisterTests(void) -{ -#ifdef UNITTESTS - UtRegisterTest("B2gCudaTest01", B2gCudaTest01, 1); - UtRegisterTest("B2gCudaTest02", B2gCudaTest02, 1); - UtRegisterTest("B2gCudaTest03", B2gCudaTest03, 1); - UtRegisterTest("B2gCudaTest04", B2gCudaTest04, 1); - UtRegisterTest("B2gCudaTest05", B2gCudaTest05, 1); -#endif /* UNITTESTS */ -} - -#endif /* __SC_CUDA_SUPPORT */ diff --git a/src/util-mpm-b2g-cuda.h b/src/util-mpm-b2g-cuda.h deleted file mode 100644 index 6281bfba2e..0000000000 --- a/src/util-mpm-b2g-cuda.h +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright (C) 2007-2010 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Victor Julien - * \author Anoop Saldanha - * \author Martin Beyer - */ - -#ifndef __UTIL_MPM_B2G_CUDA_H__ -#define __UTIL_MPM_B2G_CUDA_H__ - -#ifdef __SC_CUDA_SUPPORT__ - -#include -#include "decode.h" -#include "util-mpm.h" -#include "util-bloomfilter.h" - -#define B2G_CUDA_HASHSHIFT 4 -#define B2G_CUDA_TYPE uint32_t -#define B2G_CUDA_WORD_SIZE 32 -#define B2G_CUDA_Q 2 - -#define B2G_CUDA_HASH16(a, b) (((a) << B2G_CUDA_HASHSHIFT) | (b)) - -#define B2G_CUDA_SEARCHFUNC B2gCudaSearchBNDMq -#define B2G_CUDA_SEARCHFUNC_NAME "B2gCudaSearchBNDMq" - -typedef struct B2gCudaPattern_ { - uint8_t flags; - /** \todo we're limited to 32/64 byte lengths, uint8_t would be fine here */ - uint16_t len; - /* case sensitive */ - uint8_t *cs; - /* case INsensitive */ - uint8_t *ci; - struct B2gCudaPattern_ *next; - uint32_t id; - uint8_t *original_pat; -} B2gCudaPattern; - -typedef struct B2gCudaHashItem_ { - uint16_t idx; - uint8_t flags; - struct B2gCudaHashItem_ *nxt; -} B2gCudaHashItem; - -typedef struct B2gCudaCtx_ { - /* unique handle given by the cuda-handlers API, which indicates the module - * in the engine that is holding this B2g_Cuda_Ctx */ - int module_handle; - - /* cuda device pointer to B2gCudaCtx->B2G */ - CUdeviceptr cuda_B2G; - - B2G_CUDA_TYPE *B2G; - B2G_CUDA_TYPE m; - BloomFilter **bloom; - /* array containing the minimal length of the patters in a hash bucket. - * Used for the BloomFilter. */ - uint8_t *pminlen; - /* pattern arrays */ - B2gCudaPattern **parray; - - uint16_t pat_1_cnt; -#ifdef B2G_CUDA_SEARCH2 - uint16_t pat_2_cnt; -#endif - uint16_t pat_x_cnt; - - uint32_t hash_size; - B2gCudaHashItem **hash; - B2gCudaHashItem hash1[256]; -#ifdef B2G_CUDA_SEARCH2 - B2gCudaHashItem **hash2; -#endif - - /* hash used during ctx initialization */ - B2gCudaPattern **init_hash; - - uint8_t s0; - - /* we store our own multi byte search func ptr here for B2gCudaSearch1 */ - uint32_t (*Search)(struct MpmCtx_ *, struct MpmThreadCtx_ *, - PatternMatcherQueue *, uint8_t *, uint16_t); - - /* we store our own multi byte search func ptr here for B2gCudaSearch2 */ - uint32_t (*MBSearch2)(struct MpmCtx_ *, struct MpmThreadCtx_ *, - PatternMatcherQueue *, uint8_t *, uint16_t); - uint32_t (*MBSearch)(struct MpmCtx_ *, struct MpmThreadCtx_ *, - PatternMatcherQueue *, uint8_t *, uint16_t); -} B2gCudaCtx; - -typedef struct B2gCudaThreadCtx_ { -#ifdef B2G_CUDA_COUNTERS - uint32_t stat_pminlen_calls; - uint32_t stat_pminlen_total; - uint32_t stat_bloom_calls; - uint32_t stat_bloom_hits; - uint32_t stat_calls; - uint32_t stat_m_total; - uint32_t stat_d0; - uint32_t stat_d0_hashloop; - uint32_t stat_loop_match; - uint32_t stat_loop_no_match; - uint32_t stat_num_shift; - uint32_t stat_total_shift; -#endif /* B2G_CUDA_COUNTERS */ -} B2gCudaThreadCtx; - -void MpmB2gCudaRegister(void); -void TmModuleCudaMpmB2gRegister(void); - -int B2gCudaStartDispatcherThreadRC(const char *); -void B2gCudaKillDispatcherThreadRC(void); -int B2gCudaResultsPostProcessing(Packet *, MpmCtx *, MpmThreadCtx *, - PatternMatcherQueue *); -uint32_t B2gCudaSearch1(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -#ifdef B2G_CUDA_SEARCH2 -uint32_t B2gCudaSearch2(MpmCtx *, MpmThreadCtx *, PatternMatcherQueue *, - uint8_t *, uint16_t); -#endif - -#endif /* __SC_CUDA_SUPPORT__ */ - -#endif /* __UTIL_MPM_B2G_CUDA_H__ */ diff --git a/src/util-mpm.c b/src/util-mpm.c index 64a0c633d2..a8307ee8be 100644 --- a/src/util-mpm.c +++ b/src/util-mpm.c @@ -30,7 +30,6 @@ /* include pattern matchers */ #include "util-mpm-wumanber.h" #include "util-mpm-b2g.h" -#include "util-mpm-b2g-cuda.h" #include "util-mpm-b3g.h" #include "util-mpm-b2gc.h" #include "util-mpm-b2gm.h" @@ -40,7 +39,6 @@ #include "util-hashlist.h" #include "detect-engine.h" -#include "util-cuda-handlers.h" #include "util-cuda.h" #include "util-misc.h" #include "conf.h" @@ -445,9 +443,6 @@ void MpmTableSetup(void) { MpmWuManberRegister(); MpmB2gRegister(); -#ifdef __SC_CUDA_SUPPORT__ - MpmB2gCudaRegister(); -#endif MpmB3gRegister(); MpmB2gcRegister(); MpmB2gmRegister(); @@ -512,765 +507,9 @@ uint32_t MpmGetBloomSize(const char *conf_val) SCReturnInt(bloom_value); } - -#ifdef __SC_CUDA_SUPPORT__ - -/** - * \brief Parse the "mpm" profile under the cuda subsection of our conf file. - * - * \retval profile Pointer to a struct containing the parsed data. - */ -MpmCudaConf *MpmCudaConfParse(void) -{ - ConfNode *cuda_node = NULL; - ConfNode *seq_node = NULL; - - MpmCudaConf *profile = NULL; - - const char *packet_buffer_limit = NULL; - const char *packet_size_limit = NULL; - const char *packet_buffers = NULL; - const char *batching_timeout = NULL; - const char *page_locked = NULL; - const char *device_id = NULL; - const char *cuda_streams = NULL; - - if ((profile = SCMalloc(sizeof(MpmCudaConf))) == NULL) { - SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory"); - exit(EXIT_FAILURE); - } - memset(profile, 0, sizeof(MpmCudaConf)); - profile->packet_buffer_limit = MPM_PACKET_BUFFER_LIMIT; - profile->packet_size_limit = MPM_PACKET_SIZE_LIMIT; - profile->packet_buffers = MPM_PACKET_BUFFERS; - profile->batching_timeout = MPM_BATCHING_TIMEOUT; - profile->page_locked = MPM_PAGE_LOCKED; - profile->device_id = SC_CUDA_DEFAULT_DEVICE; - profile->cuda_streams = MPM_CUDA_STREAMS; - - cuda_node = ConfGetNode("cuda"); - if (cuda_node == NULL) { - SCLogInfo("No conf found for \"cuda\" in yaml file. Use default conf"); - goto end; - } - - TAILQ_FOREACH(seq_node, &cuda_node->head, next) { - if (strcasecmp(seq_node->val, "mpm") == 0) { - packet_buffer_limit = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "packet-buffer-limit"); - packet_size_limit = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "packet-size-limit"); - packet_buffers = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "packet-buffers"); - batching_timeout = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "batching-timeout"); - page_locked = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "page-locked"); - device_id = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "device-id"); - cuda_streams = ConfNodeLookupChildValue - (seq_node->head.tqh_first, "cuda-streams"); - - /* packet_buffer_size */ - if (packet_buffer_limit == NULL || strcasecmp(packet_buffer_limit, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_buffer_limit. Either NULL or empty"); - } else { - profile->packet_buffer_limit = atoi(packet_buffer_limit); - if (profile->packet_buffer_limit <= 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_buffer_limit - %s", packet_buffer_limit); - profile->packet_buffer_limit = MPM_PACKET_BUFFER_LIMIT; - } - } - - /* packet_size_limit */ - if (packet_size_limit == NULL || strcasecmp(packet_size_limit, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_size_limit. Either NULL or empty"); - } else { - if (ParseSizeStringU16(packet_size_limit, &profile->packet_size_limit) < 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_size_limit - %s", packet_size_limit); - exit(EXIT_FAILURE); - } - - if (profile->packet_size_limit <= 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_size_limit - %s", packet_size_limit); - profile->packet_size_limit = MPM_PACKET_SIZE_LIMIT; - } - } - - /* packet_buffers */ - if (packet_buffers == NULL || strcasecmp(packet_buffers, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_buffers. Either NULL or empty"); - } else { - profile->packet_buffers = atoi(packet_buffers); - if (profile->packet_buffers <= 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.packet_buffers - %s", packet_buffers); - profile->packet_buffers = MPM_PACKET_BUFFERS; - } - } - - /* batching_timeout */ - if (batching_timeout == NULL || strcasecmp(batching_timeout, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.batching_timeout. Either NULL or empty"); - } else { - profile->batching_timeout = atof(batching_timeout); - if (profile->batching_timeout < 0.000001) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.batching_timeout - %s", batching_timeout); - profile->batching_timeout = MPM_BATCHING_TIMEOUT; - } - } - - /* page_locked */ - if (page_locked == NULL || strcasecmp(page_locked, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.page_locked. Either NULL or empty"); - } else { - if (strcasecmp(page_locked, "enabled") == 0) { - profile->page_locked = MPM_PAGE_LOCKED; - } else if (strcasecmp(page_locked, "disabled") == 0) { - profile->page_locked = !MPM_PAGE_LOCKED; - } else { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.page_locked - %s", page_locked); - } - } - - /* device_id */ - if (device_id == NULL || strcasecmp(device_id, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.device_id Either NULL or empty"); - profile->device_id = SC_CUDA_DEFAULT_DEVICE; - continue; - } else { - profile->device_id = atoi(device_id); - if (profile->device_id < 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.device_id - %s", device_id); - profile->device_id = SC_CUDA_DEFAULT_DEVICE; - continue; - } - } - - /* cuda_streams */ - if (cuda_streams == NULL || strcasecmp(cuda_streams, "") == 0) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.cuda_streams Either NULL or empty"); - profile->cuda_streams = MPM_CUDA_STREAMS; - continue; - } else { - profile->cuda_streams = atoi(cuda_streams); - if (profile->cuda_streams < 1) { - SCLogError(SC_ERR_INVALID_YAML_CONF_ENTRY, "Invalid entry for " - "cuda.mpm.cuda_streams - %s", cuda_streams); - profile->cuda_streams = MPM_CUDA_STREAMS; - continue; - } - } - } /* if (strcasecmp(seq_node->val, "mpm") == 0) */ - } /* TAILQ_FOREACH(seq_node, &cuda_node->head, next) */ - - end: - SCLogDebug("Configuration for \"cuda.mpm\"\n" - "packet_buffer_size: %u\n" - "packet_size_limit: %d\n" - "packet_buffers: %d\n" - "batching_timeout: %d\n" - "page_locked: %d\n" - "device_id: %d\n", - profile->packet_buffer_limit, profile->packet_size_limit, - profile->packet_buffers, profile->batching_timeout, - profile->page_locked, profile->device_id); - - return profile; -} - -/** - * \brief Cleanup the parsed "mpm" profile cuda conf. - */ -void MpmCudaConfCleanup(MpmCudaConf *conf) -{ - if (conf != NULL) - SCFree(conf); - - return; -} - -#endif /* __SC_CUDA_SUPPORT */ - /************************************Unittests*********************************/ #ifdef UNITTESTS -#ifdef __SC_CUDA_SUPPORT__ - -static int MpmInitYamlConf(char *conf) -{ - ConfCreateContextBackup(); - ConfInit(); - return ConfYamlLoadString(conf, strlen(conf)); -} - -static void MpmDeInitYamlConf(void) -{ - ConfDeInit(); - ConfRestoreContextBackup(); - - return; -} - -static int MpmTest01(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit: 4000\n" - " packet_size_limit: 1500\n" - " packet_buffers: 10\n" - " batching_timeout: 1\n" - " page_locked: enabled\n" - " device_id: 0\n" - " cuda_streams: 2\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == 4000); - result &= (profile->packet_size_limit == 1500); - result &= (profile->packet_buffers == 10); - result &= (profile->batching_timeout == 1); - result &= (profile->page_locked == 1); - result &= (profile->device_id == 0); - result &= (profile->cuda_streams == 2); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest02(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit: 4001\n" - " packet_size_limit: 1500\n" - " packet_buffers: 12\n" - " batching_timeout: 10\n" - " page_locked: disabled\n" - " device_id: 5\n" - " cuda_streams: 4\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == 4001); - result &= (profile->packet_size_limit == 1500); - result &= (profile->packet_buffers == 12); - result &= (profile->batching_timeout == 10); - result &= (profile->page_locked == 0); - result &= (profile->device_id == 5); - result &= (profile->cuda_streams == 4); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest03(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit: 0\n" - " packet_size_limit: 0\n" - " packet_buffers: 0\n" - " batching_timeout: 0\n" - " page_locked: enbled\n" - " device_id: -1\n" - " cuda_streams: -1\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest04(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit: -1\n" - " packet_size_limit: -1\n" - " packet_buffers: -1\n" - " batching_timeout: -1\n" - " page_locked: enbled\n" - " device_id: -1\n" - " cuda_streams: -1\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest05(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit:\n" - " packet_size_limit:\n" - " packet_buffers:\n" - " batching_timeout: 2\n" - " page_locked: enabled\n" - " device_id: 1\n" - " cuda_streams: 0\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == 2); - result &= (profile->page_locked == 1); - result &= (profile->device_id == 1); - result &= (profile->cuda_streams == 0); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest06(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit: \n" - " packet_size_limit: \n" - " packet_buffers: \n" - " batching_timeout: \n" - " page_locked: \n" - " device_id: \n" - " cuda_streams: \n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest07(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_buffer_limit:\n" - " packet_size_limit:\n" - " packet_buffers:\n" - " batching_timeout:\n" - " page_locked:\n" - " device_id:\n" - " cuda_streams:\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest08(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n" - " packet_size_limit: 2000\n" - " page_locked: disabled\n" - " device_id: 4\n" - " cuda_streams: 8\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == 2000); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == !MPM_PAGE_LOCKED); - result &= (profile->device_id == 4); - result &= (profile->cuda_streams == 8); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest09(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n" - " - mpm:\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest10(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n" - "cuda:\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -static int MpmTest11(void) -{ - char *conf = - "%YAML 1.1\n" - "---\n"; - - DetectEngineCtx *de_ctx = NULL; - int result = 0; - - if (MpmInitYamlConf(conf) == -1) - return 0; - - de_ctx = DetectEngineCtxInit(); - if (de_ctx == NULL) - goto end; - - SCCudaHlBackupRegisteredProfiles(); - SCCudaHlGetYamlConf(); - MpmCudaConf *profile = SCCudaHlGetProfile("mpm"); - if (profile == NULL) { - printf("Error retrieving mpm profile\n"); - goto end; - } - - result = (profile->packet_buffer_limit == MPM_PACKET_BUFFER_LIMIT); - result &= (profile->packet_size_limit == MPM_PACKET_SIZE_LIMIT); - result &= (profile->packet_buffers == MPM_PACKET_BUFFERS); - result &= (profile->batching_timeout == MPM_BATCHING_TIMEOUT); - result &= (profile->page_locked == MPM_PAGE_LOCKED); - result &= (profile->device_id == SC_CUDA_DEFAULT_DEVICE); - result &= (profile->cuda_streams == MPM_CUDA_STREAMS); - - end: - SCCudaHlCleanProfiles(); - - if (de_ctx != NULL) - DetectEngineCtxFree(de_ctx); - MpmDeInitYamlConf(); - SCCudaHlRestoreBackupRegisteredProfiles(); - - return result; -} - -#endif /* __SC_CUDA_SUPPORT__ */ #endif /* UNITTESTS */ void MpmRegisterTests(void) { @@ -1288,19 +527,5 @@ void MpmRegisterTests(void) { } } -#ifdef __SC_CUDA_SUPPORT__ - UtRegisterTest("MpmTest01", MpmTest01, 1); - UtRegisterTest("MpmTest02", MpmTest02, 1); - UtRegisterTest("MpmTest03", MpmTest03, 1); - UtRegisterTest("MpmTest04", MpmTest04, 1); - UtRegisterTest("MpmTest05", MpmTest05, 1); - UtRegisterTest("MpmTest06", MpmTest06, 1); - UtRegisterTest("MpmTest07", MpmTest07, 1); - UtRegisterTest("MpmTest08", MpmTest08, 1); - UtRegisterTest("MpmTest09", MpmTest09, 1); - UtRegisterTest("MpmTest10", MpmTest10, 1); - UtRegisterTest("MpmTest11", MpmTest11, 1); -#endif /* __SC_CUDA_SUPPORT__ */ - #endif } diff --git a/src/util-mpm.h b/src/util-mpm.h index 3981e9b91e..1de44f2283 100644 --- a/src/util-mpm.h +++ b/src/util-mpm.h @@ -51,13 +51,6 @@ #define BLOOMSIZE_HIGH 2048 /**< High bloomfilter size for the multi pattern matcher algorithms */ -#define MPM_PACKET_BUFFER_LIMIT 2400 -#define MPM_PACKET_SIZE_LIMIT 1500 -#define MPM_PACKET_BUFFERS 10 -#define MPM_BATCHING_TIMEOUT 1 -#define MPM_PAGE_LOCKED 1 -#define MPM_CUDA_STREAMS 2 - enum { MPM_NOTSET = 0, @@ -65,9 +58,6 @@ enum { MPM_WUMANBER, /* bndmq 2 gram */ MPM_B2G, -#ifdef __SC_CUDA_SUPPORT__ - MPM_B2G_CUDA, -#endif /* bndmq 3 gram */ MPM_B3G, MPM_B2GC, @@ -194,36 +184,12 @@ MpmCtx *MpmFactoryGetMpmCtxForProfile(struct DetectEngineCtx_ *, int32_t, int); void MpmFactoryDeRegisterAllMpmCtxProfiles(struct DetectEngineCtx_ *); int32_t MpmFactoryIsMpmCtxAvailable(struct DetectEngineCtx_ *, MpmCtx *); -/* macros decides if cuda is enabled for the platform or not */ -#ifdef __SC_CUDA_SUPPORT__ - -/** - * \brief Cuda configuration for "mpm" profile. We can further extend this - * to have conf for specific mpms. For now its common for all mpms. - */ -typedef struct MpmCudaConf_ { - int32_t packet_buffer_limit; - uint16_t packet_size_limit; - int8_t packet_buffers; - double batching_timeout; - int8_t page_locked; - int8_t device_id; - int8_t cuda_streams; -} MpmCudaConf; - -#endif /* __SC_CUDA_SUPPORT__ */ - int PmqSetup(PatternMatcherQueue *, uint32_t, uint32_t); void PmqMerge(PatternMatcherQueue *src, PatternMatcherQueue *dst); void PmqReset(PatternMatcherQueue *); void PmqCleanup(PatternMatcherQueue *); void PmqFree(PatternMatcherQueue *); -#ifdef __SC_CUDA_SUPPORT__ -MpmCudaConf *MpmCudaConfParse(void); -void MpmCudaConfCleanup(MpmCudaConf *); -#endif /* __SC_CUDA_SUPPORT */ - void MpmTableSetup(void); void MpmRegisterTests(void); diff --git a/src/util-runmodes.c b/src/util-runmodes.c index 1fa9d1df3d..21dacbeeb7 100644 --- a/src/util-runmodes.c +++ b/src/util-runmodes.c @@ -32,7 +32,6 @@ #include "runmode-af-packet.h" #include "log-httplog.h" #include "output.h" -#include "cuda-packet-batcher.h" #include "detect-engine-mpm.h" #include "alert-fastlog.h" @@ -163,111 +162,6 @@ int RunModeSetLiveCaptureAuto(DetectEngineCtx *de_ctx, } } -#if defined(__SC_CUDA_SUPPORT__) - if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { - ThreadVars *tv_decode1 = - TmThreadCreatePacketHandler("Decode", - "pickup-queue", "simple", - "decode-queue1", "simple", - "1slot"); - if (tv_decode1 == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmThreadsCreate failed for Decode1"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName(decode_mod_name); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName %s failed", decode_mod_name); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_decode1, tm_module, NULL); - - TmThreadSetCPU(tv_decode1, DECODE_CPU_SET); - - if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { - SCLogError(SC_ERR_RUNMODE, "TmThreadSpawn failed"); - exit(EXIT_FAILURE); - } - - ThreadVars *tv_cuda_PB = - TmThreadCreate("CUDA_PB", - "decode-queue1", "simple", - "cuda-pb-queue1", "simple", - "custom", SCCudaPBTmThreadsSlot1, 0); - if (tv_cuda_PB == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmThreadsCreate failed for CUDA_PB"); - exit(EXIT_FAILURE); - } - tv_cuda_PB->type = TVT_PPT; - - tm_module = TmModuleGetByName("CudaPacketBatcher"); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName CudaPacketBatcher failed"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_cuda_PB, tm_module, (void *)de_ctx); - - TmThreadSetCPU(tv_cuda_PB, DETECT_CPU_SET); - - if (TmThreadSpawn(tv_cuda_PB) != TM_ECODE_OK) { - SCLogError(SC_ERR_THREAD_SPAWN, "TmThreadSpawn failed"); - exit(EXIT_FAILURE); - } - - ThreadVars *tv_stream1 = - TmThreadCreatePacketHandler("Stream1", - "cuda-pb-queue1", "simple", - "stream-queue1", "simple", - "1slot"); - if (tv_stream1 == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmThreadsCreate failed for Stream1"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName("StreamTcp"); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName StreamTcp failed"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_stream1, tm_module, NULL); - - TmThreadSetCPU(tv_stream1, STREAM_CPU_SET); - - if (TmThreadSpawn(tv_stream1) != TM_ECODE_OK) { - SCLogError(SC_ERR_THREAD_SPAWN, "TmThreadSpawn failed"); - exit(EXIT_FAILURE); - } - } else { - ThreadVars *tv_decode1 = - TmThreadCreatePacketHandler("Decode & Stream", - "pickup-queue", "simple", - "stream-queue1", "simple", - "varslot"); - if (tv_decode1 == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmThreadsCreate failed for Decode1"); - exit(EXIT_FAILURE); - } - tm_module = TmModuleGetByName(decode_mod_name); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName %s failed", decode_mod_name); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_decode1, tm_module, NULL); - - tm_module = TmModuleGetByName("StreamTcp"); - if (tm_module == NULL) { - SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName StreamTcp failed"); - exit(EXIT_FAILURE); - } - TmSlotSetFuncAppend(tv_decode1, tm_module, NULL); - - TmThreadSetCPU(tv_decode1, DECODE_CPU_SET); - - if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { - SCLogError(SC_ERR_RUNMODE, "TmThreadSpawn failed"); - exit(EXIT_FAILURE); - } - } - -#else ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode & Stream", "pickup-queue", "simple", @@ -297,7 +191,6 @@ int RunModeSetLiveCaptureAuto(DetectEngineCtx *de_ctx, SCLogError(SC_ERR_RUNMODE, "TmThreadSpawn failed"); exit(EXIT_FAILURE); } -#endif /* always create at least one thread */ int thread_max = TmThreadGetNbThreads(DETECT_CPU_SET);